/ Hex Artifact Content
Login

Artifact 18153e6fc03580e95d28fb39d47a4e8b64b36187:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
22c0: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20  int64 mmapSize; 
22d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22e0: 66 20 78 4d 72 65 6d 61 70 28 29 20 2a 2f 0a 20  f xMremap() */. 
22f0: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
2300: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2310: 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d  /* Area memory m
2320: 61 70 70 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  apped */.#endif.
2330: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2340: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2350: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2360: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2370: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2380: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
2390: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
23a0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
23b0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
23c0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
23d0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
23e0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
23f0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
2400: 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46  es for the unixF
2410: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69  ile.ctrlFlags bi
2420: 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e  tmask:.*/.#defin
2430: 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20  e UNIXFILE_EXCL 
2440: 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20         0x01     
2450: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  /* Connections f
2460: 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20  rom one process 
2470: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2480: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20  UNIXFILE_RDONLY 
2490: 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a       0x02     /*
24a0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
24b0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
24c0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  ine UNIXFILE_PER
24d0: 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20  SIST_WAL 0x04   
24e0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
24f0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e  WAL mode */.#ifn
2500: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2510: 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66  LE_DIRSYNC.# def
2520: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
2530: 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20 20  SYNC    0x08    
2540: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79   /* Directory sy
2550: 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c  nc needed */.#el
2560: 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  se.# define UNIX
2570: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
2580: 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66  0x00.#endif.#def
2590: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  ine UNIXFILE_PSO
25a0: 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20  W        0x10   
25b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
25c0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25d0: 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65  WRITE */.#define
25e0: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
25f0: 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20 2f        0x20     /
2600: 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
2610: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
2620: 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20  XFILE_URI       
2630: 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69    0x40     /* Fi
2640: 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76  lename might hav
2650: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
2660: 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  rs */.#define UN
2670: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20  IXFILE_NOLOCK   
2680: 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44     0x80     /* D
2690: 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o no file lockin
26a0: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  g */../*.** Incl
26b0: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
26c0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
26d0: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
26e0: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
26f0: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
2700: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
2710: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2720: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
2730: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
2740: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2750: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2760: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
2770: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2780: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
27c0: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
27d0: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
27e0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
27f0: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
2800: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
2810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
2820: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
2830: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
2840: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
2850: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
2860: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2870: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
2880: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2890: 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  FE.#define threa
28a0: 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66  did pthread_self
28b0: 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  ().#else.#define
28c0: 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64   threadid 0.#end
28d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72  if../*.** Differ
28e0: 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73  ent Unix systems
28f0: 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20   declare open() 
2900: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  in different way
2910: 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20  s.  Same use.** 
2920: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2930: 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f  ,int,mode_t).  O
2940: 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63  thers use open(c
2950: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e  onst char*,int,.
2960: 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..)..** The diff
2970: 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74  erence is import
2980: 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61  ant when using a
2990: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
29b0: 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74  The safest way t
29c0: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
29d0: 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c  problem is to al
29e0: 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72  ways use this wr
29f0: 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61  apper.** which a
2a00: 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61  lways has the sa
2a10: 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  me well-defined 
2a20: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
2a30: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70  atic int posixOp
2a40: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
2a50: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c  File, int flags,
2a60: 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65   int mode){.  re
2a70: 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c  turn open(zFile,
2a80: 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d   flags, mode);.}
2a90: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ../*.** On some 
2aa0: 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74  systems, calls t
2ab0: 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20  o fchown() will 
2ac0: 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67  trigger a messag
2ad0: 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a  e in a security.
2ae0: 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63  ** log if they c
2af0: 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f  ome from non-roo
2b00: 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f  t processes.  So
2b10: 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66   avoid calling f
2b20: 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65  chown() if.** we
2b30: 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67   are not running
2b40: 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61   as root..*/.sta
2b50: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63 68  tic int posixFch
2b60: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
2b70: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
2b80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65  ){.  return gete
2b90: 75 69 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f  uid() ? 0 : fcho
2ba0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
2bb0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2bc0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2bd0: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2be0: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2bf0: 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d   int*);../*.** M
2c00: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2c10: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
2c20: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
2c30: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
2c40: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
2c50: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
2c60: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
2c70: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
2c80: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
2c90: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
2ca0: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2cb0: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2cc0: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2cd0: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2ce0: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2cf0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2d00: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2d10: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
2d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2d30: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2d40: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2d50: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2d60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2d70: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
2d80: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
2d90: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2da0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2db0: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2dc0: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2dd0: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2de0: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
2df0: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
2e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e10: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
2e20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
2e30: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
2e40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2e50: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
2e60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e70: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
2e80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2e90: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
2ea0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2eb0: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
2ec0: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
2ed0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
2ee0: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
2ef0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2f00: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
2f10: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2f20: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
2f30: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2f40: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
2f50: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
2f60: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
2f70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2f80: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
2f90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2fa0: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
2fb0: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
2fc0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2fd0: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
2fe0: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
2ff0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3000: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
3010: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3020: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
3030: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3040: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
3050: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
3060: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
3070: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
3080: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
3090: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
30a0: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
30b0: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
30c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
30d0: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
30e0: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
30f0: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
3100: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
3110: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
3120: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
3130: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
3140: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
3150: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
3160: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
3170: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
3180: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3190: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
31a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
31b0: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
31c0: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
31d0: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
31e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
31f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
3200: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3210: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
3220: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
3230: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
3240: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3250: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
3260: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
3270: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3280: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
3290: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
32a0: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
32b0: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
32c0: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
32d0: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
32e0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
32f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
3300: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
3310: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
3320: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3330: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
3340: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
3350: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
3360: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3370: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
3380: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3390: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
33a0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
33b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
33c0: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
33d0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
33e0: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
33f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3400: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3410: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
3420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3430: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
3440: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3450: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
3460: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3470: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3480: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3490: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
34a0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
34b0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
34c0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34d0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
34e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
34f0: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
3500: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
3510: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3520: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
3530: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
3540: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
3550: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3560: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3570: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3580: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
3590: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
35a0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
35b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
35c0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
35d0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
35e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
35f0: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
3600: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3610: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
3620: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3630: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
3640: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
3650: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3660: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
3670: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
3680: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
3690: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
36a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
36b0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
36c0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
36d0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
36e0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
36f0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3700: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3710: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3720: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3730: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3740: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3760: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
3770: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3780: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3790: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
37a0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
37b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
37c0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
37d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
37e0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
37f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3800: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3810: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3820: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
3830: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3840: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3850: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3870: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3880: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3890: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
38a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
38b0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
38c0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
38d0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
38e0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
38f0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
3900: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
3910: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3920: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3930: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3940: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3950: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3960: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
3970: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
3980: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
3990: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
39a0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
39c0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
39d0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
39e0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
39f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3a00: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
3a10: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
3a20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3a30: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
3a40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3a50: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
3a60: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3a70: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3a80: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
3a90: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
3aa0: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
3ab0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
3ac0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
3ad0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3ae0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
3af0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3b00: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
3b10: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
3b20: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
3b30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3b40: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
3b50: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3b60: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
3b70: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3b80: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
3b90: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3ba0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3bb0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
3bc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bd0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
3be0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bf0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
3c00: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3c10: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
3c20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c30: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
3c40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c50: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
3c60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c70: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
3c80: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
3c90: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
3ca0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3cb0: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
3cc0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
3cd0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
3ce0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
3cf0: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
3d00: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
3d10: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
3d20: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
3d30: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
3d40: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
3d50: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
3d60: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
3d70: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
3d80: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
3d90: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
3da0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
3db0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
3dc0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
3dd0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
3de0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
3df0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
3e00: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
3e10: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
3e20: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
3e30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3e40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
3e50: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
3e60: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
3e70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3e80: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
3e90: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
3ea0: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
3eb0: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
3ec0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
3ed0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3ee0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
3ef0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3f00: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
3f10: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
3f20: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
3f30: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
3f40: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
3f50: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
3f60: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
3f70: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
3f80: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
3f90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3fa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
3fb0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
3fc0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
3fd0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
3fe0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
3ff0: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
4000: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
4010: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
4020: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
4030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4040: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4050: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
4060: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
4070: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
4080: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
4090: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
40a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
40b0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
40c0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
40d0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
40e0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
40f0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
4100: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
4110: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
4120: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
4130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4140: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4150: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
4160: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
4170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4180: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4190: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
41a0: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
41b0: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
41c0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
41d0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
41e0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
41f0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
4200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4230: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
4240: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
4250: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
4260: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
4270: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
4280: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
4290: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
42a0: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
42b0: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
42c0: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
42d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
42e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
42f0: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
4300: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
4310: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
4320: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
4330: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
4340: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
4350: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
4360: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4370: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4380: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4390: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
43a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
43b0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
43c0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
43d0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
43e0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
43f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4400: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
4410: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
4420: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
4430: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
4440: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
4450: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4460: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
4470: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
4480: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
4490: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
44a0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
44b0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
44c0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
44d0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
44e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
44f0: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
4500: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
4510: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
4520: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
4530: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
4540: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4550: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
4560: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4570: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
4580: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
4590: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
45a0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
45b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
45c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
45d0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
45e0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
45f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
4600: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4610: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
4620: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4630: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
4640: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
4650: 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73  ke open().  Do s
4660: 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  o multiple times
4670: 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65  , until it eithe
4680: 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a  r succeeds or.**
4690: 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20   fails for some 
46a0: 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61  reason other tha
46b0: 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49  n EINTR..**.** I
46c0: 66 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74  f the file creat
46d0: 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20  ion mode "m" is 
46e0: 30 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  0 then set it to
46f0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
4700: 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65  .** SQLite.  The
4710: 20 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49   default is SQLI
4720: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
4730: 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72  PERMISSIONS (nor
4740: 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61  mally.** 0644) a
4750: 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  s modified by th
4760: 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20  e system umask. 
4770: 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20   If m is not 0, 
4780: 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65  then.** make the
4790: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
47a0: 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d  ode be exactly m
47b0: 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d   ignoring the um
47c0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ask..**.** The m
47d0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20   parameter will 
47e0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79  be non-zero only
47f0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d   when creating -
4800: 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  wal, -journal,.*
4810: 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73  * and -shm files
4820: 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65  .  We want those
4830: 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a   files to have *
4840: 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d  exactly* the sam
4850: 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73  e.** permissions
4860: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
4870: 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61  al database, una
4880: 64 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68  dulterated by th
4890: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74  e umask..** In t
48a0: 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61  hat way, if a da
48b0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d  tabase file is -
48c0: 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d  rw-rw-rw or -rw-
48d0: 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20  rw-r-, and a.** 
48e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73  transaction cras
48f0: 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62  hes and leaves b
4900: 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61  ehind hot journa
4910: 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  ls, then any.** 
4920: 70 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20  process that is 
4930: 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  able to write to
4940: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
4950: 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20  ll also be able 
4960: 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68  to.** recover th
4970: 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  e hot journals..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
4990: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
49a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
49b0: 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74  mode_t m){.  int
49c0: 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32   fd;.  mode_t m2
49d0: 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54   = m ? m : SQLIT
49e0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
49f0: 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 64 6f  ERMISSIONS;.  do
4a00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4a10: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4a20: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4a30: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4a40: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4a50: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4a60: 66 0a 20 20 7d 77 68 69 6c 65 28 20 66 64 3c 30  f.  }while( fd<0
4a70: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4a80: 20 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20   );.  if( fd>=0 
4a90: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
4aa0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
4ab0: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
4ac0: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
4ad0: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
4ae0: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
4af0: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
4b00: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
4b10: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
4b20: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
4b30: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
4b40: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
4b50: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
4b60: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
4b70: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
4b80: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
4b90: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
4ba0: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
4bb0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
4bc0: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
4bd0: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
4be0: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
4bf0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
4c00: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
4c10: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
4c20: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
4c30: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
4c40: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
4c50: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
4c60: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
4c70: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
4c80: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
4c90: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
4ca0: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
4cb0: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
4cc0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
4cd0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
4ce0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
4cf0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
4d00: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
4d10: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
4d20: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
4d30: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
4d40: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
4d50: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
4d60: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
4d70: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
4d80: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
4d90: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
4da0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
4db0: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
4dc0: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
4dd0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
4de0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
4df0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
4e00: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
4e10: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4e20: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4e30: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4e40: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4e50: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
4e60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
4e70: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4e80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4e90: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4ea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4eb0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
4ec0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
4ed0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
4ee0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4ef0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4f00: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4f10: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4f20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  }.#endif...#if d
4f30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
4f40: 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
4f50: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4f60: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4f70: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
4f80: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
4f90: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
4fa0: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
4fb0: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
4fc0: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
4fd0: 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  etation of the s
4fe0: 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67  upplied.** integ
4ff0: 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f  er lock-type..*/
5000: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
5010: 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69  ar *azFileLock(i
5020: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
5030: 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f   switch( eFileLo
5040: 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e  ck ){.    case N
5050: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
5060: 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20  NONE";.    case 
5070: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
5080: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
5090: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
50a0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
50b0: 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73  SERVED";.    cas
50c0: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20  e PENDING_LOCK: 
50d0: 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22  return "PENDING"
50e0: 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55  ;.    case EXCLU
50f0: 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  SIVE_LOCK: retur
5100: 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20  n "EXCLUSIVE";. 
5110: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52   }.  return "ERR
5120: 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  OR";.}.#endif..#
5130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ifdef SQLITE_LOC
5140: 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72  K_TRACE./*.** Pr
5150: 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74  int out informat
5160: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f  ion about all lo
5170: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
5180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5190: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
51a0: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
51b0: 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74   locks on multit
51c0: 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66  hreaded.** platf
51d0: 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79  orms.  Enable by
51e0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
51f0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43  the -DSQLITE_LOC
5200: 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61  K_TRACE.** comma
5210: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f  nd-line option o
5220: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
5230: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   This code is no
5240: 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64  rmally.** turned
5250: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
5260: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
5270: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
5280: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
5290: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
52a0: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
52b0: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
52c0: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
52d0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
52e0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
52f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5300: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
5310: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
5320: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5330: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5340: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
5350: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5360: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
5370: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
5380: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
5390: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
53a0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
53b0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
53c0: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
53d0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
53e0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
53f0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
5400: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
5410: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
5420: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
5430: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
5440: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5450: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
5460: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
5470: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73  _SET );.  s = os
5480: 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  Fcntl(fd, op, p)
5490: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
54a0: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
54b0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
54c0: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
54d0: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
54e0: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
54f0: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
5500: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
5510: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
5520: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
5530: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
5540: 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d   s==(-1) && op==
5550: 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c  F_SETLK && (p->l
5560: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c  _type==F_RDLCK |
5570: 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  | p->l_type==F_W
5580: 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72  RLCK) ){.    str
5590: 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20  uct flock l2;.  
55a0: 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f    l2 = *p;.    o
55b0: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
55c0: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
55d0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
55e0: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
55f0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
5600: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5610: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
5620: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5630: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
5640: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
5650: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
5660: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
5670: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
5680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
5690: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
56a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
56b0: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
56c0: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
56d0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
56e0: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
56f0: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
5700: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
5710: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
5720: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
5730: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e   return s;.}.#un
5740: 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66  def osFcntl.#def
5750: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b  ine osFcntl lock
5760: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
5770: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
5780: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  E */../*.** Retr
5790: 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61  y ftruncate() ca
57a0: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
57b0: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74  e to EINTR.*/.st
57c0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
57d0: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
57e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
57f0: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  z){.  int rc;.  
5800: 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e  do{ rc = osFtrun
5810: 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69  cate(h,sz); }whi
5820: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
5830: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
5840: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5850: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
5860: 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e  ranslates a stan
5870: 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f  dard POSIX errno
5880: 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74   code into somet
5890: 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74  hing.** useful t
58a0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66  o the clients of
58b0: 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e   the sqlite3 fun
58c0: 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69  ctions.  Specifi
58d0: 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20  cally, it is.** 
58e0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e  intended to tran
58f0: 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20  slate a variety 
5900: 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65  of "try again" e
5910: 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54  rrors into SQLIT
5920: 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20  E_BUSY.** and a 
5930: 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61  variety of "plea
5940: 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  se close the fil
5950: 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57  e descriptor NOW
5960: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a  " errors into .*
5970: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a  * SQLITE_IOERR.*
5980: 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72  * .** Errors dur
5990: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
59a0: 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20  on of locks, or 
59b0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
59c0: 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a  ort for locks,.*
59d0: 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20  * should handle 
59e0: 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c  ENOLCK, ENOTSUP,
59f0: 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61   EOPNOTSUPP sepa
5a00: 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rately..*/.stati
5a10: 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f  c int sqliteErro
5a20: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
5a30: 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20  int posixError, 
5a40: 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29  int sqliteIOErr)
5a50: 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73   {.  switch (pos
5a60: 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30  ixError) {.#if 0
5a70: 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
5a80: 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73  nt this code was
5a90: 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f   not commented o
5aa0: 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74  ut. In theory, t
5ab0: 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
5ac0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
5ad0: 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e  hit, as this fun
5ae0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c  ction should onl
5af0: 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
5b00: 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67  r.  ** a locking
5b10: 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f  -related functio
5b20: 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29  n (i.e. fcntl())
5b30: 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f   has returned no
5b40: 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a  n-zero with.  **
5b50: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72   the value of er
5b60: 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74  rno as the first
5b70: 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65   argument. Since
5b80: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68   a system call h
5b90: 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20  as failed,.  ** 
5ba0: 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20  errno should be 
5bb0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20  non-zero..  **. 
5bc0: 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73   ** Despite this
5bd0: 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c  , if errno reall
5be0: 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74  y is zero, we st
5bf0: 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74  ill don't want t
5c00: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
5c10: 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73  LITE_OK. The sys
5c20: 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c  tem call failed,
5c30: 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69   and *some* SQLi
5c40: 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20  te error should 
5c50: 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  be.  ** propagat
5c60: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63  ed back to the c
5c70: 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e  aller. Commentin
5c80: 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75  g this branch ou
5c90: 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30  t means errno==0
5ca0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61  .  ** will be ha
5cb0: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65  ndled by the "de
5cc0: 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c  fault:" case bel
5cd0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ow..  */.  case 
5ce0: 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0: .    return S
5cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
5d00: 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a  ..  case EAGAIN:
5d10: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
5d20: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
5d30: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
5d40: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
5d50: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
5d60: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
5d70: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
5d80: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5d90: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
5da0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
5db0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
5dc0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
5dd0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
5de0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
5df0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
5e00: 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73      /* EACCES is
5e10: 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72   like EAGAIN dur
5e20: 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  ing locking oper
5e30: 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20  ations, but not 
5e40: 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f  any other time*/
5e50: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
5e60: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5e70: 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a  IOERR_LOCK) || .
5e80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
5e90: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
5ea0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20  OERR_UNLOCK) || 
5eb0: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
5ec0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5ed0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
5ee0: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
5ef0: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5f00: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
5f10: 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VEDLOCK) ){.    
5f20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f30: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
5f40: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72  /* else fall thr
5f50: 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45  ough */.  case E
5f60: 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72  PERM: .    retur
5f70: 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
5f80: 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b     .  /* EDEADLK
5f90: 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
5fa0: 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66  e if a call to f
5fb0: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69  cntl(F_SETLKW) i
5fc0: 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a  s made. And.  **
5fd0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76   this module nev
5fe0: 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20  er makes such a 
5ff0: 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f  call. And the co
6000: 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73  de in SQLite its
6010: 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74  elf .  ** assert
6020: 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f  s that SQLITE_IO
6030: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e  ERR_BLOCKED is n
6040: 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46  ever returned. F
6050: 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73  or these reasons
6060: 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20  .  ** this case 
6070: 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
6080: 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79  d out. If the sy
6090: 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72  stem does set er
60a0: 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a  rno to EDEADLK,.
60b0: 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74    ** the default
60c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
60d0: 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72  X code will be r
60e0: 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20  eturned. */.#if 
60f0: 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b  0.  case EDEADLK
6100: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
6110: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
6120: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23  D;.#endif.    .#
6130: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
6140: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
6150: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
6160: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
6170: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
6180: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
6190: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
61a0: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
61b0: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
61c0: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
61d0: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
61e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
61f0: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
6200: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
6210: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
6220: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6230: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6240: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6250: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
6260: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6270: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6280: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
6290: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
62a0: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
62b0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
62c0: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
62d0: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
62e0: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23    case ENOENT:.#
62f0: 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20 20  ifdef ESTALE    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f   /* ESTALE is no
6320: 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74  t defined on Int
6330: 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a  erix systems */.
6340: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23    case ESTALE:.#
6350: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f  endif.  case ENO
6360: 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73  SYS:.    /* thes
6370: 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74  e should force t
6380: 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f  he client to clo
6390: 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
63a0: 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  reconnect */.   
63b0: 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20   .  default: .  
63c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49    return sqliteI
63d0: 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f  OErr;.  }.}..../
63e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6440: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
6450: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6460: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6480: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
6490: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
64a0: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
64b0: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
64c0: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
64d0: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
64e0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
64f0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
6500: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
6510: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
6520: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
6530: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
6540: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
6550: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
6560: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
6570: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
6580: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6590: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
65a0: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
65b0: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
65c0: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
65d0: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
65e0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
65f0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
6600: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
6610: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6620: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
6630: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6640: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
6650: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
6660: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
6670: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6680: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
6690: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
66a0: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
66b0: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
66c0: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
66d0: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
66e0: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
66f0: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
6700: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
6710: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
6720: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
6730: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
6740: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
6750: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
6760: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6770: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
6780: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
6790: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
67a0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
67c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
67d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
67e0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
67f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6800: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6810: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
6820: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
6830: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
6840: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
6850: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
6860: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
6870: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
6880: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
6890: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
68a0: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
68b0: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
68c0: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
68d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
68e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
68f0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6900: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6910: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6920: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6930: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
6940: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
6950: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
6960: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
6970: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
6980: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
6990: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
69a0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
69b0: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
69c0: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
69d0: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
69e0: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
69f0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6a00: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6a10: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6a20: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6a30: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
6a40: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
6a50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6a60: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
6a70: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
6a80: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
6a90: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6aa0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6ab0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6ac0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6ad0: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6ae0: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6af0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6b00: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6b10: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6b20: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6b30: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
6b40: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6b50: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
6b60: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
6b70: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
6b80: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6b90: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6ba0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
6bb0: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
6bc0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
6bd0: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
6be0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
6bf0: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
6c00: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6c10: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
6c20: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
6c30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6c40: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
6c50: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
6c60: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
6c70: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
6c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
6c90: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
6ca0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
6cb0: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
6cc0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
6cd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
6ce0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6cf0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
6d00: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
6d10: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
6d20: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
6d30: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
6d40: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
6d50: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
6d60: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
6d70: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
6d80: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
6d90: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
6da0: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
6db0: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
6dc0: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
6dd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
6de0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6df0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
6e00: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
6e10: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
6e20: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
6e30: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
6e40: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
6e50: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
6e60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6e70: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
6e80: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
6e90: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
6ea0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6eb0: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
6ec0: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
6ed0: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
6ee0: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
6ef0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6f20: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
6f30: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
6f40: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
6f50: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
6f60: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
6f70: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
6f80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
6f90: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
6fa0: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
6fb0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
6fc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
6fd0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6fe0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
6ff0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
7000: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7010: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
7020: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7030: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7040: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7050: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7060: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7070: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7080: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7090: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
70a0: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
70b0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
70c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
70d0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
70e0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
70f0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
7100: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
7110: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
7120: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7130: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7140: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7150: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7160: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7170: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7180: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7190: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
71a0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
71b0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
71c0: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
71d0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
71e0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
71f0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
7200: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
7210: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7220: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7230: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7240: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7250: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7260: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7270: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7280: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7290: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
72a0: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
72b0: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
72c0: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
72d0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
72e0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
72f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
7310: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7320: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7330: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7340: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7350: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7360: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7370: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7390: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
73a0: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
73b0: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
73c0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
73d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
73e0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
73f0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
7400: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
7410: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
7420: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7430: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7440: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7450: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7460: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7470: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7480: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7490: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
74a0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
74b0: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
74c0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
74d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
74e0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
7500: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
7510: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
7520: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
75e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7600: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7610: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7630: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7640: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7650: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7660: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7670: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7680: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7690: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
76a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
76b0: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
76c0: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
76d0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
76e0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
76f0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7700: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7710: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7720: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7730: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7740: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7750: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7760: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7770: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7780: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7790: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
77a0: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
77b0: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
77c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
77d0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
77e0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
77f0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7800: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7810: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7820: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7830: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7840: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7850: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7860: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7870: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7880: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7890: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
78a0: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
78b0: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
78c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
78d0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
78e0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
78f0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7900: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7910: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7920: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7930: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7940: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7950: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7960: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7970: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7980: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7990: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
79a0: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
79b0: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
79c0: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
79d0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
79e0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
79f0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7a00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7a10: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7a20: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7a30: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7a40: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7a50: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7a60: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7a70: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7a80: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7a90: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7aa0: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7ab0: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7ac0: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7ad0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7ae0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7af0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7b00: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7b10: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7b20: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7b30: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7b40: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7b50: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7b60: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7b70: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7b80: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7b90: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7ba0: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7bb0: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7bc0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7bd0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7be0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7bf0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7c00: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7c10: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7c20: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7c30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7c40: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7c50: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7c60: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7c70: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7c80: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7c90: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7ca0: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7cb0: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7cc0: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7cd0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7ce0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7cf0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7d00: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7d10: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7d20: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7d30: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
7d40: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
7d50: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
7d60: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
7d70: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
7d80: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
7d90: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
7da0: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
7db0: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
7dc0: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
7dd0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
7de0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
7df0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
7e00: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
7e10: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
7e20: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
7e30: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
7e40: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
7e50: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7e60: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
7e70: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
7e80: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7e90: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7ea0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
7eb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
7ec0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
7ed0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
7ee0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
7ef0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7f00: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
7f10: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
7f20: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
7f30: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
7f40: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
7f50: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
7f60: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
7f70: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
7f80: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
7f90: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
7fa0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
7fb0: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
7fc0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7fd0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
7fe0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
7ff0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
8000: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
8010: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
8020: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8030: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8040: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8050: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8060: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8070: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8080: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8090: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
80a0: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
80b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
80c0: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
80d0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
80e0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
80f0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
8100: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
8110: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
8120: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8130: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8140: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8150: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8160: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8170: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8180: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8190: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
81a0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
81b0: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
81c0: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
81d0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
81e0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
81f0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
8200: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
8210: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
8220: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8230: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8240: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8250: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8260: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8270: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8280: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8290: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
82a0: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
82b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
82c0: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
82d0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
82e0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
82f0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
8300: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
8310: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
8320: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8330: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8340: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8350: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8360: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8370: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8380: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8390: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
83a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
83b0: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
83c0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
83d0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
83e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
83f0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
8400: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
8410: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
8420: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8430: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8440: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8450: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8460: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8470: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8480: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8490: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
84a0: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
84b0: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
84c0: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
84d0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
84e0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
84f0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
8500: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
8510: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
8520: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8530: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8540: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8550: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8560: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8570: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8580: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8590: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
85a0: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
85b0: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
85c0: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
85d0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
85e0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
85f0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8600: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8610: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8620: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8630: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8640: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8650: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8660: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8670: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8680: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8690: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
86a0: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
86b0: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
86c0: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
86d0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
86e0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
86f0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8700: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8710: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8720: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8730: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8740: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8750: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8760: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8770: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8780: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8790: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
87a0: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
87b0: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
87c0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
87d0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
87e0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
87f0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8800: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8810: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8820: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8830: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8840: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8850: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8860: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8870: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8880: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8890: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
88a0: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
88b0: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
88c0: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
88d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
88e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
88f0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8900: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8910: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8920: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8930: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8940: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8950: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8980: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8990: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
89a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
89b0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
89c0: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
89d0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
89e0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
89f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8a00: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8a10: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8a20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8a30: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8a40: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8a50: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8a60: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8a70: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8a80: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8a90: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8aa0: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8ab0: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8ac0: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8ad0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8ae0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8af0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8b00: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8b10: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8b20: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8b30: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8b40: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8b50: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8b60: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8b70: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8b80: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8b90: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8ba0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8bb0: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8bc0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8bd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8be0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8bf0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8c20: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8c40: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8c50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8c60: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8c70: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8c80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8c90: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8ca0: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8cb0: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8cc0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8cd0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8cf0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8d00: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8d10: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8d20: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
8d40: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
8d50: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8d60: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
8d70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
8d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8d90: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
8da0: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
8db0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8dc0: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
8dd0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
8de0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
8df0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
8e00: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
8e10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8e20: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
8e30: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8e40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
8e50: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
8e60: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
8e70: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
8e80: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
8e90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8ea0: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
8eb0: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
8ec0: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
8ed0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
8ee0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
8ef0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8f00: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
8f30: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
8f40: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
8f50: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
8f60: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
8f70: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
8f80: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
8f90: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
8fa0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
8fc0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
8fd0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
8fe0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8ff0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
9000: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
9010: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
9020: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9030: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9040: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9050: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9060: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9070: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9080: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9090: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
90a0: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
90b0: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
90c0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
90d0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
90e0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
90f0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
9100: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
9110: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9120: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9130: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9140: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9150: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9160: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9170: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9180: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9190: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
91a0: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
91b0: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
91c0: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
91d0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
91e0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
91f0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
9200: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
9210: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
9220: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9230: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9240: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9250: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9260: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9270: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9280: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9290: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
92a0: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
92b0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
92c0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
92d0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
9300: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
9310: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
9320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9330: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9340: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9360: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9370: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9380: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9390: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
93a0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
93b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
93c0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
93d0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
93e0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
93f0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9410: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
9420: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
9430: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9440: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9460: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9470: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9480: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9490: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
94a0: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
94b0: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
94c0: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
94d0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
94e0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
94f0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
9500: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
9510: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
9520: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
9530: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
9540: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
9550: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9560: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
9570: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
9580: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
9590: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
95a0: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
95b0: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
95c0: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
95d0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
95e0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
95f0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
9600: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
9610: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
9620: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9630: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9640: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
9650: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
9660: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9670: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
9680: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
9690: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
96a0: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
96b0: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
96c0: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
96d0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
96e0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
96f0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
9700: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
9710: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
9720: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9730: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
9740: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
9750: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
9760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9770: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
9780: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
9790: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
97a0: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
97b0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
97c0: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
97d0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
97e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
97f0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
9800: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
9810: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
9820: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
9830: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
9840: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9850: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
9860: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
9870: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
9880: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
9890: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
98a0: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
98b0: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
98c0: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
98d0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
98e0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
98f0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
9900: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
9910: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
9920: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
9930: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
9940: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
9950: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
9960: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
9970: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
9980: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
9990: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
99a0: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
99b0: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
99c0: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
99d0: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
99e0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
99f0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9a00: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
9a10: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
9a20: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
9a30: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
9a40: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
9a50: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
9a60: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
9a70: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
9a80: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9a90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
9aa0: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
9ab0: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
9ac0: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
9ad0: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
9ae0: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
9af0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
9b00: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
9b10: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
9b20: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
9b30: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
9b40: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
9b50: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
9b60: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
9b70: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
9b80: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
9b90: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
9ba0: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
9bb0: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
9bc0: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
9bd0: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
9be0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
9bf0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
9c00: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
9c10: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
9c20: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
9c30: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
9c40: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
9c50: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
9c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
9c70: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
9c80: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
9c90: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
9ca0: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
9cb0: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
9cc0: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
9cd0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
9ce0: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
9d00: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
9d10: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
9d20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
9d30: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
9d40: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
9d50: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
9d60: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
9d70: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
9d80: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
9d90: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
9da0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9db0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9dc0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9dd0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
9de0: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
9df0: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
9e00: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
9e10: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
9e20: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
9e30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
9e40: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
9e50: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
9e60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
9e70: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
9e80: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9e90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
9ea0: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
9eb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
9ec0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
9ed0: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
9ee0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
9ef0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
9f00: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
9f10: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
9f20: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
9f30: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
9f40: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
9f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f60: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
9f70: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f80: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f90: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9fa0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
9fb0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
9fc0: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
9fd0: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
9fe0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
9ff0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
a000: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
a010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a020: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
a030: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
a040: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
a050: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
a060: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
a070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a080: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
a090: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
a0a0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
a0b0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
a0c0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0e0: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
a0f0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
a100: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
a110: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
a120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a130: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
a140: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a150: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
a160: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
a170: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a180: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
a190: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
a1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a1b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
a1c0: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
a1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
a1e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a1f0: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
a200: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a210: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
a220: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
a230: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
a240: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
a250: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
a260: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
a270: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
a280: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
a290: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
a2a0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a2b0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a2c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a2d0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a2e0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a2f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a300: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a310: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
a320: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
a330: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
a340: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
a350: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
a360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
a370: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
a380: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
a390: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
a3a0: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
a3b0: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
a3c0: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
a3d0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
a3e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
a3f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
a410: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
a420: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a450: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
a460: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
a470: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
a480: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
a490: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
a4a0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a4b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
a4c0: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
a4d0: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
a4e0: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
a4f0: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
a500: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a510: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
a520: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
a530: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
a540: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a550: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
a560: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
a570: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a580: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
a590: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
a5a0: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
a5b0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
a5c0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
a5d0: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
a5e0: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
a5f0: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
a600: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
a610: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
a620: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
a630: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
a640: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
a650: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
a660: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
a670: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
a680: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a690: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
a6a0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
a6b0: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
a6c0: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
a6d0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
a6e0: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
a6f0: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
a700: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
a710: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
a720: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
a730: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
a740: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
a750: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
a760: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
a770: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
a780: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
a790: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
a7a0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
a7b0: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
a7c0: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
a7d0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
a7e0: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
a7f0: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
a800: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
a810: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
a820: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
a830: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
a840: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
a850: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
a860: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
a870: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
a880: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
a890: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
a8a0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
a8b0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
a8c0: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
a8d0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
a8e0: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
a8f0: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
a900: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
a910: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
a920: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
a930: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
a940: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
a950: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
a960: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
a970: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
a980: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
a990: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
a9a0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
a9b0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a9c0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
a9d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
a9e0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
a9f0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
aa00: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
aa10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
aa20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
aa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
aa40: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
aa50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa60: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
aa70: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
aa80: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
aa90: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
aaa0: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
aab0: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
aac0: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
aad0: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
aae0: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
aaf0: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
ab00: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
ab10: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
ab20: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
ab30: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
ab40: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
ab50: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
ab60: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
ab70: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
ab80: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
ab90: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
aba0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
abb0: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
abc0: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
abd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
abe0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
abf0: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
ac00: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
ac10: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
ac20: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
ac30: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
ac40: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
ac50: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
ac60: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
ac70: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
ac80: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
ac90: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
aca0: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
acb0: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
acc0: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
acd0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
ace0: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
acf0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
ad00: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
ad10: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
ad20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ad30: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
ad40: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
ad50: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
ad60: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
ad70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
ad80: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
ad90: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ada0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
adb0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
adc0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
add0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
ade0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
adf0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
ae00: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
ae10: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
ae20: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
ae30: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
ae40: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
ae50: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
ae60: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
ae70: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
ae80: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
ae90: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
aea0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
aeb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
aec0: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
aed0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
aee0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
aef0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
af00: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
af10: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
af20: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
af30: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
af40: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
af50: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
af60: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
af70: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
af80: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
af90: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
afa0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
afb0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
afc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
afd0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
afe0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
aff0: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
b000: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
b010: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
b020: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
b030: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
b040: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
b050: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
b060: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
b070: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
b080: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
b090: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
b0a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
b0b0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b0c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b0d0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
b0e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
b0f0: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
b100: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
b110: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
b120: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
b130: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
b140: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
b150: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
b160: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  EDLOCK;.      pF
b170: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b180: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c   errno;.    } el
b190: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
b1a0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
b1b0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
b1c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
b1d0: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
b1e0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
b1f0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
b200: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
b210: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
b220: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
b230: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
b240: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
b250: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b260: 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  Attempt to set a
b270: 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20   system-lock on 
b280: 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20  the file pFile. 
b290: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   The lock is .**
b2a0: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c   described by pL
b2b0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
b2c0: 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e  e pFile was open
b2d0: 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72  ed read/write fr
b2e0: 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68  om unix-excl, th
b2f0: 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b  en the only lock
b300: 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65  .** ever obtaine
b310: 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76  d is an exclusiv
b320: 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69  e lock, and it i
b330: 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74  s obtained exact
b340: 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66  ly once.** the f
b350: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
b360: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
b370: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
b380: 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a   system locking.
b390: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65  ** operations be
b3a0: 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f  come no-ops.  Lo
b3b0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
b3c0: 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e   still happen in
b3d0: 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20  ternally,.** in 
b3e0: 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e  order to coordin
b3f0: 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65  ate access betwe
b400: 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61  en separate data
b410: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
b420: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
b430: 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c  process, but all
b440: 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64   of that is hand
b450: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
b460: 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  d the.** operati
b470: 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  ng system does n
b480: 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a  ot participate..
b490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b4a0: 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68  ion is a pass-th
b4b0: 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46  rough to fcntl(F
b4c0: 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65  _SETLK) if pFile
b4d0: 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79   is using.** any
b4e0: 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20   VFS other than 
b4f0: 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69  "unix-excl" or i
b500: 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65  f pFile is opene
b510: 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  d on "unix-excl"
b520: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
b530: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  only..**.** Zero
b540: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
b550: 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74  the call complet
b560: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  es successfully,
b570: 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c   or -1 if a call
b580: 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66  .** to fcntl() f
b590: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
b5a0: 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74  se, errno is set
b5b0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28   appropriately (
b5c0: 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a  by fcntl())..*/.
b5d0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
b5e0: 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  ileLock(unixFile
b5f0: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
b600: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  flock *pLock){. 
b610: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49   int rc;.  unixI
b620: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
b630: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
b640: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
b650: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
b660: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21   assert( pInode!
b670: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46  =0 );.  if( ((pF
b680: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b690: 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21   UNIXFILE_EXCL)!
b6a0: 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50  =0 || pInode->bP
b6b0: 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26  rocessLock).   &
b6c0: 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  & ((pFile->ctrlF
b6d0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b6e0: 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b  RDONLY)==0).  ){
b6f0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
b700: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
b710: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
b720: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
b730: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
b740: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
b750: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b760: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b770: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b780: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
b790: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
b7a0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b7b0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
b7c0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
b7d0: 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74       rc = osFcnt
b7e0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b7f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
b800: 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65     if( rc<0 ) re
b810: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
b820: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b830: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ock = 1;.      p
b840: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
b850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b860: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
b870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
b880: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b890: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63  h, F_SETLK, pLoc
b8a0: 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
b8b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
b8c0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
b8d0: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
b8e0: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
b8f0: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
b900: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
b910: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
b920: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
b930: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
b940: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
b950: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
b960: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
b970: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
b980: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
b990: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
b9a0: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
b9b0: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
b9c0: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
b9d0: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
b9e0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
b9f0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
ba00: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
ba10: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
ba20: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
ba30: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
ba40: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
ba50: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
ba60: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
ba70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
ba80: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
ba90: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
baa0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
bab0: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
bac0: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
bad0: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
bae0: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
baf0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
bb00: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
bb10: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
bb20: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
bb30: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
bb40: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
bb50: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
bb60: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
bb70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
bb80: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
bb90: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
bba0: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
bbb0: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
bbc0: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
bbd0: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
bbe0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
bbf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
bc00: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
bc10: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
bc20: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
bc30: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
bc40: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
bc50: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
bc60: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
bc70: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
bc80: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
bc90: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
bca0: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
bcb0: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
bcc0: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
bcd0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
bce0: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
bcf0: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
bd00: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
bd10: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
bd20: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
bd30: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
bd40: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
bd50: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
bd60: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
bd70: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
bd80: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
bd90: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
bda0: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
bdb0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
bdc0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
bdd0: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
bde0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
bdf0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
be00: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
be10: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
be20: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
be30: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
be40: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
be50: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
be60: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
be70: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
be80: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
be90: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
bea0: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
beb0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
bec0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
bed0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
bee0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
bef0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
bf00: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
bf10: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
bf20: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
bf30: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
bf40: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
bf50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
bf60: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
bf70: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
bf80: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
bf90: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
bfa0: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
bfb0: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
bfc0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
bfd0: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
bfe0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
bff0: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
c000: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
c010: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
c020: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
c030: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
c040: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
c050: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
c060: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
c070: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
c080: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
c090: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
c0a0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
c0b0: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
c0c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
c0d0: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
c0e0: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
c0f0: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
c100: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
c110: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
c120: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
c130: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
c140: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
c150: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
c160: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
c170: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
c180: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
c190: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
c1a0: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
c1b0: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
c1c0: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
c1d0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
c1e0: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
c1f0: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
c200: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c210: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
c220: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
c230: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
c240: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c250: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
c260: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
c270: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
c280: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
c290: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
c2a0: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
c2b0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
c2c0: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
c2d0: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
c2e0: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
c2f0: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
c300: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
c310: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
c320: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
c330: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
c340: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
c350: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
c360: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
c370: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
c380: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
c390: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
c3a0: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
c3b0: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
c3c0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
c3d0: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
c3e0: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
c3f0: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
c400: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
c410: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
c420: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
c430: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
c440: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
c450: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c460: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
c470: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
c480: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
c490: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
c4a0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
c4b0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
c4c0: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
c4d0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
c4e0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
c4f0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
c500: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
c510: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
c520: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
c530: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
c540: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
c550: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
c560: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
c570: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
c580: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
c590: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
c5a0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
c5b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
c5c0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
c5d0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
c5e0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
c5f0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
c600: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
c610: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
c620: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
c630: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
c640: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
c650: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
c660: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
c670: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
c680: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
c690: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
c6a0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
c6b0: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
c6c0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
c6e0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
c6f0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
c700: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c710: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
c720: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
c730: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
c740: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
c750: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
c760: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
c770: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
c780: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
c790: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
c7a0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
c7b0: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
c7c0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
c7d0: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
c7e0: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
c7f0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
c800: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
c810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
c820: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
c830: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
c840: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c850: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c860: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
c870: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
c880: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
c890: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c8a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c8b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c8c0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
c8d0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
c8e0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
c8f0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
c900: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
c910: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
c920: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
c930: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
c940: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
c950: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
c960: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
c970: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
c980: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
c990: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
c9a0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
c9b0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
c9c0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
c9d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
c9e0: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
c9f0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
ca00: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
ca10: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ca20: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
ca30: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
ca40: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ca50: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ca60: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ca70: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
ca80: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
ca90: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
caa0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
cab0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
cac0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
cad0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
cae0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
caf0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
cb00: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
cb10: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
cb20: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
cb30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
cb40: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
cb50: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
cb60: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
cb70: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
cb80: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
cb90: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
cba0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cbb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cbc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
cbd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
cbe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
cbf0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
cc00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
cc10: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
cc20: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
cc30: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
cc40: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
cc50: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
cc60: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
cc70: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
cc80: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
cc90: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
cca0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ccb0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ccc0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ccd0: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
cce0: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
ccf0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
cd00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
cd10: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
cd20: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
cd30: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
cd40: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cd50: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
cd60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
cd70: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
cd80: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
cd90: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
cda0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cdb0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
cdc0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
cdd0: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
cde0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
cdf0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ce00: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ce10: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ce20: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ce30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ce40: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ce50: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ce60: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ce70: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
ce80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ce90: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
cea0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ceb0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
cec0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
ced0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
cee0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
cef0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
cf00: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
cf10: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
cf20: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
cf30: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
cf40: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
cf50: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
cf60: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
cf70: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
cf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
cf90: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
cfa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cfb0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cfc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
cfd0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
cfe0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
cff0: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
d000: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d010: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d020: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
d030: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
d040: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
d050: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d060: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
d070: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d080: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d090: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d0a0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d0b0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
d0c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d0d0: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
d0e0: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
d0f0: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
d100: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
d110: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
d120: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
d130: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
d140: 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  K;.    if( unixF
d150: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d160: 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  lock) && rc==SQL
d170: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d180: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
d190: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
d1a0: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
d1b0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d1c0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
d1d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
d1e0: 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K; .    }..    i
d1f0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
d200: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
d210: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
d220: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d230: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d240: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d250: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lock;.    }else{
d260: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
d270: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
d280: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
d290: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
d2a0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
d2b0: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
d2c0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
d2d0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d2e0: 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
d2f0: 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
d300: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
d310: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
d320: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
d330: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
d340: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
d350: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
d360: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
d370: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
d380: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
d3a0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
d3b0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
d3c0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
d3d0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
d3e0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
d3f0: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
d400: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
d410: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
d420: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
d430: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
d440: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
d450: 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
d460: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
d470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
d480: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
d490: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
d4a0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d4b0: 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46  CK );.    if( eF
d4c0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
d4d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
d4e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
d4f0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
d500: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d510: 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1L;.    }else{.
d520: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d530: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d540: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d550: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d560: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  E;.    }..    if
d570: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
d580: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
d590: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d5a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d5b0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d5c0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d5d0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d5e0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
d5f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
d600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d610: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d620: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
d630: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
d640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d650: 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
d660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
d670: 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
d680: 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
d690: 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
d6a0: 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
d6b0: 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
d6c0: 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
d6d0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
d6e0: 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
d6f0: 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
d700: 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
d710: 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
d720: 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
d730: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
d740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
d750: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
d760: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d770: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20  <=SHARED_LOCK.  
d780: 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52   && eFileLock==R
d790: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29  ESERVED_LOCK.  )
d7a0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61  {.    pFile->tra
d7b0: 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a  nsCntrChng = 0;.
d7c0: 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
d7d0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ate = 0;.    pFi
d7e0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d7f0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 1;.  }.#endi
d800: 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f...  if( rc==SQ
d810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
d820: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d830: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
d840: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d850: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
d860: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
d870: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
d880: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d890: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d8a0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
d8b0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
d8c0: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
d8d0: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
d8e0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
d8f0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
d900: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d910: 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %s (unix)\n", p
d920: 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
d930: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
d940: 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
d950: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
d960: 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
d970: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d980: 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73  Add the file des
d990: 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20  criptor used by 
d9a0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c  file handle pFil
d9b0: 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70  e to the corresp
d9c0: 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65  onding.** pUnuse
d9d0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  d list..*/.stati
d9e0: 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e  c void setPendin
d9f0: 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  gFd(unixFile *pF
da00: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
da10: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
da20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
da30: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
da40: 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65   = pFile->pUnuse
da50: 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  d;.  p->pNext = 
da60: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
da70: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
da80: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
da90: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
daa0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
dac0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
dad0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
dae0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
daf0: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
db00: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
db10: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
db20: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
db30: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
db40: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
db50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
db60: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
db70: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
db80: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
db90: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
dba0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
dbb0: 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
dbc0: 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
dbd0: 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
dbe0: 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
dbf0: 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
dc00: 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
dc10: 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
dc20: 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
dc30: 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
dc40: 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
dc50: 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
dc60: 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
dc70: 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
dc80: 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
dc90: 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
dca0: 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
dcb0: 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
dcc0: 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
dcd0: 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
dce0: 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
dcf0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
dd00: 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
dd10: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
dd20: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
dd30: 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
dd40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
dd50: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
dd60: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
dd70: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
dd80: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
dd90: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
dda0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ddb0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
ddc0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
ddd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
dde0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ddf0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
de00: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
de10: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
de20: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
de30: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
de40: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
de50: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
de60: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
de70: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
de80: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
de90: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
dea0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
deb0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
dec0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
ded0: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
dee0: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
def0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
df00: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
df10: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
df20: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
df30: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
df40: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
df50: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
df60: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
df70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
df80: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
df90: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
dfa0: 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ock );..#ifdef S
dfb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
dfc0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
dfd0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
dfe0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
dff0: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
e000: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
e010: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
e020: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
e030: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
e040: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
e050: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
e060: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
e070: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
e080: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
e090: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
e0a0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
e0b0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
e0c0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
e0d0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
e0e0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
e0f0: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
e100: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
e110: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
e120: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
e130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
e140: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
e150: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
e160: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
e170: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
e180: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
e190: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
e1a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
e1b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
e1c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
e1d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
e1e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
e1f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
e200: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
e210: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
e220: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
e230: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
e240: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
e250: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
e260: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
e270: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
e280: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
e290: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
e2a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
e2b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
e2c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
e2d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
e2e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
e2f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
e300: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
e310: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
e320: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
e330: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
e340: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e350: 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64  _LOCK ){..#if !d
e360: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
e370: 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
e380: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e390: 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
e3a0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
e3b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
e3c0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
e3d0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
e3e0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
e3f0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
e400: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
e410: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
e420: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
e430: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b       int tErrno;
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e450: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
e460: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72  m system call er
e470: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
e480: 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20  off_t divSize = 
e490: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b  SHARED_SIZE - 1;
e4a0: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
e4b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e4c0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
e4d0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e4e0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e4f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e500: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e510: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
e520: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
e530: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
e540: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e550: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
e560: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
e570: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
e580: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e590: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e5a0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e5b0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e5c0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e5d0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e5e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e5f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
e600: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
e620: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
e630: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
e640: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e650: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e660: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e670: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e680: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e690: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
e6a0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e6b0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e6c0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
e6d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e6e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e6f0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e700: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e710: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e720: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
e730: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e740: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e750: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e760: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e770: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e780: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
e790: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
e7b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e7c0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
e7d0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e7e0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e7f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e800: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
e810: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
e820: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
e830: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
e840: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
e850: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e860: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
e870: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
e880: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
e890: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e8a0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
e8b0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
e8c0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
e8e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
e8f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
e900: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
e910: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e930: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
e940: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
e950: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
e960: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
e970: 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
e980: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e990: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
e9a0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e9b0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e9c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e9d0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e9e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e9f0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
ea00: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
ea10: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ea20: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
ea30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
ea40: 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
ea50: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
ea60: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
ea70: 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
ea80: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
ea90: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
eaa0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
eab0: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
eac0: 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
ead0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
eae0: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
eaf0: 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
eb00: 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
eb10: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
eb20: 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
eb30: 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
eb40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
eb50: 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
eb60: 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
eb70: 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
eb80: 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
eb90: 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
eba0: 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
ebb0: 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
ebc0: 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ebe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ebf0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OCK;.          p
ec00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ec10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
ec20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ec30: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
ec40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ec50: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ec60: 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
ec70: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ec80: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
ec90: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
eca0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
ecb0: 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
ecc0: 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
ecd0: 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
ece0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  E );.    if( uni
ecf0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
ed00: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
ed10: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ed20: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
ed30: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
ed40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ed50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ed60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ed70: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ed80: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ed90: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
eda0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
edb0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
edc0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
edd0: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
ede0: 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
edf0: 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
ee00: 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
ee10: 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
ee20: 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
ee30: 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
ee40: 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
ee50: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
ee60: 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  /.    pInode->nS
ee70: 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
ee80: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ee90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
eea0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
eeb0: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
eec0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
eed0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
eee0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
eef0: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
ef00: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
ef10: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
ef20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
ef30: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
ef40: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ef50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
ef60: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ef70: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ef80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ef90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
efa0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
efb0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
efc0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
efd0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
efe0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
eff0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
f000: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
f010: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
f020: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
f030: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
f040: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
f050: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
f060: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
f070: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
f080: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
f090: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
f0a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
f0b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
f0c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
f0d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
f0e0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
f0f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
f100: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
f110: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
f120: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
f130: 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
f140: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f150: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
f160: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
f170: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
f180: 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
f190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
f1a0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
f1b0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
f1c0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
f1d0: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
f1e0: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
f1f0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
f200: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
f210: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
f220: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
f230: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f240: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
f250: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
f260: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
f270: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
f280: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f290: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
f2a0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
f2b0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f2c0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
f2d0: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
f2e0: 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
f2f0: 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k, 0);.}../*.** 
f300: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
f310: 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
f320: 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
f330: 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
f340: 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
f350: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
f360: 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
f370: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
f380: 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
f390: 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
f3a0: 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
f3b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
f3c0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
f3d0: 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
f3e0: 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
f3f0: 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
f400: 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
f410: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f420: 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
f430: 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
f440: 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
f450: 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
f460: 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
f470: 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
f480: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
f490: 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
f4a0: 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
f4b0: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
f4c0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f4d0: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
f4e0: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
f4f0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
f500: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
f510: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
f520: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
f530: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
f540: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
f550: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
f560: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
f570: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
f580: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
f590: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
f5a0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
f5b0: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
f5c0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
f5d0: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
f5e0: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
f5f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
f600: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
f610: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
f620: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
f630: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
f640: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
f650: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
f660: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
f670: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
f680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f690: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
f6a0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f6b0: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
f6c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f6d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f6e0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
f6f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f700: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
f710: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
f720: 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
f730: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
f740: 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
f750: 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
f760: 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
f770: 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
f780: 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
f790: 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
f7a0: 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
f7b0: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
f7c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
f7d0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
f7e0: 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
f7f0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
f800: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
f810: 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
f820: 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
f830: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
f840: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
f850: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
f860: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
f870: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
f880: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
f890: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
f8a0: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
f8b0: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
f8c0: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
f8d0: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
f8e0: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
f8f0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
f900: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
f910: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
f920: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
f930: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
f940: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
f950: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
f960: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
f970: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
f980: 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
f990: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f9a0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f9b0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
f9c0: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f9d0: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
f9e0: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
f9f0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
fa00: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
fa10: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa60: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
fa70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
faa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fab0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fad0: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
fae0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
faf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
fb10: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
fb20: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
fb30: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
fb40: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
fb50: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
fb60: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
fb70: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
fb80: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
fb90: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
fba0: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
fbb0: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
fbc0: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
fbd0: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
fbe0: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
fbf0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
fc00: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
fc10: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
fc20: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
fc30: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
fc40: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
fc50: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
fc60: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
fc70: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
fc80: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
fc90: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
fca0: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
fcb0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
fcc0: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
fcd0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
fce0: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
fcf0: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
fd00: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
fd10: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
fd20: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
fd30: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
fd40: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
fd50: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
fd60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
fd70: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
fd80: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
fd90: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
fda0: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
fdb0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
fdc0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
fdd0: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
fde0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
fdf0: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
fe00: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
fe10: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
fe20: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
fe30: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
fe40: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
fe50: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
fe60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
fe70: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
fe80: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fe90: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
fea0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
feb0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
fec0: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
fed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fee0: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
fef0: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
ff00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
ff10: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
ff20: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
ff30: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
ff40: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
ff50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
ff70: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
ff80: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
ff90: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ffa0: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
ffb0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
ffc0: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
ffe0: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
fff0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
10070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
100c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100d0 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
100e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
100f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10100 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
10110 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10120 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10130 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
10140 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
10150 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
10160 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
10170 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
10180 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
10190 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
101a0 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
101b0 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
101c0 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
101d0 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
101e0 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
101f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
10200 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
10210 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
10220 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
10230 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
10240 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
10250 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
10260 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
10270 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
10280 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
10290 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
102a0 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
102b0 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
102c0 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
102d0 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
102e0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
102f0 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
10300 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
10310 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
10320 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
10330 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
10340 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
10350 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
10360 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
10370 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
10380 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
10390 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
103a0 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
103b0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
103c0 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
103d0 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
103e0 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
103f0 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
10400 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
10410 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
10420 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
10430 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
10440 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10450 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
10460 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
10470 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
10480 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
10490 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
104a0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
104b0 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
104c0 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
104d0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
104e0 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
104f0 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
10500 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
10510 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
10520 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
10530 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10540 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
10550 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
10560 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
10570 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10580 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
10590 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
105a0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
105b0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
105c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
105d0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
105e0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
105f0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
10600 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
10610 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
10620 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
10630 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10640 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
10650 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
10660 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
10670 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
10680 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
10690 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
106a0 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
106b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
106c0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
106d0 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
106e0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
106f0 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
10700 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
10710 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
10720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10730 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
10740 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10750 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10760 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
10770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10780 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
10790 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
107a0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
107b0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
107c0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
107d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
107e0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
107f0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
10800 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
10810 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
10820 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10830 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10840 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
10850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
10860 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
10870 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
10880 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
10890 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
108a0 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
108b0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
108c0 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
108d0 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
108e0 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
108f0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
10900 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
10910 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
10920 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
10930 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
10940 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
10950 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10960 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
10970 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
10980 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10990 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
109a0 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
109b0 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
109c0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
109d0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
109e0 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
109f0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
10a00 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
10a10 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
10a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10a30 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
10a40 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
10a50 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10a60 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
10a70 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10a80 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10a90 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10aa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10ab0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10ac0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10ad0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10ae0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
10af0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
10b00 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
10b10 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
10b20 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10b30 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
10b40 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10b50 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10b60 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10b70 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10b80 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10b90 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10ba0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10bb0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10bc0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10bd0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10be0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
10bf0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
10c00 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
10c10 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
10c20 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
10c30 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
10c40 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10c50 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10c60 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10c70 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10c80 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10c90 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10ca0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10cb0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10cc0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10cd0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10cf0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
10d00 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
10d10 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
10d20 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
10d30 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
10d40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
10d50 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
10d60 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
10d70 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
10d80 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
10d90 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
10da0 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
10db0 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
10dc0 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
10dd0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10de0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
10df0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
10e00 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
10e10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10e20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
10e30 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
10e40 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10e50 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10e60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10e70 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10e80 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10e90 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10ea0 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10eb0 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10ec0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10ed0 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10ee0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
10ef0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
10f00 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10f10 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10f20 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
10f30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10f40 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
10f50 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
10f60 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
10f70 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
10f80 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
10f90 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
10fa0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
10fb0 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
10fc0 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
10fd0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
10fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10ff0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
11000 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
11010 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
11020 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
11030 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
11040 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
11050 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
11060 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
11070 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
11080 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11090 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
110a0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
110b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
110c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
110d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
110e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
110f0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11100 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11110 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11120 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
11130 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11140 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11170 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
11180 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11190 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
111a0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
111b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
111c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
111d0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
111e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
111f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11200 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
11210 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
11220 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11230 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11240 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11250 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11260 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
11270 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
11280 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
11290 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
112a0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
112b0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
112c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
112d0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
112e0 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
112f0 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
11300 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
11310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11320 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
11330 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11340 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11350 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11360 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11370 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
11380 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
11390 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
113a0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
113b0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
113c0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
113d0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
113e0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
113f0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
11400 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
11410 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11420 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11430 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11440 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11450 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11460 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11470 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
11490 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
114a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114b0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
114c0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
114d0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
114e0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
114f0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
11500 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
11510 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
11520 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
11530 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
11540 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
11550 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11560 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11570 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
11580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11590 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
115a0 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
115b0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
115c0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
115d0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
115e0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
115f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
11600 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
11610 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
11620 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
11630 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
11640 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
11650 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
11660 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11670 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
11680 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
11690 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
116a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
116b0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
116c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
116d0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
116e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
116f0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
11700 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
11710 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
11720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11730 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
11740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11750 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11760 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
11770 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
11780 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
11790 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
117a0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
117b0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
117c0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
117d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
117e0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
117f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11800 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11810 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
11820 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
11830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11840 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11850 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
11860 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
11870 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11880 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
118a0 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
118b0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
118c0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
118d0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11920 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
11930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11970 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11990 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
119a0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
119b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
119d0 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
119e0 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
119f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
11a00 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
11a10 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
11a20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
11a30 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
11a40 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
11a50 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
11a60 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
11a70 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
11a80 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
11a90 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
11aa0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
11ab0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
11ac0 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
11ad0 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
11ae0 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
11af0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
11b00 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
11b10 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
11b20 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
11b30 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
11b40 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
11b50 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
11b60 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
11b70 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b80 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
11b90 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
11ba0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
11bb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11bc0 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
11bd0 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
11be0 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
11bf0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
11c00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
11c10 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
11c20 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  S../*.** Retry f
11c30 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
11c40 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
11c50 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
11c60 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
11c70 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
11c80 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
11c90 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
11ca0 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
11cb0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
11cc0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
11cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
11ce0 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
11cf0 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
11d00 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
11d10 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
11d20 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11d30 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11d40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11d50 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
11d60 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
11d70 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
11d80 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
11d90 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11da0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11db0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11dc0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11dd0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11de0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11df0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11e00 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11e10 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11e20 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11e30 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11e50 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
11e60 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11e70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11e80 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
11e90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11ea0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11eb0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11ec0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11ed0 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
11ee0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11ef0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
11f00 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
11f10 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
11f20 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
11f30 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
11f40 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11f50 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
11f60 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
11f70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11f80 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
11f90 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
11fa0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
11fb0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
11fc0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
11fd0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
11fe0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
11ff0 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
12000 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
12010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
12020 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12030 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12040 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
12050 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
12060 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
12070 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
12080 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
12090 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
120a0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
120b0 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
120c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
120d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
120e0 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
120f0 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
12100 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
12110 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12120 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
12130 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12140 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12150 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12160 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12170 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12180 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
12190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
121a0 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
121b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
121c0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
121d0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
121e0 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
121f0 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
12200 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
12210 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12220 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12230 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12240 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
12250 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12260 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
12270 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12280 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
12290 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
122a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
122b0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
122c0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
122d0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
122e0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
122f0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
12300 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12310 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
12320 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12330 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12340 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12360 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
12370 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12380 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12390 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
123a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
123b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
123c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
123d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
123e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
123f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
12400 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
12410 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12420 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12430 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12440 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12450 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12460 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12470 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12480 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12490 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
124a0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
124b0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
124c0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
124d0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
124e0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
124f0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12500 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12510 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12520 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12530 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12540 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12550 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12560 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12570 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12580 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12590 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
125a0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
125b0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
125c0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
125d0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
125e0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
125f0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12600 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12610 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12620 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12630 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12640 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12650 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12660 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12670 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
12680 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
12690 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
126a0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
126b0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
126c0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
126d0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
126e0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
126f0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
12700 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
12710 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
12720 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
12730 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
12740 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
12750 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
12760 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
12770 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
12780 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12790 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
127a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
127b0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
127c0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
127d0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
127e0 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
127f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12800 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12820 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
12830 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12840 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
12850 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
12860 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
12870 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
12880 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
12890 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
128a0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
128b0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
128c0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
128d0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
128e0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
128f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12900 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
12910 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12920 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
12930 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12940 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
12950 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12960 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
12970 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
12980 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12990 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
129a0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
129b0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
129c0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
129d0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
129e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
129f0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
12a00 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12a10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12a20 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
12a40 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
12a50 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12a60 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12a70 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12a80 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12a90 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
12aa0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
12ab0 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
12ac0 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
12ad0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
12af0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
12b00 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
12b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
12b20 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12b30 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
12b40 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
12b50 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
12b60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12b70 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
12b80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12b90 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12ba0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
12bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
12bc0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
12bd0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
12be0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
12bf0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
12c00 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
12c10 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
12c20 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
12c30 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
12c40 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12c50 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
12c60 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
12c70 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
12c80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
12c90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
12ca0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12cb0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
12cc0 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
12cd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12ce0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
12cf0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
12d00 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12d10 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
12d20 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12d30 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12d40 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12d50 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
12d60 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
12d70 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
12d80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12d90 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
12da0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
12db0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
12dc0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
12dd0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
12de0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
12df0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
12e00 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
12e10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12e20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
12e30 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
12e40 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
12e50 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
12e60 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
12e70 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
12e80 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12e90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12ea0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
12eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12ec0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12ed0 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
12ee0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
12ef0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12f00 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
12f10 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12f20 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
12f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12f40 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
12f50 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12f60 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12f70 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
12f80 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12f90 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
12fa0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12fb0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
12fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12fd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
12fe0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
12ff0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13000 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13010 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
13020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13030 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13040 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
13050 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63  NO_LOCK);.    rc
13060 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13070 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13080 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
13090 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
130a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
130b0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
130c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
130d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
130e0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
130f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
131c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
131d0 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
131e0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
131f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13200 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13210 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13220 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13230 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13240 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13250 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13260 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13270 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13280 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
13290 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
132a0 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
132b0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
132c0 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
132d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
132e0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
132f0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13300 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13310 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13320 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13330 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13340 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13350 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13370 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13380 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13390 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
133a0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
133b0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
133c0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
133d0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
133e0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
133f0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13400 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13410 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13420 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13430 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13440 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13450 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13460 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13470 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13480 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13490 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
134a0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
134b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
134c0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
134d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
134e0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
134f0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13500 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13510 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
13520 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
13530 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13540 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
13550 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
13560 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
13570 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
13580 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
13590 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
135a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
135b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
135c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
135d0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
135e0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
135f0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
13600 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13610 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
13620 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
13630 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
13640 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
13650 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75  ->pSem;.    stru
13660 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
13670 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72  ..    if( sem_tr
13680 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
13690 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
136a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
136b0 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d     if( EAGAIN !=
136c0 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
136d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
136e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
136f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
13700 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
13710 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
13720 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13730 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13740 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13750 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
13760 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
13770 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
13780 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
13790 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
137a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
137b0 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
137c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
137d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
137e0 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
137f0 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
13800 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
13810 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
13820 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13830 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13840 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
13850 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
13860 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
13870 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
13880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13890 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
138a0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
138b0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
138c0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
138d0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
138e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
138f0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13900 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13910 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13920 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13930 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13940 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13950 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13960 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13970 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
13980 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
13990 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
139a0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
139b0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
139c0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
139d0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
139e0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
139f0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
13a00 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
13a10 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
13a20 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
13a30 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
13a40 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
13a50 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
13a60 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
13a70 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
13a80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
13a90 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
13aa0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
13ab0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
13ac0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
13ad0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
13ae0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13af0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13b00 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
13b10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13b20 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
13b30 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
13b40 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
13b50 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
13b60 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
13b70 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
13b80 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
13b90 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
13ba0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
13bb0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
13bc0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
13bd0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
13be0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
13bf0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
13c00 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
13c10 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
13c20 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
13c30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
13c40 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13c50 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13c60 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
13c70 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
13c80 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
13c90 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
13ca0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13cb0 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   semLock(sqlite3
13cc0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13cd0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13ce0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13cf0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13d00 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
13d10 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13d20 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
13d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13d40 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
13d50 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
13d60 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
13d70 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
13d80 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
13d90 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
13da0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
13db0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13dc0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
13dd0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13de0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13e00 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
13e10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
13e20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
13e30 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
13e40 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
13e50 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
13e60 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
13e70 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
13e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
13e90 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
13ea0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
13eb0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13ec0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13ed0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13ef0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
13f00 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
13f10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13f20 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13f30 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13f40 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
13f50 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
13f60 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13f70 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13f80 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13f90 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13fa0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13fb0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13fc0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13fd0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13fe0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13ff0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14010 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14020 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73   int semUnlock(s
14030 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14040 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14050 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14060 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14070 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
14080 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14090 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
140a0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
140b0 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
140c0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
140d0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
140e0 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
140f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
14100 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
14110 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14120 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
14130 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
14140 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
14150 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
14160 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
14170 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14180 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
14190 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
141a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
141b0 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
141c0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
141d0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
141e0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
141f0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
14200 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
14210 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14220 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14230 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
14240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14250 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
14260 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
14270 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
14280 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
14290 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
142a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
142b0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
142c0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
142d0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
142e0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
142f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
14300 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
14310 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14320 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
14330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
14340 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
14350 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
14360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
14380 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
14390 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
143a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
143b0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
143c0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
143d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
143e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
143f0 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
14400 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
14410 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
14420 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
14430 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
14440 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
14450 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14460 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
14470 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
14480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14490 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
144a0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
144b0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
144c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
144d0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
144e0 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
14500 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
14510 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
14520 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14600 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14630 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
14640 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
14650 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
14660 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
14670 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
14680 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
14690 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
146a0 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
146b0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
146c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
146d0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
146e0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
146f0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
14700 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
14710 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
14720 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
14730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
14740 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
14750 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
14760 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
14770 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
14780 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
14790 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
147a0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
147b0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
147c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
147d0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
147e0 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
147f0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
14800 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
14810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
14820 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
14830 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
14840 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
14850 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
14860 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
14870 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
14880 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
14890 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
148a0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
148b0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
148c0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
148d0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
148e0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
148f0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
14900 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
14910 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
14920 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
14930 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
14940 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
14950 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
14960 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14970 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
14980 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
14990 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
149a0 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
149b0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
149e0 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
149f0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
14a00 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
14a10 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
14a20 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
14a30 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
14a40 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
14a50 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
14a60 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
14a70 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
14a80 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
14a90 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
14aa0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
14ab0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
14ac0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
14ad0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
14ae0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
14af0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
14b00 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
14b10 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
14b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14b30 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
14b40 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
14b50 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
14b60 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
14b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
14b80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14b90 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
14ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
14bb0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
14bc0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
14bd0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
14be0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14bf0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
14c00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
14c10 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
14c20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
14c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14c40 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
14c50 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
14c60 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
14c70 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
14c80 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
14c90 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
14ca0 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
14cb0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
14cc0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
14cd0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
14ce0 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
14cf0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
14d00 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
14d10 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
14d20 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
14d30 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
14d40 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
14d50 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
14d60 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
14d70 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
14d80 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
14d90 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
14da0 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
14db0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
14dc0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
14dd0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
14de0 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
14df0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
14e00 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
14e10 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
14e20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
14e30 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
14e40 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
14e50 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
14e60 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
14e70 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
14e80 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
14e90 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
14ea0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
14eb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14ec0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
14ed0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14ee0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14ef0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14f00 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
14f10 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
14f20 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
14f30 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
14f40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14f50 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
14f60 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
14f70 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14f80 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
14f90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14fa0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
14fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14fc0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
14fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
14ff0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
15000 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
15010 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
15020 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
15030 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
15040 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
15050 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
15060 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
15070 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
15080 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
15090 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
150a0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
150b0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
150c0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
150d0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
150e0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
150f0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15100 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
15110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15120 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
15130 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15140 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
15150 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
15160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15170 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15180 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15190 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
151a0 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
151b0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
151c0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
151d0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
151e0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
151f0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15200 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15210 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
15220 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
15230 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
15240 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
15250 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
15260 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
15270 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
15280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15290 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
152a0 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
152b0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
152c0 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
152d0 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
152e0 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
152f0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
15300 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
15310 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
15320 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
15330 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
15340 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15350 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15360 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
15370 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
15380 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
15390 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
153a0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
153b0 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
153c0 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
153d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
153e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
153f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15400 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
15410 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
15420 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
15430 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
15440 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
15450 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
15460 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
15470 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
15480 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
15490 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
154a0 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
154b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
154c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
154d0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
154e0 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
154f0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
15500 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
15510 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
15520 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
15530 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
15540 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
15550 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
15560 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
15570 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
15580 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
15590 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
155a0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
155b0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
155c0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
155d0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
155e0 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
155f0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
15600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15610 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
15620 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
15630 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
15640 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
15650 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
15660 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
15670 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
15680 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
15690 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
156a0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
156b0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
156c0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
156d0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
156e0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
156f0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
15700 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
15710 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
15720 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
15730 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
15740 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
15750 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
15760 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
15770 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
15780 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
15790 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
157a0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
157b0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
157c0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
157d0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
157e0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
157f0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
15800 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
15810 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
15820 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
15830 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
15840 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
15850 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
15860 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
15870 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
15880 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
15890 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
158a0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
158b0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
158c0 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
158d0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
158e0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
158f0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
15900 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
15910 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
15920 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15940 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
15950 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15960 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
15970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15990 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
159a0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
159b0 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
159c0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
159d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
159e0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
159f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
15a00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
15a10 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
15a20 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15a30 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15a40 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
15a50 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
15a60 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
15a70 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15a80 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
15a90 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
15aa0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
15ab0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15ac0 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
15ad0 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
15ae0 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
15af0 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
15b00 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
15b10 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
15b20 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
15b30 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
15b40 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
15b50 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
15b60 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
15b70 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
15b80 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
15b90 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
15ba0 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
15bb0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
15bc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
15bd0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
15be0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
15bf0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
15c00 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
15c10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
15c20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
15c30 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
15c40 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
15c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15c60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15c70 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
15c80 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
15c90 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
15ca0 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
15cb0 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
15cc0 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
15cd0 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
15ce0 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
15cf0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
15d00 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
15d10 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
15d20 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
15d30 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
15d40 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
15d50 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
15d60 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15d70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
15d80 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
15d90 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15da0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15db0 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
15dc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
15dd0 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
15de0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
15df0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
15e00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15e10 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
15e20 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
15e30 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15e40 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15e50 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
15e60 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15e70 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
15e80 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
15e90 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
15ea0 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
15eb0 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
15ec0 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
15ed0 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
15ee0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
15ef0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
15f00 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
15f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
15f20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
15f30 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15f40 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
15f50 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
15f60 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
15f70 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
15f80 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
15f90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15fa0 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
15fb0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15fc0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
15fd0 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
15fe0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
15ff0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
16000 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
16010 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
16020 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
16030 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
16040 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
16050 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
16060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
16070 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16080 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16090 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
160a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
160b0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
160c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
160d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
160e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
160f0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16100 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
16110 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
16120 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
16130 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16140 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
16150 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16160 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16170 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
16180 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
16190 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
161a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
161b0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
161c0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
161d0 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
161e0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
161f0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
16200 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
16210 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
16220 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
16230 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
16240 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
16250 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
16260 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16270 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16280 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
16290 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
162a0 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
162b0 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
162c0 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
162d0 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
162e0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
162f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16300 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
16310 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
16320 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
16330 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
16340 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
16350 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16360 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
16370 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
16380 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
16390 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
163a0 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
163b0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
163c0 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
163d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
163e0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
163f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16400 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
16410 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
16420 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
16430 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
16440 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
16450 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16460 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16470 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16480 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
16490 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
164a0 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
164b0 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
164c0 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
164d0 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
164e0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
164f0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
16500 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
16510 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
16520 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
16530 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
16540 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
16550 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
16560 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16570 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
16580 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16590 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
165a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
165b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
165c0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
165d0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
165e0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
165f0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16600 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
16610 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
16620 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
16630 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
16640 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
16650 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
16660 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
16670 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16680 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16690 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
166a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
166b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
166c0 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
166d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
166e0 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
166f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
16700 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
16710 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
16720 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
16730 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
16740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
16750 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
16760 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
16770 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
16780 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
16790 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
167a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
167b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
167c0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
167d0 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
167e0 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
167f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
16800 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
16810 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
16820 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16830 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
16840 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
16850 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
16860 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
16870 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
16880 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
16890 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
168a0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
168b0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
168c0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
168d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
168f0 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
16900 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
16910 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16920 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
16930 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
16940 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
16950 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
16960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
16970 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
16980 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
16990 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
169a0 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
169b0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
169c0 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
169d0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
169e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
169f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
16a00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
16a10 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
16a20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16a30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16a40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16a50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16a60 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16a70 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
16a80 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
16a90 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16aa0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16ab0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
16ac0 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
16ad0 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
16ae0 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
16af0 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
16b00 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
16b10 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
16b20 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
16b30 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
16b40 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
16b50 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
16b60 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
16b70 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16b80 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
16b90 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
16ba0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16bb0 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
16bc0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16bd0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16be0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
16bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c00 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
16c10 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16c20 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
16c30 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
16c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16c50 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
16c60 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
16c70 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
16c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
16c90 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16ca0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16cb0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
16cc0 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16cf0 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
16d00 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
16d10 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
16d20 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16d30 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
16d60 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
16d70 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
16d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
16d90 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
16da0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
16db0 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
16dc0 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16dd0 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16de0 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16df0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16e00 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
16e10 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16e20 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
16e30 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
16e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16e60 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
16e70 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16e80 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
16e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ea0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
16eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16ec0 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16ed0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16f00 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16f10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16f20 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
16f30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
16f40 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
16f50 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16f60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16f70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16f80 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
16f90 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
16fa0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
16fb0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16fc0 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
16fd0 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
16fe0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16ff0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
17000 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
17010 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
17020 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
17030 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
17040 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
17050 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
17060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17070 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17080 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17090 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
170a0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
170b0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
170c0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
170d0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
170e0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
170f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17100 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17110 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17120 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
17130 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
17140 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
17150 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17160 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17170 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
17180 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17190 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
171a0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
171b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
171c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
171d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
171e0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
171f0 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
17200 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
17210 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
17220 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
17230 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
17240 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
17250 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
17260 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
17270 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
17280 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
17290 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
172a0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
172b0 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
172c0 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
172d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
172e0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
172f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17300 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17310 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
17320 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
17330 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
17340 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
17350 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17360 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
17370 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
17380 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
17390 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
173a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
173b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
173c0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
173d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
173e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
173f0 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
17400 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17410 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
17420 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
17430 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17440 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
17450 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
17460 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17470 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
17480 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
17490 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
174a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
174b0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
174c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
174d0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
174e0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
174f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
17500 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
17510 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
17520 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
17530 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
17540 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
17550 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
17560 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
17570 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
17580 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
17590 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
175a0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
175b0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
175c0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
175d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
175e0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
175f0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
17600 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
17610 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
17620 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
17630 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
17640 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
17650 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
17660 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
17670 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
17680 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
17690 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
176a0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
176b0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
176c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
176d0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
176e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
176f0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
17700 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
17710 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
17720 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
17730 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
17740 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
17750 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17760 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
17770 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17780 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17790 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
177a0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
177b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
177c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
177d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
177e0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
177f0 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
17800 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
17810 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17820 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
17830 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
17840 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
17850 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
17860 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
17870 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
17880 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17890 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
178a0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
178b0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
178c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
178d0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
178e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
178f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
17910 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
17920 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
17930 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17940 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17950 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
17960 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
17970 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
17980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17990 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
179a0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
179b0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
179c0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
179d0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
179e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
179f0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17a00 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
17a10 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
17a20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
17a30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
17a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a60 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
17a70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
17a80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17a90 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
17aa0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17ab0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
17ac0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
17ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
17ae0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
17af0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
17b00 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
17b10 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
17b20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
17b30 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
17b40 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
17b50 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
17b60 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
17b70 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
17b80 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
17b90 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
17ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
17bb0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
17bc0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
17bd0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17be0 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
17bf0 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
17c00 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17c10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
17c20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17c30 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
17c40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
17c50 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
17c60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17c70 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
17c80 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
17c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
17ca0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17cb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17cc0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
17cd0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
17ce0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
17cf0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
17d00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
17d10 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
17d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17d30 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
17d40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17d60 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17d70 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
17d80 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
17d90 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
17da0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
17db0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
17dc0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
17dd0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
17de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
17df0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17e00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17e10 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
17e20 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17e30 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
17e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
17e50 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
17e60 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
17e70 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
17e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17e90 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
17ea0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
17eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17ec0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
17ed0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17ee0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17ef0 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
17f00 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
17f10 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17f20 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
17f30 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
17f40 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
17f50 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
17f60 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
17f70 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
17f80 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
17f90 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
17fa0 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
17fb0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
17fc0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
17fd0 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
17fe0 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
17ff0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
18000 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
18010 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
18020 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
18030 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
18040 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
18050 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
18060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
18070 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
18080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
18090 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
180a0 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
180b0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
180c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
180d0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
180e0 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
180f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18110 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18120 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18130 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18140 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18150 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18160 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
18170 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18180 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18190 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
181a0 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
181b0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
181c0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
181d0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
181e0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
181f0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
18200 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18210 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
18220 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
18230 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
18240 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18260 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
18270 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18280 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18290 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
182f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18330 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18350 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18360 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18380 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
18390 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
183a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
183b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
183c0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
183d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
183e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
183f0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
18400 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
18410 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
18420 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18430 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
18440 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
18450 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18460 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18470 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18480 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
18490 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
184a0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
184b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
184c0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
184d0 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
184e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
184f0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
18500 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
18510 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
18520 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
18530 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18540 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18550 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18560 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
18570 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
18580 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
18590 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
185a0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
185b0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
185c0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
185d0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
185e0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
185f0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
18600 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
18610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18620 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18630 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18640 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
186b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
18720 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
18730 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
18740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18750 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
18760 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
18770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18780 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
18790 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
187a0 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
187b0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
187c0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
187d0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
187e0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
187f0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
18800 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
18810 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
18820 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
18830 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
18840 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
18850 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
18860 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
18870 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
18880 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
18890 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
188a0 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
188b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
188c0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
188d0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
188e0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
188f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18900 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
18910 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
18920 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
18930 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
18940 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
18950 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
18960 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
18970 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
18980 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
18990 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
189a0 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
189b0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
189c0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
189d0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
189e0 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
189f0 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
18a00 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
18a10 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
18a20 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
18a30 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
18a40 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
18a50 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
18a60 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
18a70 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
18a80 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
18a90 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
18aa0 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
18ab0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
18ac0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
18ad0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
18ae0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
18af0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
18b00 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
18b10 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20  ot;.  int prior 
18b20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  = 0;.#if (!defin
18b30 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
18b40 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
18b50 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
18b60 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
18b70 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
18b80 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63   assert( cnt==(c
18b90 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  nt&0x1ffff) );. 
18ba0 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66 3b   cnt &= 0x1ffff;
18bb0 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
18bc0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
18bd0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28    got = osPread(
18be0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18bf0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
18c00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18c10 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
18c20 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18c30 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d  EAD64).    got =
18c40 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
18c50 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18c60 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
18c70 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18c80 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20   -1 );.#else.   
18c90 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18ca0 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18cb0 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
18cc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18cd0 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
18ce0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
18cf0 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
18d00 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
18d10 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
18d20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18d30 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18d40 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c  errno;.      }el
18d50 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e  se{.        ((un
18d60 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18d70 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  tErrno = 0;.    
18d80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
18d90 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
18da0 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
18db0 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
18dc0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
18dd0 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
18de0 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
18df0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
18e00 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
18e10 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
18e20 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
18e30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
18e40 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18e50 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
18e70 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20  e if( got>0 ){. 
18e80 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b       cnt -= got;
18e90 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
18ea0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f   got;.      prio
18eb0 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  r += got;.      
18ec0 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67  pBuf = (void*)(g
18ed0 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66  ot + (char*)pBuf
18ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
18ef0 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49  e( got>0 );.  TI
18f00 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
18f10 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE(("READ    %-3
18f20 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
18f30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18f40 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f   id->h, got+prio
18f50 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c  r, offset-prior,
18f60 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
18f70 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70  ;.  return got+p
18f80 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rior;.}../*.** R
18f90 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
18fa0 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
18fb0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
18fc0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
18fd0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
18fe0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
18ff0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
19000 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
19010 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
19020 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
19030 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19040 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
19050 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
19060 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19070 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
19080 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19090 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
190a0 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
190b0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
190c0 74 28 20 6f 66 66 73 65 74 3e 3d 70 46 69 6c 65  t( offset>=pFile
190d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 20 20 2f  ->mmapSize );  /
190e0 2a 20 4e 65 76 65 72 20 72 65 61 64 20 66 72 6f  * Never read fro
190f0 6d 20 74 68 65 20 6d 6d 61 70 70 65 64 20 72 65  m the mmapped re
19100 67 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  gion */..  /* If
19110 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
19120 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
19130 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
19140 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
19150 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
19160 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
19170 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
19180 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
19190 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
191a0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
191b0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
191c0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
191d0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
191e0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
191f0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
19200 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
19210 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
19220 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19230 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
19240 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
19250 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
19260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
19270 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
19280 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
19290 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
192a0 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
192b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
192c0 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
192d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
192e0 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
192f0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
19300 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
19310 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
19320 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
19330 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
19340 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
19350 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
19360 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
19370 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19380 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
19390 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
193a0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
193b0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
193c0 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
193d0 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
193e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
193f0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
19400 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
19410 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
19420 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
19430 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
19440 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
19450 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
19460 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19470 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
19480 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19490 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
194a0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
194b0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
194c0 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
194d0 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
194e0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
194f0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
19500 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
19510 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
19520 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  et;.#endif.  ass
19530 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
19540 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e 74  x1ffff) );.  cnt
19550 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54   &= 0x1ffff;.  T
19560 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
19570 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19580 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
19590 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  sPwrite(id->h, p
195a0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
195b0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
195c0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
195d0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
195e0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
195f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
19600 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
19610 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19620 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
19630 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
19640 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
19650 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
19660 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
19670 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
19680 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19690 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
196a0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
196b0 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
196c0 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
196d0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
196e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
196f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
19700 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rrno;.      }els
19710 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  e{.        ((uni
19720 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19730 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Errno = 0;.     
19740 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
19750 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  -1;.    }.    go
19760 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e  t = osWrite(id->
19770 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20  h, pBuf, cnt);. 
19780 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
19790 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
197a0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
197b0 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
197c0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
197d0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
197e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
197f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
19800 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
19810 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
19820 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
19830 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
19840 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
19850 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
19860 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
19870 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
19880 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19890 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
198a0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
198b0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
198c0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
198d0 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
198e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
198f0 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
19900 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19910 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19920 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
19930 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19940 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19950 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
19960 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
19970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
19980 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19990 6f 66 66 73 65 74 3e 3d 70 46 69 6c 65 2d 3e 6d  offset>=pFile->m
199a0 6d 61 70 53 69 7a 65 20 29 3b 20 20 20 2f 2a 20  mapSize );   /* 
199b0 4e 65 76 65 72 20 77 72 69 74 65 20 69 6e 74 6f  Never write into
199c0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 72 65 67   the mmapped reg
199d0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ion */..  /* If 
199e0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
199f0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
19a00 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
19a10 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
19a20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
19a30 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
19a40 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
19a50 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
19a60 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
19a70 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
19a80 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
19a90 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19aa0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
19ab0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
19ac0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
19ad0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
19ae0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
19af0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
19b00 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
19b10 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
19b20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19b30 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
19b40 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
19b50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
19b60 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
19b70 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
19b80 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
19b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
19ba0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
19bb0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
19bc0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
19bd0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
19be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19bf0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
19c00 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
19c10 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
19c20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
19c30 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
19c40 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
19c50 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
19c60 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
19c70 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
19c80 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
19c90 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
19ca0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
19cb0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
19cc0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
19cd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19ce0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19cf0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
19d00 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
19d10 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
19d20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19d30 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
19d40 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
19d50 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
19d60 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
19d70 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
19d80 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
19d90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
19da0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
19db0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19dc0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
19dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19de0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
19df0 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
19e00 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
19e10 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19e20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
19e30 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
19e40 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
19e50 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
19e60 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
19e70 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
19e80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19e90 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
19ea0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
19eb0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19ec0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
19ed0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
19ee0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
19ef0 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
19f00 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
19f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
19f20 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
19f30 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
19f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19f50 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
19f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19f80 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
19f90 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19fb0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19fc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
19fe0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
19ff0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1a000 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1a010 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1a020 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1a030 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1a040 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1a050 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1a060 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1a070 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1a080 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1a090 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1a0a0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1a0b0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1a0c0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1a0d0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1a0e0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1a0f0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1a100 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1a110 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1a120 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1a130 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1a140 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1a150 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1a160 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1a170 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1a180 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1a190 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1a1a0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1a1b0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1a1c0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
1a1d0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1a1e0 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
1a1f0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1a200 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1a210 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1a220 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1a230 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1a240 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1a250 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1a260 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1a270 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1a280 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1a290 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1a2a0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1a2b0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1a2c0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1a2d0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1a2e0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a2f0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1a300 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1a310 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1a320 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1a330 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1a340 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1a350 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1a360 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1a370 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1a380 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1a390 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1a3a0 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1a3b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1a3c0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1a3d0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1a3e0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1a3f0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1a400 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1a410 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1a420 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1a430 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1a440 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1a450 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1a460 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1a470 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1a480 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1a490 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1a4a0 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1a4b0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1a4c0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1a4d0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1a4e0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1a4f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1a500 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1a510 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1a520 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a530 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1a540 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1a550 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1a560 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1a570 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1a580 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1a590 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1a5a0 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1a5b0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1a5c0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1a5d0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1a5e0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1a5f0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1a600 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1a610 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1a620 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1a630 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1a640 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1a650 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1a660 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1a670 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1a680 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1a690 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1a6a0 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1a6b0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1a6c0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1a6d0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1a6e0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1a6f0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1a700 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1a710 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1a720 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1a730 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1a740 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1a750 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1a760 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1a770 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1a780 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1a790 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1a7a0 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1a7b0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1a7c0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1a7d0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1a7e0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1a7f0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1a800 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1a810 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1a820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a830 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1a840 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1a850 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1a860 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1a870 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1a880 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1a890 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1a8a0 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1a8b0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1a8c0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1a8d0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1a8e0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1a8f0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1a900 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1a910 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1a920 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1a930 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1a940 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1a950 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a960 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a970 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1a980 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a990 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1a9a0 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1a9b0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1a9c0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1a9d0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1a9e0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1a9f0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1aa00 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1aa10 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1aa20 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1aa30 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1aa40 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1aa50 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1aa60 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1aa70 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1aa80 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1aa90 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1aaa0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1aab0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1aac0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1aad0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1aae0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1aaf0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1ab00 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1ab10 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1ab20 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1ab30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1ab40 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1ab50 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1ab60 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1ab70 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1ab80 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1ab90 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1aba0 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1abb0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1abc0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1abd0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1abe0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1abf0 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1ac00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1ac10 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1ac20 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1ac30 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1ac40 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1ac50 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1ac60 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1ac70 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1ac80 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1ac90 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1aca0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1acb0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1acc0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1acd0 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1ace0 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1acf0 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1ad00 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1ad10 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1ad20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1ad30 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1ad40 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1ad50 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1ad60 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1ad70 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1ad80 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1ad90 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1ada0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1adb0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1adc0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1add0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1ade0 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1adf0 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1ae00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1ae10 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1ae20 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1ae30 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1ae40 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1ae50 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1ae60 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1ae70 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1ae80 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1ae90 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1aea0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1aeb0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1aec0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1aed0 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1aee0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1aef0 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1af00 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1af10 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1af20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1af30 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1af40 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1af50 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1af60 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1af70 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1af80 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1af90 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1afa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1afb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1afc0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1afd0 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1afe0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1aff0 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1b000 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b010 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1b020 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1b030 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1b040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b050 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1b060 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1b070 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1b080 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1b090 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1b0a0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1b0b0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1b0c0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1b0d0 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1b0e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1b0f0 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1b100 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1b110 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1b120 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1b130 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1b140 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1b150 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1b160 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1b170 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1b180 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1b190 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1b1a0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1b1b0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1b1c0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1b1d0 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1b1e0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1b1f0 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1b200 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1b210 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1b220 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1b230 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1b240 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1b250 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1b260 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1b270 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1b280 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1b290 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1b2a0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1b2b0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1b2c0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1b2d0 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1b2e0 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1b2f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1b300 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1b310 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1b320 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1b330 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1b340 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1b350 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1b360 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1b370 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1b380 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1b390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1b3a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b3b0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1b3c0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1b3d0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1b3e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b3f0 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1b400 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1b410 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1b420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b430 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1b440 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1b450 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1b460 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1b470 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1b480 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1b490 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1b4a0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1b4b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1b4c0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1b4d0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1b4e0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1b4f0 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1b500 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1b510 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1b520 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1b530 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1b540 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1b550 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1b560 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  fd>=0 ){.      O
1b570 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1b580 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1b590 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1b5a0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1b5b0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1b5c0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1b5d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1b5e0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1b5f0 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1b600 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1b610 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1b620 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1b630 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1b640 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1b650 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1b660 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1b670 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1b680 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1b690 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1b6a0 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1b6b0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1b6c0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1b6d0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1b6e0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1b6f0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1b700 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1b710 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1b720 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1b730 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1b740 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1b750 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1b760 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1b770 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1b780 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1b790 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1b7a0 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1b7b0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1b7c0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1b7d0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1b7e0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1b7f0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1b800 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1b810 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1b820 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1b830 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1b840 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1b850 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1b860 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1b870 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1b880 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1b890 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1b8a0 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1b8b0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1b8c0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1b8d0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1b8e0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1b8f0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1b900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b910 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1b920 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1b930 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1b940 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1b950 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1b960 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1b970 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1b980 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1b990 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1b9a0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1b9b0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1b9c0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1b9d0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1b9e0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1b9f0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1ba00 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1ba10 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1ba20 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1ba30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1ba40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1ba50 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1ba60 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1ba70 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1ba80 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1ba90 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1baa0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1bab0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1bac0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1bad0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1bae0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1baf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1bb00 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1bb10 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1bb20 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1bb30 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1bb40 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1bb50 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1bb60 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1bb70 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1bb80 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1bb90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1bba0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1bbb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1bbc0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1bbd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1bbe0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1bbf0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1bc00 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1bc10 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1bc20 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1bc30 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1bc40 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1bc50 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1bc60 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1bc70 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61   occurrance.  Ma
1bc80 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1bc90 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1bca0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1bcb0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1bcc0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1bcd0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1bce0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1bcf0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1bd00 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1bd10 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1bd20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1bd30 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1bd40 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1bd50 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1bd60 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1bd70 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1bd80 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1bd90 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1bda0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1bdb0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1bdc0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1bdd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1bde0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1bdf0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1be00 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1be10 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1be20 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1be30 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1be40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1be50 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1be60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1be70 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1be80 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1be90 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1bea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1beb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1bec0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1bed0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1bee0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1bef0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1bf00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1bf10 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1bf20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1bf30 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1bf40 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1bf50 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1bf60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bf70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1bf80 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1bf90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1bfa0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1bfb0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1bfc0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1bfd0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1bfe0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1bff0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1c000 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1c010 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1c020 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1c030 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1c040 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1c050 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1c060 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1c070 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1c080 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1c090 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1c0a0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1c0b0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1c0c0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1c0d0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c0e0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1c0f0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1c100 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1c110 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1c120 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1c130 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1c140 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1c150 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1c160 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1c170 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1c180 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1c190 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1c1a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c1b0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1c1c0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1c1d0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1c1e0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1c1f0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1c200 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1c210 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1c220 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1c230 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1c240 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1c250 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1c260 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1c270 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1c280 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1c290 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1c2a0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1c2b0 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1c2c0 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1c2d0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1c2e0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1c2f0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1c300 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1c310 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1c320 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1c330 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1c340 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1c350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1c360 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1c370 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1c380 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1c390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1c3a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1c3b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1c3c0 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1c3d0 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1c3e0 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1c3f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1c400 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1c410 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1c420 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1c430 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1c440 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1c450 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1c460 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1c470 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1c480 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1c490 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
1c4a0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1c4b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1c4c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c4d0 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70  _FSTAT;.  }.  *p
1c4e0 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69  Size = buf.st_si
1c4f0 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f  ze;..  /* When o
1c500 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69  pening a zero-si
1c510 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ze database, the
1c520 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
1c530 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1c540 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20  writes a single 
1c550 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66  byte into that f
1c560 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
1c570 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75  work around a bu
1c580 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53  g.  ** in the OS
1c590 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  -X msdos filesys
1c5a0 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  tem.  In order t
1c5b0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1c5c0 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a   with upper.  **
1c5d0 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64   layers, we need
1c5e0 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20   to report this 
1c5f0 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72  file size as zer
1c600 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  o even though it
1c610 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20   is.  ** really 
1c620 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36  1.   Ticket #326
1c630 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70  0..  */.  if( *p
1c640 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65  Size==1 ) *pSize
1c650 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e   = 0;...  return
1c660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1c670 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1c680 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1c690 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1c6a0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  E__)./*.** Handl
1c6b0 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63  er for proxy-loc
1c6c0 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  king file-contro
1c6d0 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65  l verbs.  Define
1c6e0 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a  d below in the.*
1c6f0 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  * proxying locki
1c700 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  ng division..*/.
1c710 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
1c720 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1c730 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f  te3_file*,int,vo
1c740 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  id*);.#endif../*
1c750 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
1c760 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1c770 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54  handle the SQLIT
1c780 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1c790 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72  T .** file-contr
1c7a0 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45  ol operation.  E
1c7b0 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62  nlarge the datab
1c7c0 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e  ase to nBytes in
1c7d0 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65   size.** (rounde
1c7e0 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74  d up to the next
1c7f0 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49   chunk-size).  I
1c800 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1c810 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79  s already.** nBy
1c820 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74  tes or larger, t
1c830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1c840 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c850 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48  c int fcntlSizeH
1c860 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  int(unixFile *pF
1c870 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  ile, i64 nByte){
1c880 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1c890 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69  Chunk>0 ){.    i
1c8a0 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  64 nSize;       
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8c0 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  Required file si
1c8d0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
1c8e0 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20   stat buf;      
1c8f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1c900 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76  to hold return v
1c910 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29  alues of fstat()
1c920 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20   */.   .    if( 
1c930 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
1c940 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e  , &buf) ) return
1c950 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1c960 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20  TAT;..    nSize 
1c970 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1c980 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1c990 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1c9a0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1c9b0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1c9c0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1c9d0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1c9e0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1c9f0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1ca00 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1ca10 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1ca20 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1ca30 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1ca40 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1ca50 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1ca60 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1ca70 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1ca80 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1ca90 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1caa0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1cab0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1cac0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1cad0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1cae0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1caf0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1cb00 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1cb10 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1cb20 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1cb30 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1cb40 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1cb50 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1cb60 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1cb70 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1cb80 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1cb90 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1cba0 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1cbb0 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1cbc0 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1cbd0 20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20   it. First use. 
1cbe0 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74       ** ftruncat
1cbf0 65 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66  e() to set the f
1cc00 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77  ile size, then w
1cc10 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79  rite a single by
1cc20 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  te to.      ** t
1cc30 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20  he last byte in 
1cc40 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69  each block withi
1cc50 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
1cc60 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20  egion. This.    
1cc70 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1cc80 20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20   technique used 
1cc90 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c  by glibc to impl
1cca0 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c  ement posix_fall
1ccb0 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  ocate().      **
1ccc0 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74   on systems that
1ccd0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1cce0 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
1ccf0 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20  system call..   
1cd00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1cd10 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1cd20 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1cd30 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1cd40 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1cd50 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1cd60 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1cd70 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1cd80 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  o */..      if( 
1cd90 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1cda0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
1cdb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1cdc0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1cdd0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1cde0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1cdf0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1ce00 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1ce10 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1ce20 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1ce30 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1ce40 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1ce50 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1ce60 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69  Blk-1;.      whi
1ce70 6c 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  le( iWrite<nSize
1ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1ce90 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1cea0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1ceb0 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1cec0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1ced0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1cee0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1cef0 20 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b          iWrite +
1cf00 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a  = nBlk;.      }.
1cf10 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1cf20 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1cf30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1cf40 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1cf50 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1cf60 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1cf70 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1cf80 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1cf90 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1cfa0 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1cfb0 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1cfc0 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1cfd0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1cfe0 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1cff0 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1d000 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1d010 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1d020 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1d030 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1d040 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1d050 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1d060 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1d070 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1d080 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1d090 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1d0a0 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1d0b0 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1d0c0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1d0d0 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1d0e0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1d0f0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1d100 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1d110 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1d120 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1d130 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1d140 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1d150 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1d160 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1d170 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1d180 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1d190 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d1a0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1d1b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1d1c0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1d1d0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d1e0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1d1f0 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1d200 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1d210 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1d220 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1d230 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1d240 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1d250 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d260 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d270 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
1d280 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1d290 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1d2a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1d2b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d2c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d2d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d2e0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1d2f0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1d300 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1d310 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1d320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d330 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d340 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1d350 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1d360 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1d370 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1d380 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1d390 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1d3a0 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1d3b0 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1d3c0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1d3d0 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1d3e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d3f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1d400 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1d410 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1d420 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1d430 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1d440 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1d450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d460 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d470 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1d480 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1d490 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1d4a0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1d4b0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1d4c0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1d4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d4e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d4f0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1d500 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1d510 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1d520 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d530 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1d540 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1d550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d560 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d570 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1d580 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1d590 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1d5a0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1d5b0 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56  alloc( pFile->pV
1d5c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1d5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1d5e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1d5f0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1d600 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1d610 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1d620 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1d630 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1d640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1d650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d660 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1d670 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 46  QLITE_FCNTL_GETF
1d680 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  D: {.      *(int
1d690 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1d6a0 68 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  h;.      return 
1d6b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d6c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d6d0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1d6e0 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1d6f0 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1d700 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1d710 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1d720 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1d730 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1d740 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1d750 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1d760 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1d770 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1d780 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1d790 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1d7a0 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1d7b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d7c0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1d7d0 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1d7e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1d7f0 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1d800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d810 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1d820 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1d830 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1d840 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1d850 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1d860 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1d870 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1d880 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1d890 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1d8a0 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1d8b0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1d8c0 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1d8d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d8e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d8f0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1d900 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1d910 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1d920 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
1d930 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d940 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
1d950 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
1d960 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
1d970 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
1d980 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
1d990 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
1d9a0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
1d9b0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
1d9c0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
1d9d0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
1d9e0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
1d9f0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1da00 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
1da10 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
1da20 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
1da30 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
1da40 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
1da50 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
1da60 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
1da70 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
1da80 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
1da90 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1daa0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
1dab0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
1dac0 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
1dad0 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __ .static int u
1dae0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1daf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1db00 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1db10 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1db20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1db30 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1db40 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66  R_SIZE;.}.#endif
1db50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1db60 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66  owing version of
1db70 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1db80 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  ) is optimized f
1db90 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65  or QNX..*/.#ifde
1dba0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e  f __QNXNTO__.#in
1dbb0 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f  clude <sys/dcmd_
1dbc0 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  blk.h>.#include 
1dbd0 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a  <sys/statvfs.h>.
1dbe0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1dbf0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1dc00 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
1dc10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1dc20 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1dc30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
1dc40 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a  torSize == 0 ){.
1dc50 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76      struct statv
1dc60 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
1dc70 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65    .    /* Set de
1dc80 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73  faults for non-s
1dc90 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73  upported filesys
1dca0 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tems */.    pFil
1dcb0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1dcc0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1dcd0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20  ECTOR_SIZE;.    
1dce0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1dcf0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
1dd00 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76  ;.    if( fstatv
1dd10 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73  fs(pFile->h, &fs
1dd20 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
1dd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69        return pFi
1dd40 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
1dd50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
1dd60 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1dd70 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29  basetype, "tmp")
1dd80 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
1dd90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1dda0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1ddb0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1ddc0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1ddd0 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
1dde0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34  TE_IOCAP_ATOMIC4
1ddf0 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  K |       /* All
1de00 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1de10 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1de20 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1de30 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1de40 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1de50 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1de60 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1de70 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1dea0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1deb0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1dec0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1ded0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1dee0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1def0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1df00 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1df30 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1df40 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1df50 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
1df60 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1df70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20  e, "etfs") ){.  
1df80 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1df90 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1dfa0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1dfb0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1dfc0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1dfd0 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75       /* etfs clu
1dfe0 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73  ster size writes
1dff0 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1e000 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73         (pFile->s
1e010 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1e020 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1e030 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20  TOMIC512) |.    
1e040 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1e050 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
1e060 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
1e070 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
1e080 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
1e0c0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
1e0d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1e0e0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
1e0f0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
1e100 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
1e110 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
1e150 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
1e160 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e170 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
1e180 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36  _basetype, "qnx6
1e190 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1e1a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1e1b0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1e1c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1e1d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1e1e0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1e1f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1e200 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c   |         /* Al
1e210 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  l filesystem wri
1e220 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1e230 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1e240 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1e250 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1e260 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1e270 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1e280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1e2b0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1e2c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e2d0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1e2e0 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1e2f0 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1e300 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1e340 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1e350 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1e360 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
1e370 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1e380 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20   "qnx4") ){.    
1e390 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1e3a0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1e3b0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1e3c0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1e3d0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1e3e0 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1e3f0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1e400 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1e410 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1e420 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1e430 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1e440 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1e450 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1e460 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1e470 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1e480 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1e490 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1e4a0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1e4b0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1e4e0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1e4f0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1e500 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1e510 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
1e520 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20  asetype, "dos") 
1e530 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1e540 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1e550 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1e560 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1e570 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1e580 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c  =.        /* ful
1e590 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d  l bitset of atom
1e5a0 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63  ics from max sec
1e5b0 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61  tor size and sma
1e5c0 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ller */.        
1e5d0 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ((pFile->sectorS
1e5e0 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
1e5f0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1e600 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a  12) << 1) - 2 |.
1e610 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e620 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1e630 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1e640 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1e650 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1e690 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1e6a0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1e6b0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1e6c0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1e6d0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1e6e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1e6f0 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a  MIC512 |      /*
1e700 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d   blocks are atom
1e710 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1e720 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1e730 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1e740 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1e750 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1e760 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1e790 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1e7a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1e7b0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61     }.  }.  /* La
1e7c0 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69  st chance verifi
1e7d0 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  cation.  If the 
1e7e0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27  sector size isn'
1e7f0 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  t a multiple of 
1e800 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  512.  ** then it
1e810 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a   isn't valid.*/.
1e820 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
1e830 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d  torSize % 512 !=
1e840 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
1e850 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1e860 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
1e870 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e880 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1e890 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1e8a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69    }.  return pFi
1e8b0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
1e8c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e  }.#endif /* __QN
1e8d0 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XNTO__ */../*.**
1e8e0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1e8f0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1e900 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
1e910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20  .**.** This VFS 
1e920 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74  is set up to ret
1e930 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
1e940 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1e950 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e  RITE by default.
1e960 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61  .** However, tha
1e970 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74  t choice is cont
1e980 72 61 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20  raversial since 
1e990 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  technically the 
1e9a0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69  underlying.** fi
1e9b0 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  le system does n
1e9c0 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64  ot always provid
1e9d0 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72  e powersafe over
1e9e0 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68  writes.  (In oth
1e9f0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74  er.** words, aft
1ea00 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20  er a power-loss 
1ea10 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20  event, parts of 
1ea20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
1ea30 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74  re never.** writ
1ea40 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70  ten might end up
1ea50 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29   being altered.)
1ea60 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50    However, non-P
1ea70 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20  SOW behavior is 
1ea80 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61  very,.** very ra
1ea90 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69  re.  And asserti
1eaa0 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20  ng PSOW makes a 
1eab0 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20  large reduction 
1eac0 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  in the amount.**
1ead0 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f   of required I/O
1eae0 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c   for journaling,
1eaf0 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20   since a lot of 
1eb00 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69  padding is elimi
1eb10 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65  nated..**  Hence
1eb20 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46  , while POWERSAF
1eb30 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f  E_OVERWRITE is o
1eb40 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68  n by default, th
1eb50 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f  ere is a file-co
1eb60 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62  ntrol.** availab
1eb70 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
1eb80 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20  f and URI query 
1eb90 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61  parameter availa
1eba0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
1ebb0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
1ebc0 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
1ebd0 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1ebe0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1ebf0 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
1ec00 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1ec10 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
1ec20 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20  ef __QNXNTO__.  
1ec30 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a  if( p->sectorSiz
1ec40 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f  e==0 ) unixSecto
1ec50 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20  rSize(id);.  rc 
1ec60 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61  = p->deviceChara
1ec70 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64  cteristics;.#end
1ec80 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c  if.  if( p->ctrl
1ec90 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1eca0 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20  _PSOW ){.    rc 
1ecb0 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
1ecc0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ecd0 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ITE;.  }.  retur
1ece0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1ecf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ed00 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  .../*.** Object 
1ed10 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
1ed20 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
1ed30 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
1ed40 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
1ed50 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
1ed60 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
1ed70 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
1ed80 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
1ed90 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
1eda0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
1edb0 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
1edc0 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
1edd0 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
1ede0 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
1edf0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
1ee00 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
1ee10 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
1ee20 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
1ee30 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
1ee40 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1ee50 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
1ee60 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
1ee70 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
1ee80 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
1ee90 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
1eea0 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
1eeb0 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
1eec0 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
1eed0 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
1eee0 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
1eef0 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
1ef00 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
1ef10 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
1ef20 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
1ef30 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
1ef40 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
1ef50 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
1ef60 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
1ef70 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1ef80 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
1ef90 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
1efa0 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
1efb0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1efc0 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
1efd0 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
1efe0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1eff0 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1f000 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
1f010 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
1f020 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
1f030 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1f040 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
1f050 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
1f060 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
1f070 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1f080 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
1f090 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
1f0a0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
1f0b0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
1f0c0 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
1f0d0 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
1f0e0 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
1f0f0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
1f100 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
1f110 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
1f120 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
1f130 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
1f140 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
1f150 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
1f160 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
1f170 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
1f180 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
1f190 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1f1a0 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
1f1b0 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
1f1c0 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
1f1d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1f1e0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1f1f0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
1f200 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
1f210 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
1f220 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1f230 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
1f240 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1f250 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
1f260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f270 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
1f280 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
1f290 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1f2a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
1f2b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f2c0 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
1f2d0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1f2e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f2f0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
1f300 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
1f310 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
1f320 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
1f330 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
1f340 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
1f350 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1f360 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
1f370 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
1f380 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3a0 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
1f3b0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1f3c0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
1f3d0 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
1f3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1f3f0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
1f400 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1f410 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
1f420 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
1f430 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
1f440 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1f450 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
1f460 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
1f470 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
1f480 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1f490 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1f4a0 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
1f4b0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
1f4c0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
1f4d0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
1f4e0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1f4f0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
1f500 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
1f510 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
1f520 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
1f530 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
1f540 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
1f550 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1f560 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f570 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
1f580 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
1f590 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
1f5a0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
1f5b0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
1f5c0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
1f5d0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
1f5e0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
1f5f0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
1f600 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
1f610 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
1f620 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
1f630 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
1f640 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
1f650 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
1f660 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
1f670 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
1f680 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1f690 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
1f6a0 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
1f6b0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
1f6c0 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
1f6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1f6e0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
1f6f0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
1f700 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
1f710 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
1f720 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f730 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
1f740 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1f750 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f770 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
1f780 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
1f790 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
1f7a0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1f7b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1f7c0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1f7d0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1f7e0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1f7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f800 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1f810 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
1f820 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
1f830 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
1f840 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
1f850 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
1f860 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
1f870 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
1f880 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
1f890 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
1f8a0 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
1f8b0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
1f8c0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
1f8d0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
1f8e0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
1f8f0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
1f900 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
1f910 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
1f920 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
1f930 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
1f940 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
1f950 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
1f960 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
1f970 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
1f980 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1f990 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
1f9a0 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  temLock(.  unixS
1f9b0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1f9c0 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  , /* Apply locks
1f9d0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
1f9e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1f9f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
1fa00 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
1fa10 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
1fa20 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
1fa30 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1fa50 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
1fa60 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
1fa70 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
1fa80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fa90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1faa0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
1fab0 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
1fac0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
1fad0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
1fae0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
1faf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fb00 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  _OK;   /* Result
1fb10 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
1fb20 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
1fb30 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
1fb40 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1fb50 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1fb60 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1fb70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1fb80 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
1fb90 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
1fba0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1fbb0 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
1fbc0 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
1fbd0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
1fbe0 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
1fbf0 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65  n==1 || lockType
1fc00 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20  !=F_RDLCK );..  
1fc10 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74  /* Locks are wit
1fc20 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  hin range */.  a
1fc30 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e  ssert( n>=1 && n
1fc40 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  <SQLITE_SHM_NLOC
1fc50 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
1fc60 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
1fc70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1fc80 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1fc90 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65  meters */.    me
1fca0 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65  mset(&f, 0, size
1fcb0 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f  of(f));.    f.l_
1fcc0 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
1fcd0 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20  .    f.l_whence 
1fce0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
1fcf0 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
1fd00 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20  ;.    f.l_len = 
1fd10 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  n;..    rc = osF
1fd20 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
1fd30 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
1fd40 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
1fd50 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
1fd60 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
1fd70 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1fd80 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
1fd90 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
1fda0 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
1fdb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1fdc0 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
1fdd0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1fde0 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
1fdf0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
1fe00 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
1fe10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fe20 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
1fe30 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
1fe40 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1fe50 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
1fe60 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1fe70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1fe80 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1fe90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1fea0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1feb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1fec0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
1fed0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1fee0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
1fef0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1ff00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1ff10 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1ff20 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1ff30 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1ff40 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
1ff50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
1ff60 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
1ff70 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1ff80 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
1ff90 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1ffa0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1ffb0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
1ffc0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1ffd0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1ffe0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1fff0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
20000 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
20010 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
20020 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
20030 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
20040 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
20050 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
20060 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
20070 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
20080 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
20090 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
200a0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
200b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
200c0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
200d0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
200e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
200f0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
20100 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
20110 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
20120 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
20130 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
20140 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
20150 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
20160 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f  c;        .}.../
20170 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
20180 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
20190 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
201a0 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
201b0 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
201c0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
201d0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
201e0 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
201f0 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
20200 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
20210 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
20220 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
20230 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
20240 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
20250 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
20260 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
20270 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
20280 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
20290 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
202a0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65   if( p && p->nRe
202b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  f==0 ){.    int 
202c0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
202d0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
202e0 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c  Inode );.    sql
202f0 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
20300 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
20310 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
20320 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
20330 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
20340 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  .        munmap(
20350 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
20360 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
20370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20390 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
203a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
203b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
203c0 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
203d0 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
203e0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
203f0 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
20400 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
20410 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
20420 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
20430 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
20440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20450 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20460 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
20470 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
20480 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
20490 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
204a0 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
204b0 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
204c0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
204d0 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
204e0 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
204f0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
20500 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
20510 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
20520 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
20530 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
20540 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
20550 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
20560 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
20570 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
20580 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
20590 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
205a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
205b0 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
205c0 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
205d0 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
205e0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
205f0 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
20600 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
20610 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
20620 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
20630 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
20640 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
20650 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
20660 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
20670 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
20680 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
20690 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
206a0 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
206b0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
206c0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
206d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
206e0 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
206f0 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
20700 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
20710 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
20720 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
20730 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
20740 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
20750 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
20760 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
20770 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
20780 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
20790 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
207a0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
207b0 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
207c0 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
207d0 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
207e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
207f0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
20800 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
20810 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
20820 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
20830 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
20840 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
20850 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
20860 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
20870 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
20880 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
20890 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
208a0 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
208b0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
208c0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
208d0 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
208e0 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
208f0 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
20900 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
20910 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
20920 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
20930 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
20940 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
20950 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
20960 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20970 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
20980 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
20990 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
209a0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
209b0 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
209c0 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
209d0 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
209e0 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
209f0 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
20a00 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
20a10 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
20a20 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
20a30 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
20a40 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
20a50 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
20a60 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
20a70 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
20a80 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
20a90 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
20aa0 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
20ab0 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
20ac0 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
20ad0 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  ader cleared..**
20ae0 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69  .** If the origi
20af0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
20b00 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69  e (pDbFd) is usi
20b10 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63  ng the "unix-exc
20b20 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d  l" VFS.** that m
20b30 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63  eans that an exc
20b40 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
20b50 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
20b60 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  ase file and.** 
20b70 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
20b80 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65  ocesses are able
20b90 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
20ba0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
20bb0 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65   In.** that case
20bc0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c  , we do not real
20bd0 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d  ly need shared m
20be0 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65  emory.  No share
20bf0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65  d memory.** file
20c00 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
20c10 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
20c20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65  will be simulate
20c30 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f  d with heap memo
20c40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
20c50 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
20c60 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
20c70 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
20c80 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
20c90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
20ca0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
20cb0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
20cc0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
20cd0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
20ce0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
20cf0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
20d00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
20d30 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
20d40 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
20d50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
20d60 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
20d70 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d  har *zShmFilenam
20d80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
20d90 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
20da0 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
20db0 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
20dc0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
20dd0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20de0 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
20df0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
20e00 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
20e10 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
20e20 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
20e30 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
20e40 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
20e50 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
20e60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20e70 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
20e80 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
20e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
20ea0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
20eb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
20ec0 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
20ed0 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
20ee0 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
20ef0 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
20f00 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
20f10 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
20f20 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
20f30 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
20f40 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
20f50 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
20f60 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
20f70 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
20f80 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
20f90 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
20fa0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fc0 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
20fd0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
20fe0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  */..    /* Call 
20ff0 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72  fstat() to figur
21000 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73  e out the permis
21010 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74  sions on the dat
21020 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20  abase file. If. 
21030 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68     ** a new *-sh
21040 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  m file is create
21050 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69  d, an attempt wi
21060 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72  ll be made to cr
21070 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77  eate it.    ** w
21080 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72  ith the same per
21090 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f  missions..    */
210a0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
210b0 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61  (pDbFd->h, &sSta
210c0 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50  t) && pInode->bP
210d0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
210e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
210f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
21100 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
21110 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
21120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
21130 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
21140 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
21150 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
21160 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
21170 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
21180 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
21190 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
211a0 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
211b0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
211c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
211d0 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
211e0 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
211f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
21200 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
21210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21220 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
21230 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
21240 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
21250 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
21260 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68  f(*pShmNode)+nSh
21270 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
21280 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70  zShmFilename = p
21290 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
212a0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
212b0 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
212c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
212d0 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
212e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
212f0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
21300 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
21320 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
21330 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25  Y "/sqlite-shm-%
21340 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20  x-%x",.         
21350 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
21360 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28  )sStat.st_ino, (
21370 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76  u32)sStat.st_dev
21380 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
21390 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
213a0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
213b0 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
213c0 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
213d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
213e0 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
213f0 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65  >zPath, zShmFile
21400 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
21410 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
21420 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
21430 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
21440 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
21450 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
21460 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
21470 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
21480 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
21490 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
214a0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
214b0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
214c0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
214d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
214e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
214f0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
21500 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
21510 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
21520 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
21530 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
21540 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
21550 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
21560 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
21570 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
21580 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
21590 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   ){.        open
215a0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
215b0 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  ;.        pShmNo
215c0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
215d0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
215e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
215f0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
21600 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c  Filename, openFl
21610 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d  ags, (sStat.st_m
21620 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
21630 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
21640 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  h<0 ){.        r
21650 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
21660 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
21670 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
21680 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
21690 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
216a0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
216b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
216c0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
216d0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
216e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
216f0 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
21700 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
21710 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
21720 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
21730 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
21740 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
21750 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
21760 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
21770 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
21780 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
21790 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d     osFchown(pShm
217a0 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73  Node->h, sStat.s
217b0 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
217c0 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f  gid);.  .      /
217d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
217e0 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
217f0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
21800 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
21810 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ..      ** If no
21820 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
21830 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
21840 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  gth. .      */. 
21850 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21860 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75  _OK;.      if( u
21870 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21880 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
21890 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
218a0 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 1)==SQLITE_OK 
218b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
218c0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
218d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20  pShmNode->h, 0) 
218e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
218f0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
21900 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
21910 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22  PEN, "ftruncate"
21920 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
21930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21940 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
21950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21960 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
21970 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
21980 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
21990 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
219a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
219b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
219c0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
219d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
219e0 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
219f0 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
21a00 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
21a10 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
21a20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
21a30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21a40 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
21a50 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
21a60 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
21a70 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
21a80 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
21a90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
21aa0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
21ab0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
21ac0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
21ad0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
21ae0 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
21af0 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
21b00 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
21b10 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
21b20 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
21b30 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
21b40 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
21b50 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
21b60 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
21b70 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
21b80 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
21b90 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
21ba0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
21bb0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
21bc0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
21bd0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
21be0 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
21bf0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
21c00 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
21c10 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
21c20 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
21c30 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
21c40 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
21c50 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
21c60 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
21c70 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
21c80 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
21c90 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
21ca0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
21cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21cc0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
21cd0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
21ce0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
21cf0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
21d00 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
21d10 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
21d20 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
21d30 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
21d40 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
21d50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
21d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21d80 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
21d90 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
21da0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
21db0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
21dc0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
21dd0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
21de0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
21df0 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
21e00 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
21e10 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
21e20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
21e30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
21e40 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
21e50 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
21e60 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
21e70 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
21e80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
21e90 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
21ea0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
21eb0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
21ec0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
21ed0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
21ee0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
21ef0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
21f00 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
21f10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
21f20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
21f30 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
21f40 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
21f50 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
21f60 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
21f70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
21f80 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21f90 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
21fa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
21fb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
21fc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
21fd0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
21fe0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
21ff0 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
22000 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
22010 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
22020 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
22030 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
22040 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
22050 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
22060 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
22070 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
22080 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
22090 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
220a0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
220b0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
220c0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
220d0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
220e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
220f0 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
22100 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
22110 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
22120 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
22130 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
22140 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
22150 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
22160 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
22170 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
22180 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
22190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
221a0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
221b0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
221c0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
221d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
221e0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
221f0 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22210 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
22220 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
22230 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
22240 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
22250 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
22260 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
22270 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
22280 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
22290 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
222a0 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
222b0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
222c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
222d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  OK;..  /* If the
222e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
222f0 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
22300 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
22310 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
22320 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
22330 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
22340 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
22350 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
22360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22380 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
22390 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
223a0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
223b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
223c0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
223d0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
223e0 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
223f0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
22400 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
22410 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
22420 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
22430 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
22440 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
22450 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
22460 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
22470 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
22480 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
22490 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
224a0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
224b0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
224c0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
224d0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
224e0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
224f0 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22510 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
22520 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
22530 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
22540 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
22550 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
22560 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
22570 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
22580 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
22590 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
225a0 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
225b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
225c0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
225d0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
225e0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
225f0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
22600 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
22610 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
22620 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
22630 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
22640 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
22650 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
22660 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
22670 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
22680 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
22690 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
226a0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
226b0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
226c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
226d0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
226e0 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
226f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
22700 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
22710 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
22720 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
22730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
22740 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
22750 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
22760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
22770 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
22780 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
22790 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
227a0 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
227b0 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
227c0 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
227d0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
227e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
227f0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
22800 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c  **.        ** Al
22810 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
22820 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
22830 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
22840 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
22850 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
22860 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
22870 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
22880 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
22890 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70  tend ) goto shmp
228a0 61 67 65 5f 6f 75 74 3b 0a 23 69 66 20 64 65 66  age_out;.#if def
228b0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
228c0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
228d0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
228e0 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  TE.        if( o
228f0 73 46 61 6c 6c 6f 63 61 74 65 28 70 53 68 6d 4e  sFallocate(pShmN
22900 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
22910 5f 73 69 7a 65 2c 20 6e 42 79 74 65 29 21 3d 30  _size, nByte)!=0
22920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22930 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
22940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
22950 53 49 5a 45 2c 20 22 66 61 6c 6c 6f 63 61 74 65  SIZE, "fallocate
22960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22980 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
22990 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
229a0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
229b0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
229c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
229d0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
229e0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65  hmNode->h, nByte
229f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
22a00 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
22a10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
22a20 4d 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74  MSIZE, "ftruncat
22a30 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
22a60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
22a70 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
22a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
22a90 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  if.      }.    }
22aa0 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
22ab0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
22ac0 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
22ad0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
22ae0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
22af0 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
22b00 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
22b10 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
22b20 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
22b30 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
22b40 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20  eof(char *).    
22b50 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
22b60 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
22b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22b80 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
22b90 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
22ba0 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
22bb0 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  apRegion = apNew
22bc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d  ;.    while(pShm
22bd0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
22be0 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76  Region){.      v
22bf0 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
22c00 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
22c10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
22c20 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a  Mem = mmap(0, sz
22c30 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
22c40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
22c50 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f  Readonly ? PROT_
22c60 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44  READ : PROT_READ
22c70 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20  |PROT_WRITE, .  
22c80 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48            MAP_SH
22c90 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  ARED, pShmNode->
22ca0 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34  h, szRegion*(i64
22cb0 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  )pShmNode->nRegi
22cc0 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  on.        );.  
22cd0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
22ce0 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
22cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
22d00 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
22d10 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22  _IOERR_SHMMAP, "
22d20 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d  mmap", pShmNode-
22d30 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
22d40 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
22d50 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
22d60 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22d70 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73          pMem = s
22d80 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a  qlite3_malloc(sz
22d90 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
22da0 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
22db0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22dc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22dd0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
22de0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
22df0 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65   }.        memse
22e00 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67  t(pMem, 0, szReg
22e10 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
22e20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
22e30 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
22e40 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d  >nRegion] = pMem
22e50 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
22e60 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
22e70 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
22e80 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
22e90 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
22ea0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20  gion ){.    *pp 
22eb0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65  = pShmNode->apRe
22ec0 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  gion[iRegion];. 
22ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
22ee0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
22ef0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
22f00 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nly && rc==SQLIT
22f10 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
22f20 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73  TE_READONLY;.  s
22f30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
22f40 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
22f50 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
22f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22f70 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
22f80 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
22f90 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a  mory segment..**
22fa0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
22fb0 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
22fc0 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e  etween SHAREd an
22fd0 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  d EXCLUSIVE lock
22fe0 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a  s is a little.**
22ff0 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20   different here 
23000 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20  than in posix.  
23010 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f  In xShmLock(), o
23020 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75  ne can go from u
23030 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68  nlocked.** to sh
23040 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72  ared and back or
23050 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
23060 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20  o exclusive and 
23070 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d  back.  But one m
23080 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f  ay.** not go fro
23090 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c  m shared to excl
230a0 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78  usive or from ex
230b0 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65  clusive to share
230c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
230d0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20   unixShmLock(.  
230e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
230f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
23100 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
23110 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
23120 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
23130 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
23140 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
23150 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
23160 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
23170 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
23180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23190 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
231a0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
231b0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
231c0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
231d0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
231e0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
231f0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23200 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23210 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20  le*)fd;      /* 
23220 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
23230 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
23240 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
23250 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
23260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23270 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
23280 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
23290 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20  .  unixShm *pX; 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
232c0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
232d0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75   siblings */.  u
232e0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
232f0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
23300 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  de;  /* The unde
23310 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64  rlying file iNod
23320 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
23330 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23350 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
23360 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23390 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
233a0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
233b0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
233c0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
233d0 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
233e0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
233f0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
23400 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
23410 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
23420 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
23430 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
23440 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
23450 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
23460 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
23470 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
23480 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
23490 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
234a0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
234b0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
234c0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
234d0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
234e0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
234f0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
23500 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
23510 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
23520 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
23530 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
23540 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
23550 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
23560 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20  LUSIVE)!=0 );.  
23570 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
23580 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
23590 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
235a0 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
235b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
235c0 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
235d0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
235e0 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  ck==0 );..  mask
235f0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
23600 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
23610 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
23620 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
23630 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
23640 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
23650 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
23660 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
23670 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
23680 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
23690 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
236a0 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
236b0 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
236c0 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
236d0 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
236e0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
236f0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
23700 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
23710 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
23720 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
23730 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
23740 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
23750 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
23760 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
23770 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
23780 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
23790 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
237a0 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
237b0 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
237c0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
237d0 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
237e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
237f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
23800 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55  ck(pShmNode, F_U
23810 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  NLCK, ofst+UNIX_
23820 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
23830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
23840 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23850 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
23860 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
23870 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
23880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23890 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
238a0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
238b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
238c0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
238d0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
238e0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
238f0 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
23900 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
23910 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
23920 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
23930 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
23940 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
23950 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
23960 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
23970 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
23980 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
23990 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
239a0 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
239b0 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
239c0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
239d0 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
239e0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
239f0 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
23a00 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
23a10 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
23a20 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
23a30 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
23a40 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
23a50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
23a60 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
23a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23a80 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
23a90 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
23aa0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
23ab0 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
23ac0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
23ad0 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
23ae0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
23af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23b00 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
23b10 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
23b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
23b30 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
23b40 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
23b50 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  RDLCK, ofst+UNIX
23b60 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
23b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23b80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23b90 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
23ba0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
23bb0 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
23bc0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
23bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23be0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
23bf0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
23c00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23c10 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
23c20 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
23c30 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
23c40 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
23c50 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
23c60 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
23c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
23c80 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
23c90 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
23ca0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
23cb0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23cc0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
23cd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
23ce0 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
23cf0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
23d00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
23d20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
23d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23d40 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
23d50 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
23d60 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
23d70 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
23d80 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
23d90 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
23da0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
23db0 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
23dc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23de0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
23df0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
23e00 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
23e10 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
23e20 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
23e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23e40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
23e50 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
23e60 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
23e70 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
23e80 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
23e90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23ea0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23eb0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
23ec0 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
23ed0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d  E(("SHM-LOCK shm
23ee0 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
23ef0 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  t %03x,%03x\n",.
23f00 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64             p->id
23f10 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73  , getpid(), p->s
23f20 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
23f30 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75  clMask));.  retu
23f40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f50 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
23f60 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
23f70 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
23f80 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
23f90 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
23fa0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
23fb0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
23fc0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
23fd0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
23fe0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
23ff0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
24000 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
24010 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
24020 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
24030 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
24040 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
24050 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
24060 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
24070 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
24080 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
24090 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
240a0 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ();.  unixLeaveM
240b0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
240c0 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
240d0 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
240e0 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
240f0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
24100 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
24110 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
24120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
24130 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f  s no shared memo
24140 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
24150 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  th the connectio
24160 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  n then this.** r
24170 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
24180 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  less no-op..*/.s
24190 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
241a0 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
241b0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
241c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
241d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
241e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
241f0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24210 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d  * Delete shared-
24220 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a  memory if true *
24230 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  /.){.  unixShm *
24240 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
24250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
24260 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
24270 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
24280 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
24290 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
242a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
242b0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
242c0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
242d0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
242e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
242f0 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
24300 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
24310 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
24320 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
24330 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
24340 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
24350 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
24360 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
24370 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
24380 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
24390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
243a0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
243b0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73  >pShmNode;..  as
243c0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
243d0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
243e0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
243f0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
24400 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
24410 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  node );..  /* Re
24420 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
24430 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
24440 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
24450 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
24460 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
24470 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
24480 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
24490 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
244a0 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
244b0 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
244c0 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
244d0 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
244e0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
244f0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
24500 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
24510 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
24520 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
24530 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
24540 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24550 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
24560 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
24570 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
24580 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
24590 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
245a0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
245b0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
245c0 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
245d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
245e0 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
245f0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
24600 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
24610 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
24620 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f  teFlag && pShmNo
24630 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c  de->h>=0 ) osUnl
24640 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
24650 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e  ilename);.    un
24660 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
24670 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
24680 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
24690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
246a0 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
246b0 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
246c0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
246d0 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
246e0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
246f0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
24700 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
24710 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
24720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24730 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72  WAL */../*.** Ar
24740 67 75 6d 65 6e 74 73 20 78 20 61 6e 64 20 79 20  guments x and y 
24750 61 72 65 20 62 6f 74 68 20 69 6e 74 65 67 65 72  are both integer
24760 73 2e 20 41 72 67 75 6d 65 6e 74 20 79 20 6d 75  s. Argument y mu
24770 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
24780 20 32 2e 0a 2a 2a 20 52 6f 75 6e 64 20 78 20 75   2..** Round x u
24790 70 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  p to the nearest
247a0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
247b0 65 20 6f 66 20 79 2e 20 46 6f 72 20 65 78 61 6d  e of y. For exam
247c0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ple:.**.**     R
247d0 4f 55 4e 44 55 50 28 30 2c 20 20 38 29 20 2d 3e  OUNDUP(0,  8) ->
247e0 20 20 30 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44    0.**     ROUND
247f0 55 50 28 31 33 2c 20 38 29 20 2d 3e 20 31 36 0a  UP(13, 8) -> 16.
24800 2a 2a 20 20 20 20 20 52 4f 55 4e 44 55 50 28 33  **     ROUNDUP(3
24810 32 2c 20 38 29 20 2d 3e 20 33 32 0a 2a 2f 0a 23  2, 8) -> 32.*/.#
24820 64 65 66 69 6e 65 20 52 4f 55 4e 44 55 50 28 78  define ROUNDUP(x
24830 2c 79 29 20 20 20 20 20 28 28 28 78 29 2b 79 2d  ,y)     (((x)+y-
24840 31 29 26 7e 28 79 2d 31 29 29 0a 0a 2f 2a 0a 2a  1)&~(y-1))../*.*
24850 2a 20 4d 61 70 2c 20 72 65 6d 61 70 20 6f 72 20  * Map, remap or 
24860 75 6e 6d 61 70 20 70 61 72 74 20 6f 66 20 74 68  unmap part of th
24870 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
24890 6e 69 78 4d 72 65 6d 61 70 28 0a 20 20 73 71 6c  nixMremap(.  sql
248a0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248c0 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  Main database fi
248d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
248e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
248f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
24900 6f 66 20 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50  of SQLITE_MREMAP
24910 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
24920 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
24930 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ff,             
24940 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 73 74 61  /* Offset to sta
24950 72 74 20 6d 61 70 70 69 6e 67 20 61 74 20 2a 2f  rt mapping at */
24960 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
24970 20 6e 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20   nOld,          
24980 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 6c     /* Size of ol
24990 64 20 6d 61 70 70 69 6e 67 2c 20 6f 72 20 7a 65  d mapping, or ze
249a0 72 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ro */.  sqlite3_
249b0 69 6e 74 36 34 20 6e 4e 65 77 2c 20 20 20 20 20  int64 nNew,     
249c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
249d0 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 2c 20  of new mapping, 
249e0 6f 72 20 7a 65 72 6f 20 2a 2f 0a 20 20 76 6f 69  or zero */.  voi
249f0 64 20 2a 2a 70 70 4d 61 70 20 20 20 20 20 20 20  d **ppMap       
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a10 49 4e 2f 4f 55 54 3a 20 4f 6c 64 2f 6e 65 77 20  IN/OUT: Old/new 
24a20 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 29 7b 0a 20  mappings */.){. 
24a30 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
24a40 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
24a50 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
24a60 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
24a70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
24a80 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
24a90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24aa0 63 6f 64 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  code */.  void *
24ab0 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
24ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
24ad0 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36   mapping */.  i6
24ae0 34 20 6e 4e 65 77 52 6e 64 3b 20 20 20 20 20 20  4 nNewRnd;      
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b00 20 6e 4e 65 77 20 72 6f 75 6e 64 65 64 20 75 70   nNew rounded up
24b10 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 6c 64 52 6e   */.  i64 nOldRn
24b20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
24b30 20 20 20 20 20 20 2f 2a 20 6e 4f 6c 64 20 72 6f        /* nOld ro
24b40 75 6e 64 65 64 20 75 70 20 2a 2f 0a 0a 20 20 61  unded up */..  a
24b50 73 73 65 72 74 28 20 69 4f 66 66 3d 3d 30 20 29  ssert( iOff==0 )
24b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
24b70 6d 61 70 53 69 7a 65 3d 3d 6e 4f 6c 64 20 29 3b  mapSize==nOld );
24b80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4d  .  assert( p->pM
24b90 61 70 52 65 67 69 6f 6e 3d 3d 30 20 7c 7c 20 70  apRegion==0 || p
24ba0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 28 2a  ->pMapRegion==(*
24bb0 70 70 4d 61 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  ppMap) );..  /* 
24bc0 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 52  If the SQLITE_MR
24bd0 45 4d 41 50 5f 45 58 54 45 4e 44 20 66 6c 61 67  EMAP_EXTEND flag
24be0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
24bf0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
24c00 71 75 65 73 74 65 64 20 0a 20 20 2a 2a 20 6d 61  quested .  ** ma
24c10 70 70 69 6e 67 20 28 6e 4e 65 77 20 62 79 74 65  pping (nNew byte
24c20 73 29 20 6d 61 79 20 62 65 20 67 72 65 61 74 65  s) may be greate
24c30 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65 20  r than the size 
24c40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24c50 66 69 6c 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68  file..  ** If th
24c60 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
24c70 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 20  extend the file 
24c80 6f 6e 20 64 69 73 6b 20 75 73 69 6e 67 20 66 74  on disk using ft
24c90 72 75 6e 63 61 74 65 28 29 2e 20 20 2a 2f 0a 20  runcate().  */. 
24ca0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
24cb0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
24cc0 54 45 5f 4d 52 45 4d 41 50 5f 45 58 54 45 4e 44  TE_MREMAP_EXTEND
24cd0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c  )==0 );.  if( fl
24ce0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4d 52 45  ags & SQLITE_MRE
24cf0 4d 41 50 5f 45 58 54 45 4e 44 20 29 7b 0a 20 20  MAP_EXTEND ){.  
24d00 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
24d10 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
24d20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
24d30 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
24d40 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
24d50 74 28 70 2d 3e 68 2c 20 26 73 74 61 74 62 75 66  t(p->h, &statbuf
24d60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24d70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4e 65 77  QLITE_OK && nNew
24d80 3e 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65  >statbuf.st_size
24d90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
24da0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
24db0 70 2d 3e 68 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  p->h, nNew);.   
24dc0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
24dd0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24de0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
24df0 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 6f 6d  According to som
24e00 65 20 73 6f 75 72 63 65 73 2c 20 74 68 65 20 65  e sources, the e
24e10 66 66 65 63 74 20 6f 66 20 63 68 61 6e 67 69 6e  ffect of changin
24e20 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  g the size of th
24e30 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  e.  ** underlyin
24e40 67 20 66 69 6c 65 20 6f 6e 20 6d 61 70 70 65 64  g file on mapped
24e50 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 63 6f   regions that co
24e60 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
24e70 61 64 64 65 64 20 6f 72 0a 20 20 2a 2a 20 72 65  added or.  ** re
24e80 6d 6f 76 65 64 20 70 61 67 65 73 20 69 73 20 75  moved pages is u
24e90 6e 64 65 66 69 6e 65 64 2e 20 48 6f 77 65 76 65  ndefined. Howeve
24ea0 72 2c 20 74 68 65 72 65 20 69 73 20 72 65 61 73  r, there is reas
24eb0 6f 6e 20 74 6f 20 62 65 6c 69 65 76 65 20 74 68  on to believe th
24ec0 61 74 0a 20 20 2a 2a 20 6f 6e 20 6d 6f 64 65 72  at.  ** on moder
24ed0 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6c 69 6b 65  n platforms like
24ee0 20 4c 69 6e 75 78 20 6f 72 20 4f 53 58 2c 20 74   Linux or OSX, t
24ef0 68 69 6e 67 73 20 6a 75 73 74 20 77 6f 72 6b 2e  hings just work.
24f00 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 20 20   For example,.  
24f10 2a 2a 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ** it is possibl
24f20 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6d 61  e to create a ma
24f30 70 70 69 6e 67 20 6c 61 72 67 65 72 20 74 68 61  pping larger tha
24f40 6e 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  n the file on di
24f50 73 6b 20 61 6e 64 0a 20 20 2a 2a 20 65 78 74 65  sk and.  ** exte
24f60 6e 64 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  nd the file on d
24f70 69 73 6b 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20  isk later on..  
24f80 2a 2a 0a 20 20 2a 2a 20 45 78 70 6c 6f 69 74 20  **.  ** Exploit 
24f90 74 68 69 73 20 6f 6e 20 4c 69 6e 75 78 20 61 6e  this on Linux an
24fa0 64 20 4f 53 58 20 74 6f 20 72 65 64 75 63 65 20  d OSX to reduce 
24fb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 75  the number of mu
24fc0 6e 6d 61 70 28 29 2f 6d 6d 61 70 28 29 20 0a 20  nmap()/mmap() . 
24fd0 20 2a 2a 20 63 61 6c 6c 73 20 72 65 71 75 69 72   ** calls requir
24fe0 65 64 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ed if the file s
24ff0 69 7a 65 20 69 73 20 63 68 61 6e 67 69 6e 67 2e  ize is changing.
25000 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
25010 6c 20 6d 61 70 70 69 6e 67 73 20 0a 20 20 2a 2a  l mappings .  **
25020 20 61 72 65 20 72 6f 75 6e 64 65 64 20 75 70 20   are rounded up 
25030 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 34  to the nearest 4
25040 4d 42 2e 20 41 6e 64 20 69 66 20 61 20 6e 65 77  MB. And if a new
25050 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 71 75   mapping is requ
25060 65 73 74 65 64 20 0a 20 20 2a 2a 20 74 68 61 74  ested .  ** that
25070 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 72 6f   has the same ro
25080 75 6e 64 65 64 20 73 69 7a 65 20 61 73 20 61 6e  unded size as an
25090 20 6f 6c 64 20 6d 61 70 70 69 6e 67 2c 20 74 68   old mapping, th
250a0 65 20 6f 6c 64 20 6d 61 70 70 69 6e 67 20 63 61  e old mapping ca
250b0 6e 20 0a 20 20 2a 2a 20 62 65 20 72 65 75 73 65  n .  ** be reuse
250c0 64 20 61 73 20 69 73 2e 20 2a 2f 0a 23 69 66 20  d as is. */.#if 
250d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
250e0 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
250f0 6c 69 6e 75 78 5f 5f 29 0a 20 20 6e 4e 65 77 52  linux__).  nNewR
25100 6e 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e 4e 65  nd = ROUNDUP(nNe
25110 77 2c 20 34 30 39 36 2a 31 30 32 34 29 3b 0a 20  w, 4096*1024);. 
25120 20 6e 4f 6c 64 52 6e 64 20 3d 20 52 4f 55 4e 44   nOldRnd = ROUND
25130 55 50 28 6e 4f 6c 64 2c 20 34 30 39 36 2a 31 30  UP(nOld, 4096*10
25140 32 34 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 4e 65  24);.#else.  nNe
25150 77 52 6e 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e  wRnd = ROUNDUP(n
25160 4e 65 77 2c 20 34 30 39 36 2a 31 29 3b 0a 20 20  New, 4096*1);.  
25170 6e 4f 6c 64 52 6e 64 20 3d 20 52 4f 55 4e 44 55  nOldRnd = ROUNDU
25180 50 28 6e 4f 6c 64 2c 20 34 30 39 36 2a 31 29 3b  P(nOld, 4096*1);
25190 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e  .#endif..  /* On
251a0 20 4f 53 58 20 6f 72 20 4c 69 6e 75 78 2c 20 72   OSX or Linux, r
251b0 65 75 73 65 20 74 68 65 20 6f 6c 64 20 6d 61 70  euse the old map
251c0 70 69 6e 67 20 69 66 20 69 74 20 69 73 20 74 68  ping if it is th
251d0 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 2a 2f  e right size. */
251e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
251f0 50 50 4c 45 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  PPLE__) || defin
25200 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
25210 69 66 28 20 6e 4e 65 77 52 6e 64 3d 3d 6e 4f 6c  if( nNewRnd==nOl
25220 64 52 6e 64 20 29 7b 0a 20 20 20 20 56 56 41 5f  dRnd ){.    VVA_
25230 4f 4e 4c 59 28 20 70 2d 3e 6d 6d 61 70 53 69 7a  ONLY( p->mmapSiz
25240 65 20 3d 20 6e 4e 65 77 3b 20 29 0a 20 20 20 20  e = nNew; ).    
25250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25260 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25270 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
25280 73 20 66 61 72 2c 20 75 6e 6d 61 70 20 61 6e 79  s far, unmap any
25290 20 6f 6c 64 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   old mapping. */
252a0 0a 20 20 69 66 28 20 6e 4f 6c 64 52 6e 64 21 3d  .  if( nOldRnd!=
252b0 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  0 ){.    void *p
252c0 4f 6c 64 20 3d 20 2a 70 70 4d 61 70 3b 0a 20 20  Old = *ppMap;.  
252d0 20 20 6d 75 6e 6d 61 70 28 70 4f 6c 64 2c 20 6e    munmap(pOld, n
252e0 4f 6c 64 52 6e 64 29 3b 0a 20 20 20 20 56 56 41  OldRnd);.    VVA
252f0 5f 4f 4e 4c 59 28 20 70 2d 3e 6d 6d 61 70 53 69  _ONLY( p->mmapSi
25300 7a 65 20 3d 20 30 3b 20 70 2d 3e 70 4d 61 70 52  ze = 0; p->pMapR
25310 65 67 69 6f 6e 20 3d 20 30 3b 20 29 3b 0a 20 20  egion = 0; );.  
25320 7d 0a 0a 20 20 2f 2a 20 41 6e 64 2c 20 69 66 20  }..  /* And, if 
25330 72 65 71 75 69 72 65 64 2c 20 75 73 65 20 6d 6d  required, use mm
25340 61 70 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ap() to create a
25350 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
25360 0a 20 20 69 66 28 20 6e 4e 65 77 52 6e 64 3e 30  .  if( nNewRnd>0
25370 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
25380 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 0a 20  s = PROT_READ;. 
25390 20 20 20 69 66 28 20 28 70 2d 3e 63 74 72 6c 46     if( (p->ctrlF
253a0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
253b0 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
253c0 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
253d0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6d 6d 61  ;.    pNew = mma
253e0 70 28 30 2c 20 6e 4e 65 77 52 6e 64 2c 20 66 6c  p(0, nNewRnd, fl
253f0 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
25400 20 70 2d 3e 68 2c 20 69 4f 66 66 29 3b 0a 20 20   p->h, iOff);.  
25410 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
25420 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
25430 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  pNew = 0;.      
25440 56 56 41 5f 4f 4e 4c 59 28 20 70 2d 3e 6d 6d 61  VVA_ONLY( p->mma
25450 70 53 69 7a 65 20 3d 20 30 3b 20 70 2d 3e 70 4d  pSize = 0; p->pM
25460 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 20 29 0a  apRegion = 0; ).
25470 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25480 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41 50 3b 0a  E_IOERR_MREMAP;.
25490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
254a0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 2d 3e 6d 6d   VVA_ONLY( p->mm
254b0 61 70 53 69 7a 65 20 3d 20 6e 4e 65 77 3b 20 70  apSize = nNew; p
254c0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
254d0 4e 65 77 3b 20 29 0a 20 20 20 20 7d 0a 20 20 7d  New; ).    }.  }
254e0 0a 0a 20 20 2a 70 70 4d 61 70 20 3d 20 70 4e 65  ..  *ppMap = pNe
254f0 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
25500 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
25510 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
25520 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
25530 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
25540 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
25550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
25560 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
25570 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
25580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25590 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
255a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
255e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
255f0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
25600 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
25610 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
25620 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
25630 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
25640 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
25650 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
25660 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
25670 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
25680 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
25690 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
256a0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
256b0 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
256c0 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
256d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
256e0 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
256f0 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
25700 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
25710 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
25720 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
25730 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
25740 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
25750 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
25760 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
25770 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
25780 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
25790 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
257a0 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
257b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
257c0 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
257d0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
257e0 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
257f0 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
25800 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
25810 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
25820 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
25830 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
25840 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
25850 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
25860 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
25870 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
25880 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
25890 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77  er-funtion F, tw
258a0 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
258b0 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
258c0 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
258d0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
258e0 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
258f0 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
25900 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
25910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
25920 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
25930 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
25940 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
25950 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
25960 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
25970 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
25980 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
25990 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
259a0 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
259b0 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
259c0 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
259d0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
259e0 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
259f0 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
25a00 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
25a10 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
25a20 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
25a30 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
25a40 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
25a50 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
25a60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
25a70 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
25a80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
25a90 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
25aa0 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
25ab0 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
25ac0 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
25ad0 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
25ae0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
25af0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
25b00 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
25b10 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
25b20 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
25b30 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
25b40 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
25b50 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
25b60 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
25b70 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20  METHODS(FINDER, 
25b80 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c  METHOD, VERSION,
25b90 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
25ba0 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
25bb0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
25bc0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
25bd0 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
25c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
25c30 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ca0 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
25cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cc0 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25cf0 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
25d40 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d60 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
25d90 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25db0 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
25de0 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e00 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25e30 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
25e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25e50 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
25e80 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
25e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
25ea0 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
25ed0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
25ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
25ef0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
25f00 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
25f10 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
25f20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
25f30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
25f40 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
25f70 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
25f80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
25f90 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
25fc0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25fd0 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
25fe0 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
26010 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
26020 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
26030 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
26060 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
26070 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
26080 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
260b0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
260c0 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
260d0 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
26100 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
26110 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
26120 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 5c 0a 20 20 20 75 6e 69 78 4d 72 65 6d 61 70   \.   unixMremap
26150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26160 20 20 2f 2a 20 78 4d 72 65 6d 61 70 20 2a 2f 20    /* xMremap */ 
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
261e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
261f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
26200 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
26210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
26220 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
26230 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26240 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
26250 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
26280 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
26320 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
26330 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
26340 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
26350 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
26360 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
26370 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
26380 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
26390 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
263a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
263b0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
263c0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
263d0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
263e0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
263f0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
26400 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
26410 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
26420 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
26430 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
26440 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26450 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
26460 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
26470 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
26480 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
26490 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
264a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
264d0 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
264e0 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
264f0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
26500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
26510 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
26520 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
26530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
26540 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
26550 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
26560 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
26570 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
26580 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
26590 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
265a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
265b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
265c0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
265d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
265e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
265f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
26600 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
26610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
26620 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
26630 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
26640 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
26650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
26660 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
26670 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
26680 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
26690 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
266a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
266b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
266c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
266d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
266e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
266f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
26700 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
26710 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
26720 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
26730 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
26740 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
26750 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
26760 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
26770 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
26780 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
26790 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
267a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
267b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
267c0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
267f0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
26800 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
26810 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
26820 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
26830 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
26840 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
26850 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
26860 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
26870 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
26880 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
26890 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
268a0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
268b0 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
268c0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
268d0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
268e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
268f0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
26900 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
26910 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
26920 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26930 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
26940 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
26950 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
26960 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
26970 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
26980 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
269b0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
269c0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
269d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
269e0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
269f0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
26a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26a10 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
26a20 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
26a30 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
26a40 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
26a50 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
26a60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
26a70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
26a80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
26a90 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
26aa0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
26ab0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
26ac0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
26ad0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
26ae0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
26af0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
26b00 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
26b10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
26b20 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
26b30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26b40 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
26b50 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
26b60 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
26b70 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
26b80 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
26b90 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
26ba0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
26bb0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
26bc0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
26bd0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26be0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
26bf0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
26c00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
26c10 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
26c20 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
26c30 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
26c40 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
26c50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
26c60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
26c70 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
26c80 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
26c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26ca0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
26cb0 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
26cc0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
26cd0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
26ce0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
26cf0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
26d20 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
26d30 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
26d60 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d80 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
26d90 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26db0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
26dc0 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
26dd0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
26de0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
26df0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
26e00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
26e10 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
26e20 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
26e30 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
26e40 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
26e50 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
26e60 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
26e70 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
26e80 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
26e90 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
26ea0 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
26eb0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
26ec0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
26ed0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
26ee0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
26ef0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
26f00 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
26f10 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
26f20 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
26f30 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
26f40 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
26f50 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
26f60 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
26f70 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
26f80 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
26f90 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
26fa0 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
26fb0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
26fc0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
26fd0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
26fe0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
26ff0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
27000 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
27010 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
27020 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
27030 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
27040 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
27050 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
27060 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
27070 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
27080 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
27090 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
270a0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
270b0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
270c0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
270d0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
270e0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
270f0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
27100 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
27110 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
27120 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
27130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
27140 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27150 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
27160 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
27170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
27180 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
27190 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
271a0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
271b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
271c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
271d0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
271e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
271f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
27200 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
27210 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
27220 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
27230 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
27240 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
27250 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
27260 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
27270 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
27280 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
27290 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
272a0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
272b0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
272c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
272d0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
272e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
272f0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
27300 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27320 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
27330 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
27340 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
27350 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
27360 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27370 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
273a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
273b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
273c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
273d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
273e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
273f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
27400 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
27410 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
27420 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
27430 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
27440 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
27450 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
27460 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
27470 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
27480 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
27490 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
274a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
274b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
274c0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
274d0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
274e0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
274f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
27500 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
27510 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
27520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27530 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
27540 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
27550 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
27560 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
27570 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
27580 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
27590 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
275a0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
275b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
275c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
275d0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
275e0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
275f0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
27600 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
27610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
27620 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
27630 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
27640 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
27650 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
27660 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
27670 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
27680 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
27690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
276a0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
276b0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
276c0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
276d0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
276e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
276f0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
27700 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
27710 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
27720 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
27730 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
27740 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
27750 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
27760 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
27770 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
27780 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
27790 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
277a0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
277b0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
277c0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
277d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
277e0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
277f0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
27800 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
27810 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
27820 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
27830 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
27840 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
27850 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
27860 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
27870 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
27880 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
27890 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
278a0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
278b0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
278c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
278d0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
278e0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
278f0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
27900 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
27910 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
27920 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
27930 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
27940 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
27950 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
27960 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
27970 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
27980 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
27990 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
279a0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
279b0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
279c0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
279d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
279e0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
279f0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
27a00 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
27a10 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
27a20 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
27a30 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
27a40 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
27a50 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
27a60 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
27a70 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
27a80 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
27a90 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
27aa0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
27ab0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
27ac0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
27ad0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
27ae0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
27af0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
27b00 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
27b10 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
27b20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
27b30 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
27b40 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
27b50 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
27b60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27b70 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
27b80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
27b90 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
27ba0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
27bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
27bc0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
27bd0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
27be0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
27bf0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
27c00 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
27c10 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
27c20 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
27c30 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
27c40 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
27c50 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
27c60 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
27c70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27c80 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
27c90 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
27ca0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27cb0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
27cc0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
27cd0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
27ce0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
27cf0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
27d00 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
27d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27d20 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
27d30 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
27d40 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
27d50 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
27d60 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
27d70 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
27d80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
27d90 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
27da0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
27db0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27dc0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
27dd0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
27de0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
27df0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
27e00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27e10 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
27e20 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
27e30 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
27e40 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
27e50 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
27e60 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
27e70 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
27e80 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
27e90 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
27ea0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
27eb0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
27ec0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
27ed0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
27ee0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
27ef0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
27f00 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
27f10 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
27f20 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
27f30 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
27f40 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
27f50 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
27f60 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
27f70 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
27f80 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
27f90 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
27fa0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
27fb0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
27fc0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
27fd0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
27fe0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
27ff0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
28000 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
28010 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
28020 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
28030 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
28040 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
28050 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
28060 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
28070 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28080 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
28090 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
280a0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
280b0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
280c0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
280d0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
280e0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
280f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28100 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
28110 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
28120 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
28130 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
28140 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
28150 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
28160 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
28170 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
28180 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
28190 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
281a0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
281b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
28200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28210 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
28220 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
28230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28240 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
28250 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
28260 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
28270 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
28280 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
28290 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
282a0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
282b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
282c0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
282d0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
282e0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
282f0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
28300 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
28310 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28320 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28330 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
28340 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
28350 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
28360 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28370 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
28380 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
28390 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
283a0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
283b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
283c0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
283d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
283e0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
283f0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
28400 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
28410 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
28420 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
28430 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
28440 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
28450 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28460 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
28470 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
28480 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
28490 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
284a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
284b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
284c0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
284d0 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
284e0 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
284f0 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
28500 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
28510 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
28520 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
28530 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
28540 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
28550 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
28560 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
28570 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
28580 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
28590 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
285a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
285b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
285c0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
285d0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
285e0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
285f0 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
28600 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
28610 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
28620 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
28630 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
28640 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
28650 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
28660 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
28670 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
28680 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
28690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
286a0 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
286b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
286c0 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
286d0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
286e0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
286f0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
28700 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
28710 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
28720 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
28730 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
28740 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
28750 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
28760 61 67 73 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ags;.  VVA_ONLY(
28770 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 20   pNew->mmapSize 
28780 3d 20 30 3b 20 29 0a 20 20 69 66 28 20 73 71 6c  = 0; ).  if( sql
28790 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
287a0 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  (((ctrlFlags & U
287b0 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
287c0 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20  Filename : 0),. 
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22            "psow"
287f0 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
28800 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
28810 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
28820 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
28830 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
28840 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   strcmp(pVfs->zN
28850 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29  ame,"unix-excl")
28860 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
28870 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
28880 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
28890 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
288a0 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
288b0 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
288c0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
288d0 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
288e0 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73  ){.    ctrlFlags
288f0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
28900 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  OCK;.    rc = SQ
28910 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
28920 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74  #endif..  if( ct
28930 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
28940 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20  LE_NOLOCK ){.   
28950 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
28960 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
28970 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
28980 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
28990 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a  (**(finder_type*
289a0 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  )pVfs->pAppData)
289b0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  (zFilename, pNew
289c0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
289d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
289e0 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20  LE.    /* Cache 
289f0 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65  zFilename in the
28a00 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
28a10 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63   (AFP and dotloc
28a20 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a  k override) for.
28a30 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b      ** proxyLock
28a40 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70   activation is p
28a50 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20  ossible (remote 
28a60 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f  proxy is based o
28a70 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a  n db name).    *
28a80 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61  * zFilename rema
28a90 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
28aa0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  file is closed, 
28ab0 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  to support */.  
28ac0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
28ad0 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29  ontext = (void*)
28ae0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69  zFilename;.#endi
28af0 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f  f.  }..  if( pLo
28b00 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70  ckingStyle == &p
28b10 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69  osixIoMethods.#i
28b20 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
28b30 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
28b40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28b50 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b  YLE.    || pLock
28b60 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73  ingStyle == &nfs
28b70 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66  IoMethods.#endif
28b80 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
28b90 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
28ba0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
28bb0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
28bc0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
28bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28be0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
28bf0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
28c00 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
28c10 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
28c20 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
28c30 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
28c40 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
28c50 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
28c60 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
28c70 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
28c80 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
28c90 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
28ca0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
28cb0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
28cc0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
28cd0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
28ce0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
28cf0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
28d00 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
28d10 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
28d20 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
28d30 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
28d40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
28d50 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
28d60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
28d70 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
28d80 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
28d90 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
28da0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
28db0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
28dc0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
28dd0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
28de0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
28df0 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
28e00 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
28e10 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
28e20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
28e30 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
28e40 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
28e50 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
28e60 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
28e70 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
28e80 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
28e90 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
28ea0 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
28eb0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
28ec0 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
28ed0 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
28ee0 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
28ef0 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
28f00 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
28f10 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
28f20 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
28f30 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
28f40 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
28f50 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
28f60 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
28f70 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
28f80 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
28f90 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
28fa0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
28fb0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
28fc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28fd0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
28fe0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
28ff0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
29000 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
29010 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
29020 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
29030 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
29040 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
29050 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
29060 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
29070 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
29080 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
29090 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
290a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
290b0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
290c0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
290d0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
290e0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
290f0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
29100 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
29110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29120 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
29130 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
29140 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
29150 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
29160 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
29170 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
29180 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
29190 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
291a0 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
291b0 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
291c0 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
291d0 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
291e0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
291f0 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
29200 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
29210 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
29220 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
29230 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
29240 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
29250 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
29260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29290 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
292a0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
292b0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
292c0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
292d0 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
292e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
292f0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
29300 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
29310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
29320 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
29330 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
29340 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
29350 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
29360 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
29370 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
29380 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
29390 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
293a0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
293b0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
293c0 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
293d0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
293e0 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  ename;.    asser
293f0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
29400 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  );.    nFilename
29410 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
29420 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
29430 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
29440 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
29450 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
29460 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
29470 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
29480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29490 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
294a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
294b0 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
294c0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20  zLockFile, "%s" 
294d0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20  DOTLOCK_SUFFIX, 
294e0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
294f0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  }.    pNew->lock
29500 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
29510 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  ckFile;.  }..#if
29520 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
29530 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
29540 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
29550 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
29560 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
29570 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
29580 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
29590 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
295a0 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
295b0 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
295c0 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
295d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
295e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
295f0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
29600 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
29610 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
29620 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77  ITE_OK) && (pNew
29630 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d  ->pInode->pSem==
29640 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
29650 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
29660 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
29670 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
29680 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
29690 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
296a0 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
296b0 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20  me, "/%s.sem",. 
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d        pNew->pId-
296e0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
296f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31  ;.      for( n=1
29700 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e  ; zSemName[n]; n
29710 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ++ ).        if(
29720 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f   zSemName[n]=='/
29730 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20  ' ) zSemName[n] 
29740 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65  = '_';.      pNe
29750 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
29760 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
29770 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
29780 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
29790 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  ( pNew->pInode->
297a0 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
297b0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
297c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
297d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
297e0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
297f0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
29800 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
29810 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
29820 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70   }.#endif.  .  p
29830 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
29840 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   0;.#if OS_VXWOR
29850 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
29860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
29870 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
29880 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
29890 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
298a0 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69  = -1;.    osUnli
298b0 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
298c0 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b     isDelete = 0;
298d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c  .  }.  if( isDel
298e0 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74 72 6c  ete ) pNew->ctrl
298f0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
29900 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
29910 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
29930 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
29940 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
29950 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
29960 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
29970 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
29980 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
29990 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72  ter(+1);.  }.  r
299a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
299b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
299c0 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
299d0 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
299e0 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
299f0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
29a00 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
29a10 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
29a20 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
29a30 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
29a40 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
29a50 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
29a60 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
29a70 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
29a80 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
29a90 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
29aa0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
29ab0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
29ac0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20  /tmp",.     0   
29ad0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
29ae0 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a  minator */.  };.
29af0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
29b00 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
29b10 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
29b20 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
29b30 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
29b40 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
29b50 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ry;.  if( !azDir
29b60 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
29b70 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
29b80 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  R");.  for(i=0; 
29b90 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
29ba0 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
29bb0 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
29bc0 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a  i++]){.    if( z
29bd0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
29be0 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61  e;.    if( osSta
29bf0 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20  t(zDir, &buf) ) 
29c00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
29c10 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
29c20 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
29c30 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63  ue;.    if( osAc
29c40 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
29c50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
29c60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
29c70 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
29c80 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
29c90 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
29ca0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
29cb0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
29cc0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
29cd0 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
29ce0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
29cf0 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
29d00 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
29d10 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
29d20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
29d30 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
29d40 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
29d50 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
29d60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
29d70 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
29d80 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
29d90 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
29da0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
29db0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
29dc0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
29dd0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
29de0 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
29df0 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
29e00 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
29e10 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
29e20 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
29e30 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
29e40 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
29e50 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
29e60 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
29e70 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
29e80 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
29e90 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
29ea0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
29eb0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
29ec0 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
29ed0 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
29ee0 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
29ef0 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
29f00 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
29f10 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
29f20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
29f30 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
29f40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
29f50 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
29f60 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
29f70 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
29f80 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
29f90 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
29fa0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
29fb0 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
29fc0 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
29fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29fe0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
29ff0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
2a000 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
2a010 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  8, zBuf, "%s/"SQ
2a020 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2a030 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
2a040 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
2a050 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
2a060 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2a070 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
2a080 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
2a090 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
2a0a0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
2a0b0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
2a0c0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
2a0d0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
2a0e0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
2a0f0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
2a100 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  .    zBuf[j+1] =
2a110 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
2a120 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
2a130 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2a140 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
2a150 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a160 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2a170 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a180 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
2a190 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
2a1a0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
2a1b0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
2a1c0 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
2a1d0 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
2a1e0 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
2a1f0 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
2a200 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
2a210 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2a220 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
2a230 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
2a240 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
2a250 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
2a260 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
2a270 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
2a280 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
2a290 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2a2a0 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
2a2b0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
2a2c0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2a2d0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
2a2e0 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
2a2f0 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
2a300 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
2a310 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
2a320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
2a330 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
2a340 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
2a350 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2a360 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2a370 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
2a380 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
2a390 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
2a3a0 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
2a3b0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
2a3c0 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
2a3d0 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
2a3e0 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
2a3f0 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
2a400 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
2a410 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
2a420 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
2a430 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
2a440 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
2a450 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
2a460 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
2a470 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
2a480 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
2a490 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
2a4a0 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
2a4b0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
2a4c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2a4d0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
2a4e0 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
2a4f0 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
2a500 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
2a510 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
2a520 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
2a530 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
2a540 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2a550 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
2a560 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
2a570 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
2a580 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
2a590 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
2a5a0 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
2a5b0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
2a5c0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
2a5d0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2a5e0 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
2a5f0 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
2a600 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2a610 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
2a620 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
2a630 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
2a640 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
2a650 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
2a660 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
2a670 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
2a680 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
2a690 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
2a6a0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
2a6b0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
2a6c0 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
2a6d0 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
2a6e0 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
2a6f0 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
2a700 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
2a710 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
2a720 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
2a730 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
2a740 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2a750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2a760 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
2a770 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
2a780 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
2a790 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
2a7a0 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
2a7b0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
2a7c0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
2a7d0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
2a7e0 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
2a7f0 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
2a800 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
2a810 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
2a820 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2a830 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
2a840 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
2a850 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
2a860 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
2a870 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2a880 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
2a890 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
2a8a0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2a8b0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
2a8c0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2a8d0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
2a8e0 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
2a8f0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
2a900 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
2a910 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
2a920 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
2a930 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
2a940 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20  for a resusable 
2a950 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2a960 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2a970 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2a980 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2a990 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2a9a0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2a9b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2a9c0 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2a9d0 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2a9e0 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2a9f0 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2aa00 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2aa10 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2aa20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2aa30 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2aa40 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2aa50 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2aa60 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2aa70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2aa80 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2aa90 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2aaa0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2aab0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2aac0 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2aad0 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2aae0 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2aaf0 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2ab00 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2ab10 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2ab20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2ab30 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2ab40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2ab50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2ab60 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2ab70 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2ab80 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2ab90 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2aba0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2abb0 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2abc0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2abd0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2abe0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2abf0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2ac00 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2ac10 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2ac20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2ac30 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2ac40 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2ac50 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2ac60 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2ac70 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2ac80 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2ac90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2aca0 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2acb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2acc0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2acd0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2ace0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2acf0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2ad00 20 63 61 73 65 73 20 63 61 73 65 73 2c 20 74 68   cases cases, th
2ad10 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2ad20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69  *pMode to 0, whi
2ad30 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ch will become.*
2ad40 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  * an indication 
2ad50 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29  to robust_open()
2ad60 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66   to create the f
2ad70 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  ile using.** SQL
2ad80 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2ad90 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a  _PERMISSIONS adj
2ada0 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  usted by the uma
2adb0 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  sk..** But if th
2adc0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2add0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
2ade0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2adf0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
2ae00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
2ae10 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
2ae20 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
2ae30 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
2ae40 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2ae50 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
2ae60 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
2ae70 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
2ae80 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
2ae90 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
2aea0 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
2aeb0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
2aec0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
2aed0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
2aee0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2aef0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2af00 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2af10 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
2af20 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2af30 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
2af40 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
2af50 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
2af60 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
2af70 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
2af80 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
2af90 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
2afa0 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
2afb0 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
2afc0 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
2afd0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
2afe0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
2aff0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
2b000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2b010 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
2b020 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
2b030 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
2b040 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
2b050 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
2b080 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
2b090 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
2b0a0 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0c0 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
2b0d0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
2b0e0 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
2b0f0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
2b100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2b110 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
2b120 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
2b130 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b150 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
2b160 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
2b170 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2b180 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2b190 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2b1a0 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
2b1b0 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20   = 0;.  *pUid = 
2b1c0 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a  0;.  *pGid = 0;.
2b1d0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2b1e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2b1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2b200 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2b210 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
2b220 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
2b230 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
2b240 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
2b250 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2b260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b270 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
2b280 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20  s in zDb */.    
2b290 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2b2a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2b2b0 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
2b2c0 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
2b2d0 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  le */..    /* zP
2b2e0 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
2b2f0 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
2b300 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
2b310 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
2b320 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
2b330 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
2b340 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2b350 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
2b360 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
2b370 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
2b380 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
2b390 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
2b3a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
2b3b0 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2b3c0 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2b3d0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
2b3e0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2b3f0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
2b400 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2b410 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
2b420 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
2b430 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
2b440 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
2b450 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
2b460 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
2b470 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
2b480 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
2b490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
2b4a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2b4b0 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
2b4c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b4d0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20  ABLE_8_3_NAMES. 
2b4e0 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
2b4f0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  && sqlite3Isalnu
2b500 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20  m(zPath[nDb]) ) 
2b510 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e  nDb--;.    if( n
2b520 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
2b530 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  Db]!='-' ) retur
2b540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
2b550 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  se.    while( zP
2b560 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
2b570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2b580 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  Db>0 );.      as
2b590 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d  sert( zPath[nDb]
2b5a0 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20  !='\n' );.      
2b5b0 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e  nDb--;.    }.#en
2b5c0 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  dif.    memcpy(z
2b5d0 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2b5e0 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2b5f0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
2b600 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
2b610 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
2b620 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
2b630 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
2b640 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
2b650 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
2b660 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
2b670 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
2b680 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2b690 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2b6a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2b6b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2b6c0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2b6d0 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
2b6e0 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
2b6f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b700 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
2b710 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
2b720 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
2b730 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
2b740 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
2b750 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
2b760 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
2b770 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2b780 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
2b790 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2b7a0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
2b7b0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2b7c0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2b7d0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
2b7e0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
2b7f0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2b800 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2b810 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2b820 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
2b830 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
2b840 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
2b850 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
2b860 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
2b870 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
2b880 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
2b890 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
2b8a0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
2b8b0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
2b8c0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
2b8d0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
2b8e0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
2b8f0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
2b900 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
2b910 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
2b920 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2b930 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
2b940 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
2b950 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
2b960 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
2b970 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
2b980 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
2b990 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
2b9a0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
2b9b0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
2b9c0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
2b9d0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
2b9e0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
2b9f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2ba00 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
2ba10 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
2ba20 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
2ba30 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
2ba40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2ba50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
2ba60 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
2ba70 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
2ba80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2ba90 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
2baa0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
2bab0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
2bac0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
2bad0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2bae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2baf0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
2bb00 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
2bb10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
2bb20 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
2bb30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
2bb40 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
2bb50 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
2bb60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
2bb70 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
2bb80 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
2bb90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2bba0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2bbb0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
2bbc0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
2bbd0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2bbe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2bbf0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
2bc00 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
2bc10 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
2bc20 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
2bc30 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
2bc40 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
2bc50 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
2bc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bc70 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
2bc80 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
2bc90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bca0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2bcb0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
2bcc0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2bcd0 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bcf0 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
2bd00 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
2bd10 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
2bd20 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
2bd30 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
2bd40 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
2bd50 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2bd60 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2bd70 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
2bd80 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
2bd90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
2bda0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
2bdb0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
2bdc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2bdd0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
2bde0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
2bdf0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2be00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2be10 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
2be20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2be30 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
2be40 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
2be50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
2be60 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
2be70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2be80 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
2be90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2bea0 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
2beb0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
2bec0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
2bed0 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
2bee0 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
2bef0 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
2bf00 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
2bf10 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
2bf20 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
2bf30 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
2bf40 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
2bf50 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
2bf60 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
2bf70 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2bf80 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
2bf90 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
2bfa0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ..  */.  int syn
2bfb0 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65  cDir = (isCreate
2bfc0 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
2bfd0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2bfe0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2bff0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2c000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2c010 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2c020 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2c030 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
2c040 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2c050 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
2c060 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2c070 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
2c080 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
2c090 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2c0a0 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
2c0b0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
2c0c0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
2c0d0 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
2c0e0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
2c0f0 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  2];.  const char
2c100 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
2c110 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
2c120 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
2c130 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
2c140 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
2c150 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
2c160 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
2c170 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
2c180 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
2c190 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
2c1a0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
2c1b0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
2c1c0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
2c1d0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
2c1e0 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
2c1f0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
2c200 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2c210 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
2c220 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
2c230 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2c240 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2c250 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
2c260 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
2c270 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2c280 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
2c290 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
2c2a0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
2c2b0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
2c2c0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
2c2d0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
2c2e0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2c2f0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
2c300 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
2c310 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
2c320 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
2c330 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
2c340 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
2c350 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
2c360 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2c370 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
2c380 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
2c390 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
2c3a0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2c3b0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2c3c0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2c3d0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
2c3e0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2c3f0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2c400 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2c410 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2c420 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2c430 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2c440 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2c450 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2c460 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2c470 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2c480 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2c490 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2c4a0 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
2c4b0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
2c4c0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
2c4d0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
2c4e0 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
2c4f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
2c500 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2c510 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
2c520 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2c530 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
2c540 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2c550 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2c560 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
2c570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2c580 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2c590 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2c5a0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2c5b0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
2c5c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2c5d0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2c5e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2c5f0 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
2c600 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
2c610 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
2c620 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  );..  memset(p, 
2c630 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
2c640 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  le));..  if( eTy
2c650 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2c660 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55  MAIN_DB ){.    U
2c670 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2c680 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65  used;.    pUnuse
2c690 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2c6a0 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29  Fd(zName, flags)
2c6b0 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65  ;.    if( pUnuse
2c6c0 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20  d ){.      fd = 
2c6d0 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20  pUnused->fd;.   
2c6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55   }else{.      pU
2c6f0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
2c700 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2c710 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2c720 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2c730 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2c760 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2c770 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74  sed;..    /* Dat
2c780 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
2c790 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
2c7a0 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
2c7b0 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a  ey are not.    *
2c7c0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
2c7d0 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
2c7e0 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
2c7f0 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
2c800 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72     ** sqlite3_ur
2c810 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
2c820 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66  /.    assert( (f
2c830 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2c840 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65  EN_URI) || zName
2c850 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2c860 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  ]==0 );..  }else
2c870 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
2c880 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2c890 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
2c8a0 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
2c8b0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
2c8c0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
2c8d0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79  (isDelete && !sy
2c8e0 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d  ncDir);.    rc =
2c8f0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2c900 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c  (MAX_PATHNAME+2,
2c910 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2c920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c930 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2c940 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2c950 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2c960 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2c970 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
2c980 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
2c990 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
2c9a0 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
2c9b0 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
2c9c0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2c9d0 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2c9e0 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
2c9f0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2ca00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
2ca10 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
2ca20 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
2ca30 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2ca40 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
2ca50 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
2ca60 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
2ca70 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
2ca80 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2ca90 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
2caa0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2cab0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
2cac0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
2cad0 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
2cae0 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
2caf0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
2cb00 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
2cb10 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2cb20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2cb30 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
2cb40 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
2cb50 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
2cb60 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
2cb70 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2cb80 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
2cb90 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
2cba0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
2cbb0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
2cbc0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
2cbd0 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
2cbe0 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
2cbf0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
2cc00 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
2cc10 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
2cc20 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
2cc30 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
2cc40 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
2cc70 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
2cc80 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
2cca0 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
2ccb0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
2ccc0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2ccd0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
2cce0 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
2ccf0 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
2cd00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cd10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cd20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
2cd30 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2cd40 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2cd50 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
2cd60 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2cd70 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
2cd80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cd90 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2cda0 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
2cdb0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
2cdc0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
2cdd0 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
2cde0 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
2cdf0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
2ce00 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2ce10 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
2ce20 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
2ce30 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
2ce40 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
2ce50 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
2ce60 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
2ce70 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
2ce80 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
2ce90 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
2cea0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2ceb0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2cec0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
2ced0 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
2cee0 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
2cef0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
2cf00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2cf10 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
2cf20 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
2cf30 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
2cf40 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  = 1;.      fd = 
2cf50 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2cf60 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2cf70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  enMode);.    }. 
2cf80 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2cf90 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2cfa0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2cfb0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
2cfc0 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
2cfd0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2cfe0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
2cff0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
2d000 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
2d010 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63  as root and if c
2d020 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f  reating a new ro
2d030 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f  llback.    ** jo
2d040 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c  urnal or WAL fil
2d050 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72  e, set the owner
2d060 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72  ship of the jour
2d070 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65  nal or WAL to be
2d080 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
2d090 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
2d0a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
2d0b0 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
2d0c0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2d0d0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2d0e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2d0f0 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66        osFchown(f
2d100 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20  d, uid, gid);.  
2d110 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2d120 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
2d130 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
2d140 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
2d150 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
2d160 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
2d170 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
2d180 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
2d190 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
2d1a0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2d1b0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
2d1c0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
2d1d0 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
2d1e0 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69  #else.    osUnli
2d1f0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
2d200 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
2d210 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d220 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
2d230 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
2d240 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
2d250 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
2d260 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
2d270 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
2d280 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
2d290 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2d2a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d2b0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
2d2c0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
2d2d0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2d2e0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
2d2f0 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  le)->lastErrno =
2d300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75   errno;.    robu
2d310 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2d320 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
2d330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2d340 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
2d350 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
2d360 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
2d370 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2d380 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
2d390 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
2d3a0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2d3b0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
2d3c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2d3d0 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
2d3e0 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
2d3f0 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
2d400 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
2d410 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2d420 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2d430 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2d440 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
2d450 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2d460 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
2d470 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2d490 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2d4a0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
2d4b0 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20  f( syncDir )    
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2d4d0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2d4e0 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
2d4f0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2d500 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
2d510 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2d520 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
2d530 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d540 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
2d550 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2d560 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
2d570 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
2d580 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
2d590 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
2d5a0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
2d5b0 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
2d5c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
2d5d0 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
2d5e0 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
2d5f0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
2d600 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
2d610 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
2d620 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2d630 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
2d640 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
2d650 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
2d660 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
2d670 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
2d680 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
2d690 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
2d6a0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
2d6b0 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
2d6c0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
2d6d0 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
2d6e0 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
2d6f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
2d700 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2d710 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2d720 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2d730 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2d740 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2d750 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2d760 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2d770 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2d780 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2d790 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2d7a0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2d7b0 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2d7c0 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2d7d0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2d7e0 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2d7f0 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2d800 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2d810 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2d820 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2d830 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2d840 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2d850 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2d860 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2d870 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2d880 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2d890 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2d8a0 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2d8b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2d8c0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2d8d0 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2d8e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2d8f0 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2d900 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2d910 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2d920 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f  rrno;.        ro
2d930 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2d940 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2d950 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d960 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2d970 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e         goto open
2d980 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20  _finished;.     
2d990 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78   }.      useProx
2d9a0 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
2d9b0 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
2d9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
2d9d0 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
2d9e0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
2d9f0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
2da00 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
2da10 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  lFlags);.      i
2da20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2da30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2da40 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2da50 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
2da60 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
2da70 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
2da80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2da90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
2daa0 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
2dab0 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
2dac0 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
2dad0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
2dae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2daf0 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
2db00 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
2db10 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
2db20 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
2db30 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
2db40 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
2db50 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
2db60 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
2db70 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
2db80 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
2db90 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
2dba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2dbb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dbc0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
2dbd0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
2dbe0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2dbf0 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
2dc00 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
2dc10 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
2dc20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
2dc30 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
2dc40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dc50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2dc60 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
2dc70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2dc80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
2dc90 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
2dca0 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
2dcb0 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
2dcc0 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
2dcd0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
2dce0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
2dcf0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
2dd00 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
2dd10 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2dd20 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
2dd30 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
2dd40 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
2dd50 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
2dd60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2dd70 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
2dd80 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2dd90 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
2dda0 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
2ddb0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2ddc0 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
2ddd0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
2dde0 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
2ddf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2de00 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
2de10 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2de20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2de30 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
2de40 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
2de50 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b  ;.  if( osUnlink
2de60 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b  (zPath)==(-1) ){
2de70 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d  .    if( errno==
2de80 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
2de90 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2dea0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a  R_DELETE_NOENT;.
2deb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dec0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2ded0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2dee0 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22  DELETE, "unlink"
2def0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
2df00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2df10 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
2df20 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
2df30 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63  C.  if( (dirSync
2df40 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20   & 1)!=0 ){.    
2df50 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
2df60 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
2df70 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
2df80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2df90 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
2dfa0 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
2dfb0 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
2dfc0 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
2dfd0 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
2dfe0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2dff0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2e000 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2e010 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
2e020 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
2e030 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
2e040 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2e050 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2e060 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2e070 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2e080 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e090 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2e0a0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2e0b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
2e0c0 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
2e0d0 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
2e0e0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
2e0f0 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
2e100 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
2e110 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
2e120 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
2e130 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
2e140 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
2e150 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2e160 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
2e170 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2e180 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
2e190 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
2e1a0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
2e1b0 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
2e1c0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
2e1d0 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
2e1e0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
2e1f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
2e200 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
2e210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e220 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
2e230 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2e240 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
2e250 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
2e260 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
2e270 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2e280 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
2e290 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
2e2a0 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
2e2b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2e2c0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
2e2d0 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
2e2e0 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
2e2f0 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
2e300 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
2e310 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
2e320 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
2e330 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2e340 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
2e350 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2e360 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
2e370 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2e380 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
2e390 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
2e3a0 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
2e3b0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2e3c0 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
2e3d0 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
2e3e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2e3f0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2e400 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
2e410 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
2e420 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2e430 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2e440 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
2e450 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
2e460 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2e470 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
2e480 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
2e490 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
2e4a0 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
2e4b0 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65  ResOut = (osAcce
2e4c0 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
2e4d0 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ==0);.  if( flag
2e4e0 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
2e4f0 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73  _EXISTS && *pRes
2e500 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Out ){.    struc
2e510 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2e520 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2e530 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
2e540 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
2e550 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
2e560 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2e570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e580 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
2e590 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2e5a0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
2e5b0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
2e5c0 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
2e5d0 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
2e5e0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
2e5f0 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
2e600 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
2e610 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
2e620 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
2e630 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
2e640 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
2e650 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
2e660 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
2e670 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
2e680 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
2e690 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
2e6a0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
2e6b0 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
2e6c0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
2e6d0 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
2e6e0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2e6f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2e700 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2e710 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2e720 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2e730 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2e740 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2e750 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
2e760 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
2e770 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2e780 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2e790 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
2e7a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
2e7b0 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e7d0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
2e7e0 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
2e7f0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2e800 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2e810 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2e820 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2e830 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2e840 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2e850 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2e860 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2e870 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2e880 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
2e890 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
2e8a0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
2e8b0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
2e8c0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
2e8d0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
2e8e0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
2e8f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2e900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2e910 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
2e920 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2e930 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
2e940 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2e950 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
2e960 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
2e970 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
2e980 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
2e990 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2e9a0 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
2e9b0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
2e9c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
2e9d0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
2e9e0 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
2e9f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2ea00 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
2ea10 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2ea20 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
2ea30 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
2ea40 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
2ea50 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
2ea60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ea70 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
2ea80 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
2ea90 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
2eaa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2eab0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2eac0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2ead0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
2eae0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
2eaf0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
2eb00 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
2eb10 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
2eb20 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
2eb30 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
2eb40 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
2eb50 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
2eb60 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
2eb70 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
2eb80 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
2eb90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
2eba0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2ebb0 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
2ebc0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2ebd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
2ebe0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
2ebf0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
2ec00 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
2ec10 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2ec20 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
2ec30 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
2ec40 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
2ec50 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
2ec60 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
2ec70 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
2ec80 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
2ec90 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
2eca0 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
2ecb0 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
2ecc0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
2ecd0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
2ece0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
2ecf0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
2ed00 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
2ed10 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
2ed20 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
2ed30 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
2ed40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
2ed50 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
2ed60 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2ed70 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2ed80 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
2ed90 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
2eda0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2edb0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
2edc0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2edd0 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
2ede0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
2edf0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2ee00 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
2ee10 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
2ee20 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
2ee30 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
2ee40 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
2ee50 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2ee60 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
2ee70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
2ee80 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
2ee90 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
2eea0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
2eeb0 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
2eec0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
2eed0 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
2eee0 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
2eef0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2ef00 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
2ef10 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
2ef20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
2ef30 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
2ef40 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
2ef50 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2ef60 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
2ef70 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
2ef80 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
2ef90 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
2efa0 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
2efb0 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
2efc0 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
2efd0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
2efe0 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
2eff0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
2f000 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
2f010 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
2f020 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2f030 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
2f040 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
2f050 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
2f060 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
2f070 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
2f080 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
2f090 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
2f0a0 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
2f0b0 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
2f0c0 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
2f0d0 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
2f0e0 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
2f0f0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
2f100 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
2f110 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
2f120 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
2f130 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
2f140 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
2f150 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
2f160 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
2f170 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
2f180 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
2f190 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
2f1a0 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
2f1b0 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
2f1c0 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
2f1d0 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
2f1e0 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
2f1f0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
2f200 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
2f210 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2f220 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
2f230 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
2f240 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2f250 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
2f260 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
2f270 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
2f280 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
2f290 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2f2a0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
2f2b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f2c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2f2d0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
2f2e0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2f2f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2f300 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2f310 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2f320 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
2f330 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2f340 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2f350 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
2f360 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2f370 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2f380 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
2f390 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
2f3a0 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
2f3b0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
2f3c0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2f3d0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
2f3e0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
2f3f0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2f400 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2f410 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f420 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
2f430 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
2f440 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
2f450 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
2f460 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
2f470 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
2f480 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
2f490 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
2f4a0 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
2f4b0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
2f4c0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
2f4d0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
2f4e0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
2f4f0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
2f500 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
2f510 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
2f520 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
2f530 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
2f540 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
2f550 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
2f560 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
2f570 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
2f580 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
2f590 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
2f5a0 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
2f5b0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
2f5c0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
2f5d0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
2f5e0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
2f5f0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
2f600 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
2f610 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
2f620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2f630 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
2f640 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
2f650 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
2f660 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
2f670 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
2f680 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
2f690 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
2f6a0 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
2f6b0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
2f6c0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
2f6d0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
2f6e0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2f6f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2f700 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
2f710 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74  int pid, fd, got
2f720 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
2f730 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  t_open("/dev/ura
2f740 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ndom", O_RDONLY,
2f750 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c   0);.    if( fd<
2f760 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f  0 ){.      time_
2f770 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28  t t;.      time(
2f780 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  &t);.      memcp
2f790 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65  y(zBuf, &t, size
2f7a0 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69  of(t));.      pi
2f7b0 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
2f7c0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
2f7d0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69  [sizeof(t)], &pi
2f7e0 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
2f7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2f800 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
2f810 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  pid)<=(size_t)nB
2f820 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
2f830 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
2f840 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20  izeof(pid);.    
2f850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
2f860 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
2f870 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
2f880 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
2f890 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
2f8a0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2f8b0 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
2f8c0 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
2f8d0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
2f8e0 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
2f8f0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
2f900 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
2f910 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
2f920 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
2f930 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2f940 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
2f950 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
2f960 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
2f970 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2f980 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f990 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
2f9a0 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
2f9b0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
2f9c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2f9d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2f9e0 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
2f9f0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
2fa00 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
2fa10 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
2fa20 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
2fa30 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
2fa40 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
2fa50 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
2fa60 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2fa70 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
2fa80 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
2fa90 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2faa0 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
2fab0 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
2fac0 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
2fad0 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
2fae0 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
2faf0 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
2fb00 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
2fb10 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
2fb20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2fb30 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2fb40 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
2fb50 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
2fb60 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
2fb70 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
2fb80 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
2fb90 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2fba0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2fbb0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
2fbc0 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
2fbd0 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
2fbe0 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
2fbf0 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
2fc00 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
2fc10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2fc20 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2fc30 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
2fc40 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
2fc50 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2fc60 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
2fc70 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
2fc80 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
2fc90 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
2fca0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
2fcb0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
2fcc0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
2fcd0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2fce0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
2fcf0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
2fd00 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
2fd10 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
2fd20 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2fd30 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
2fd40 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
2fd50 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
2fd60 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
2fd70 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
2fd80 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2fd90 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2fda0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2fdb0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2fdc0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
2fdd0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2fde0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2fdf0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
2fe00 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
2fe10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
2fe20 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
2fe30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2fe40 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
2fe50 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
2fe60 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
2fe70 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
2fe80 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
2fe90 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
2fea0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
2feb0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
2fec0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
2fed0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
2fee0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
2fef0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2ff00 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2ff10 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
2ff20 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2ff30 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
2ff40 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2ff50 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2ff60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
2ff70 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
2ff80 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2ff90 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2ffa0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2ffb0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2ffc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ffd0 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
2ffe0 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
2fff0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
30000 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
30010 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
30020 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
30030 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
30040 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
30050 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
30060 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
30070 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
30080 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
30090 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
300a0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
300b0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
300c0 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
300d0 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
300e0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
300f0 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d  ow;.  if( gettim
30100 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
30110 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ==0 ){.    *piNo
30120 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
30130 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
30140 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
30150 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31  + sNow.tv_usec/1
30160 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
30170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
30180 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ROR;.  }.#endif.
30190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
301a0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
301b0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
301c0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
301d0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
301e0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
301f0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
30200 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
30210 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30220 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
30230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30240 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
30250 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
30260 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
30270 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
30280 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
30290 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
302a0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
302b0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
302c0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
302d0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
302e0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
302f0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
30300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30310 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
30320 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
30330 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
30340 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
30350 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
30360 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
30370 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30380 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
30390 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
303a0 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
303b0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
303c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
303d0 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20  ./*.** We added 
303e0 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f  the xGetLastErro
303f0 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20  r() method with 
30400 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66  the intention of
30410 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65   providing.** be
30420 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  tter low-level e
30430 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
30440 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
30450 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
30460 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
30470 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
30480 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f    But so far, no
30490 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62  ne of that has b
304a0 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  een implemented.
304b0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20  ** in the core. 
304c0 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
304d0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
304e0 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69  .  For now, it i
304f0 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c  s merely.** a pl
30500 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73  ace-holder..*/.s
30510 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
30520 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
30530 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
30540 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
30550 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
30560 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30570 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
30580 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30590 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
305a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
305b0 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
305c0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  n 0;.}.../*.****
305d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
305e0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
305f0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
30600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
30620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
30670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
306c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306d0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
306e0 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
306f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
30710 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
30720 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
30730 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
30740 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
30750 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
30760 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
30770 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
30780 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
30790 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
307a0 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
307b0 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
307c0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
307d0 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
307e0 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
307f0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
30800 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
30810 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
30820 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
30830 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
30840 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
30850 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
30860 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
30870 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
30880 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
30890 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
308a0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
308b0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
308c0 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
308d0 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
308e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
308f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
30900 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
30910 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
30920 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
30930 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
30940 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
30950 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30960 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
30970 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
30980 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
30990 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
309a0 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
309b0 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
309c0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
309d0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
309e0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
309f0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
30a00 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
30a10 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
30a20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
30a30 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
30a40 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
30a50 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
30a60 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
30a70 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
30a80 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
30a90 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
30aa0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
30ab0 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
30ac0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
30ad0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
30ae0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
30af0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
30b00 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
30b10 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
30b20 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
30b30 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
30b40 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
30b50 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
30b60 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
30b70 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
30b80 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
30b90 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
30ba0 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
30bb0 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
30bc0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
30bd0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
30be0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
30bf0 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  0000000.**      
30c00 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
30c10 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
30c20 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
30c30 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
30c40 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
30c50 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
30c60 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
30c70 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
30c80 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
30c90 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
30ca0 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
30cb0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
30cc0 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
30cd0 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
30ce0 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
30cf0 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
30d00 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
30d10 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
30d20 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
30d30 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
30d40 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
30d50 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
30d60 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
30d70 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
30d80 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
30d90 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
30da0 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
30db0 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
30dc0 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
30dd0 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
30de0 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
30df0 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
30e00 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
30e10 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
30e20 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
30e30 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
30e40 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
30e50 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
30e60 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
30e70 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
30e80 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
30e90 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
30ea0 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
30eb0 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
30ec0 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
30ed0 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
30ee0 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
30ef0 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
30f00 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
30f10 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
30f20 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
30f30 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
30f40 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
30f50 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
30f60 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
30f70 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
30f80 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
30f90 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
30fa0 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
30fb0 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
30fc0 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
30fd0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
30fe0 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
30ff0 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
31000 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
31010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
31020 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
31030 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
31040 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
31050 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
31060 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
31070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31080 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
31090 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
310a0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
310b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
310c0 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  me, SQLITE_GET_L
310d0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c  OCKPROXYFILE, &<
310e0 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a  proxy_path>);.**
310f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d  .**.** SQL pragm
31100 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41  as.**.**  PRAGMA
31110 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
31120 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f  _proxy_file=<pro
31130 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f  xy_path> | :auto
31140 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  :.**  PRAGMA [da
31150 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
31160 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70  xy_file.**.** Sp
31170 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a  ecifying ":auto:
31180 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  " means that if 
31190 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68  there is a conch
311a0 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74   file with a mat
311b0 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44  ching.** host ID
311c0 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78   in it, the prox
311d0 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f  y path in the co
311e0 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
311f0 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65   used, otherwise
31200 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68  .** a proxy path
31210 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73   based on the us
31220 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a  er's temp dir.**
31230 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43   (via confstr(_C
31240 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
31250 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c  MP_DIR,...)) wil
31260 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68  l be used and th
31270 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78  e.** actual prox
31280 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67  y file name is g
31290 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
312a0 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20  e name and path 
312b0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
312c0 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78  se file.  For ex
312d0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
312e0 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20     For database 
312f0 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f  path "/Users/me/
31300 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20  foo.db" .**     
31310 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20    The lock path 
31320 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72  will be "<tmpdir
31330 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f  >/sqliteplocks/_
31340 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a  Users_me_foo.db:
31350 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e  auto:").**.** On
31360 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20  ce a lock proxy 
31370 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  is configured fo
31380 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
31390 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20  nection, it can 
313a0 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  not.** be remove
313b0 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61  d, however it ma
313c0 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f  y be switched to
313d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
313e0 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74  xy path via.** t
313f0 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61  he above APIs (a
31400 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63  ssuming the conc
31410 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65  h file is not be
31420 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  ing held by anot
31430 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  her.** connectio
31440 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a  n or process). .
31450 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f  **.**.** How pro
31460 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  xy locking works
31470 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
31480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
31490 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  * Proxy file loc
314a0 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d  king relies prim
314b0 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77  arily on two new
314c0 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65   supporting file
314d0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63  s: .**.**   *  c
314e0 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d  onch file to lim
314f0 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  it access to the
31500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
31510 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a  o a single host.
31520 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d  **      at a tim
31530 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f  e.**.**   *  pro
31540 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61  xy file to act a
31550 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68  s a proxy for th
31560 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  e advisory locks
31570 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20   normally.**    
31580 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64    taken on the d
31590 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68  atabase.**.** Th
315a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74  e conch file - t
315b0 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69  o use a proxy fi
315c0 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20  le, sqlite must 
315d0 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20  first "hold the 
315e0 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b  conch".** by tak
315f0 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74  ing an sqlite-st
31600 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  yle shared lock 
31610 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
31620 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  e, reading the.*
31630 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63  * contents and c
31640 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73  omparing the hos
31650 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20  t's unique host 
31660 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61  ID (see below) a
31670 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79  nd lock.** proxy
31680 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68   path against th
31690 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
316a0 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54  in the conch.  T
316b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
316c0 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
316d0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
316e0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
316f0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
31700 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61  le name.** is pa
31710 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68  tterned after th
31720 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31730 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62  name as ".<datab
31740 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e  asename>-conch".
31750 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68  .** If the conch
31760 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
31770 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f  xist, or it's co
31780 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
31790 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
317a0 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
317b0 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
317c0 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
317d0 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
317e0 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
317f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
31800 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
31810 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
31820 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
31830 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
31840 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
31850 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
31860 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
31870 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
31880 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
31890 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
318a0 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
318b0 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
318c0 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
318d0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
318e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
318f0 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
31900 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
31910 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
31920 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
31930 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
31940 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
31950 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
31960 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
31970 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
31980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
31990 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
319a0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
319b0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
319c0 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
319d0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
319e0 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
319f0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
31a00 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
31a10 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
31a20 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
31a30 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
31a40 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
31a50 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
31a60 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
31a70 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
31a80 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
31a90 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
31aa0 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
31ab0 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
31ac0 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
31ad0 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
31ae0 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
31af0 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
31b00 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
31b10 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
31b20 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
31b30 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
31b40 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
31b50 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
31b60 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
31b70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
31b80 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
31b90 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
31ba0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
31bb0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
31bc0 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
31bd0 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
31be0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
31bf0 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
31c00 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
31c10 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
31c20 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
31c30 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
31c40 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
31c50 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
31c60 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
31c70 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
31c80 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
31c90 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
31ca0 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
31cb0 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
31cc0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
31cd0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
31ce0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
31cf0 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
31d00 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
31d10 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
31d20 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
31d30 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
31d40 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
31d50 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
31d60 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
31d70 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
31d80 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
31d90 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
31da0 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
31db0 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
31dc0 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
31dd0 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
31de0 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
31df0 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
31e00 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
31e10 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
31e20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
31e30 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
31e40 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
31e50 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
31e60 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
31e70 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
31e80 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
31e90 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
31ea0 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
31eb0 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
31ec0 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
31ed0 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
31ee0 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
31ef0 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
31f00 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
31f10 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
31f20 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
31f30 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
31f40 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
31f50 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
31f60 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
31f70 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
31f80 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
31f90 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
31fa0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
31fb0 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
31fc0 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
31fd0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
31fe0 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
31ff0 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
32000 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
32010 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
32020 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
32030 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
32040 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
32050 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
32060 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51  y calling the SQ
32070 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
32080 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
32090 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
320a0 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
320b0 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
320c0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
320d0 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
320e0 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
320f0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
32100 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
32110 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
32120 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
32130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32140 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
32150 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
32160 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
32170 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
32180 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
32190 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
321a0 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
321b0 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
321c0 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
321d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
321e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
321f0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
32200 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
32210 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
32220 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
32230 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
32240 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
32250 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
32260 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
32270 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
32280 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
32290 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
322a0 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
322b0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
322c0 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
322d0 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
322e0 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
322f0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
32300 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
32310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32320 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
32330 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
32340 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
32350 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
32360 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
32370 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
32380 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
32390 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
323a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
323b0 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
323c0 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
323d0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
323e0 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
323f0 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
32400 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
32410 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
32420 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
32430 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
32440 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
32450 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
32460 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
32470 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
32480 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
32490 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
324a0 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
324b0 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
324c0 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
324d0 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
324e0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
324f0 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
32500 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
32510 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
32520 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
32530 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
32540 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
32550 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
32560 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
32570 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
32580 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
32590 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
325a0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
325b0 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
325c0 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
325d0 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
325e0 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
325f0 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
32600 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
32610 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
32620 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
32630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32640 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67   lPath, errno, g
32650 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
32660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
32670 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  OERR_LOCK;.    }
32680 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
32690 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74  at(lPath, "sqlit
326a0 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e  eplocks", maxLen
326b0 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73  );    .  }.# els
326c0 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  e.  len = strlcp
326d0 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22  y(lPath, "/tmp/"
326e0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64  , maxLen);.# end
326f0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  if.#endif..  if(
32700 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27   lPath[len-1]!='
32710 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  /' ){.    len = 
32720 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
32730 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d  /", maxLen);.  }
32740 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f  .  .  /* transfo
32750 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74  rm the db path t
32760 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65  o a unique cache
32770 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e   name */.  dbLen
32780 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
32790 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69  bPath);.  for( i
327a0 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28  =0; i<dbLen && (
327b0 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61  i+len+7)<(int)ma
327c0 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
327d0 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
327e0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
327f0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
32800 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
32810 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
32820 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
32830 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
32840 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
32850 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
32860 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
32870 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
32880 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
32890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
328a0 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
328b0 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
328c0 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
328d0 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
328e0 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
328f0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
32900 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
32910 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
32920 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
32930 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
32940 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
32950 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
32960 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
32970 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
32980 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
32990 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
329a0 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
329b0 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
329c0 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
329d0 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
329e0 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
329f0 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
32a00 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
32a10 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
32a20 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
32a30 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
32a40 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
32a50 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
32a60 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
32a70 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
32a80 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
32a90 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
32aa0 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
32ab0 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
32ac0 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
32ad0 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
32ae0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
32af0 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
32b00 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
32b10 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
32b20 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
32b30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
32b40 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
32b50 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
32b60 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
32b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
32b80 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
32b90 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
32ba0 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
32bb0 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
32bc0 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
32bf0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
32c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
32c10 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
32c20 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
32c30 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
32c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
32c50 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
32c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32c80 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
32c90 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
32ca0 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
32cb0 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
32cc0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
32cd0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
32ce0 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
32cf0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
32d00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
32d10 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
32d20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
32d30 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
32d40 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
32d50 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
32d60 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
32d70 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
32d80 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
32d90 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
32da0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
32db0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
32dc0 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
32dd0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
32de0 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
32df0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
32e00 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
32e10 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
32e20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
32e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
32e40 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
32e50 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
32e60 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
32e70 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
32e80 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
32e90 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
32ea0 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
32eb0 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
32ec0 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
32ed0 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
32ee0 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
32ef0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
32f00 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
32f10 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
32f20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
32f30 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
32f40 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
32f50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32f60 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
32f70 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
32f80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
32f90 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
32fa0 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
32fb0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
32fc0 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
32fd0 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
32fe0 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
32ff0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
33000 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
33010 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
33020 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
33030 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
33040 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
33050 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
33060 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
33070 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
33080 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
33090 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
330a0 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
330b0 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
330c0 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
330d0 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
330e0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
330f0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
33100 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
33110 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
33120 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
33130 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
33140 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
33150 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
33160 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
33170 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
33180 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
33190 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
331a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
331b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
331c0 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
331d0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
331e0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
331f0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
33200 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
33210 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
33220 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
33230 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
33240 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
33250 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
33260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33270 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
33280 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
33290 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
332a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
332b0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
332c0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
332d0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
332e0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
332f0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
33300 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
33310 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
33320 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
33330 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
33340 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33350 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
33360 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
33370 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
33380 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
33390 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
333a0 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
333b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
333c0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
333d0 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
333e0 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
333f0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
33400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
33410 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
33420 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
33430 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
33440 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
33450 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
33460 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
33470 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
33480 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33490 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
334a0 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
334b0 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
334c0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
334d0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
334e0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
334f0 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
33500 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
33510 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
33520 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
33530 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
33540 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
33550 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
33560 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
33570 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
33580 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
33590 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
335a0 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
335b0 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
335c0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
335d0 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
335e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
335f0 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
33600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33610 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
33620 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
33630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
33640 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
33650 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
33660 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
33670 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
33680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
33690 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
336a0 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
336b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
336c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
336d0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
336e0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
336f0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
33700 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
33710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
33720 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
33730 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
33740 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
33750 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
33760 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
33770 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
33780 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
33790 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
337a0 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
337b0 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
337c0 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
337d0 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
337e0 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
337f0 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
33800 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
33810 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
33820 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
33830 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
33840 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
33850 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
33860 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
33870 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
33880 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
33890 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
338a0 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
338b0 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
338c0 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
338d0 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
338e0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
338f0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
33900 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
33910 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
33930 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
33940 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
33950 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
33960 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
33970 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
33980 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
33990 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
339a0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
339b0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
339c0 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
339d0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
339e0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
339f0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
33a00 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
33a10 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
33a20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
33a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
33a40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33a50 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
33a60 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
33a70 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
33a80 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
33a90 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
33aa0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
33ab0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
33ac0 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
33ad0 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
33ae0 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
33af0 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
33b00 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
33b10 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
33b20 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
33b30 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
33b40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
33b50 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
33b60 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
33b70 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
33b80 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
33b90 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
33ba0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
33bb0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
33bc0 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
33bd0 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
33be0 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
33bf0 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
33c00 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
33c10 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
33c20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
33c30 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
33c40 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
33c50 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
33c60 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
33c70 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
33c80 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
33c90 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
33ca0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
33cb0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
33cc0 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
33cd0 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
33ce0 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
33cf0 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
33d00 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
33d10 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
33d20 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
33d30 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
33d40 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
33d50 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
33d60 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
33d70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
33d80 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
33d90 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
33da0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
33db0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33dc0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
33dd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
33de0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
33df0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
33e00 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
33e10 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
33e20 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
33e30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
33e40 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
33e50 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
33e60 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
33e70 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
33e80 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
33e90 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
33ea0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
33eb0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
33ec0 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
33ed0 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
33ee0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
33ef0 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
33f00 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
33f10 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
33f20 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
33f30 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
33f40 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
33f50 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
33f60 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
33f70 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
33f80 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
33f90 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
33fa0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
33fb0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
33fc0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
33fd0 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
33fe0 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
33ff0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
34000 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
34010 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
34020 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
34030 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
34040 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
34050 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
34060 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
34070 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
34080 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
34090 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
340a0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
340b0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
340c0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
340d0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
340e0 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
340f0 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
34100 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
34110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
34120 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
34130 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
34140 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
34150 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
34160 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
34170 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
34180 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
34190 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
341a0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
341b0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
341c0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
341d0 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
341e0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
341f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34200 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
34210 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
34220 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
34230 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
34240 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
34250 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
34260 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
34270 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
34280 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
34290 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
342a0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
342b0 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
342c0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
342d0 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
342e0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
342f0 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
34300 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
34310 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
34320 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
34330 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
34340 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
34350 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
34360 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
34370 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
34380 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
34390 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
343a0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
343b0 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
343c0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
343d0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
343e0 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
343f0 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
34400 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
34410 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
34420 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
34430 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
34440 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
34450 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
34460 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
34470 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
34480 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
34490 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
344a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
344b0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
344c0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
344d0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
344e0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
344f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
34500 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
34510 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
34520 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
34530 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
34540 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
34550 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
34560 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
34570 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
34580 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
34590 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
345a0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
345b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
345c0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
345d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
345e0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
345f0 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
34600 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
34610 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
34620 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34630 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
34640 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
34650 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
34660 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
34670 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
34680 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
34690 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
346a0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
346b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
346c0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
346d0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
346e0 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
346f0 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
34700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
34710 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
34720 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
34730 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
34740 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
34750 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
34760 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
34770 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
34780 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
34790 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
347a0 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
347b0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
347c0 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
347d0 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
347e0 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
347f0 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
34800 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
34810 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
34820 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
34830 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
34840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
34850 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
34860 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
34870 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
34880 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
34890 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
348a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
348b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
348c0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
348d0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
348e0 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
348f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
34900 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
34910 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
34920 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
34930 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
34940 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
34950 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
34960 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
34970 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
34980 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
34990 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
349a0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
349b0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
349c0 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
349d0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
349e0 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
349f0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
34a00 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
34a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34a20 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
34a30 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
34a40 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
34a50 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
34a60 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
34a70 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
34a80 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
34a90 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
34aa0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
34ab0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
34ac0 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
34ad0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
34ae0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
34af0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
34b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
34b10 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
34b20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
34b30 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
34b40 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
34b50 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
34b60 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
34b70 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
34b80 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
34b90 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
34ba0 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
34bb0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
34bc0 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
34bd0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
34be0 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
34bf0 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
34c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34c10 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
34c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34c30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
34c40 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
34c50 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
34c60 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
34c70 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
34c80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34c90 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
34ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
34cb0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
34cc0 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
34cd0 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
34ce0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
34cf0 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
34d00 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
34d10 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
34d20 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
34d30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
34d40 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
34d50 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
34d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
34d70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
34d80 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
34d90 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
34da0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
34db0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
34dc0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
34dd0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
34de0 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
34df0 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
34e00 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
34e10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
34e20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
34e30 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
34e40 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
34e50 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
34e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34e70 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
34e80 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
34e90 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
34ea0 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
34eb0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
34ec0 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
34ed0 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
34ee0 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
34ef0 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
34f00 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
34f10 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
34f20 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
34f30 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
34f40 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
34f50 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
34f60 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
34f70 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
34f80 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
34f90 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
34fa0 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
34fb0 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
34fc0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
34fd0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
34fe0 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
34ff0 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
35000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35010 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
35020 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
35030 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
35040 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
35050 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35060 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
35070 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
35080 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
35090 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
350a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
350b0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
350c0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
350d0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
350e0 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
350f0 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
35100 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
35110 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
35120 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
35130 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
35140 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
35150 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
35160 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
35170 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
35180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
35190 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
351a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
351b0 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
351c0 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
351d0 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
351e0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
351f0 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
35200 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
35210 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
35220 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
35230 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
35240 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
35250 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
35260 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
35270 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35280 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
35290 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
352a0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
352b0 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
352c0 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
352d0 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
352e0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
352f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
35300 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20  rrno = pError;. 
35310 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
35320 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
35330 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
35340 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
35350 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c  HostID, SHARED_L
35360 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
35370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35380 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
35390 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
353a0 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65     /* read the e
353b0 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69  xisting conch fi
353c0 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65  le */.    readLe
353d0 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  n = seekAndRead(
353e0 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68  (unixFile*)conch
353f0 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66  File, 0, readBuf
35400 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
35410 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65  LEN);.    if( re
35420 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  adLen<0 ){.     
35430 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c   /* I/O error: l
35440 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
35450 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
35460 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
35470 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c  Errno = conchFil
35480 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
35490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
354a0 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20  IOERR_READ;.    
354b0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
354c0 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20  onch;.    }else 
354d0 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52  if( readLen<=(PR
354e0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
354f0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c  OXY_HOSTIDLEN) |
35500 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
35510 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61  readBuf[0]!=(cha
35520 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
35530 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  SION ){.      /*
35540 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72   a short read or
35550 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20   version format 
35560 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77  mismatch means w
35570 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
35580 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a   a new .      **
35590 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20   conch file. .  
355a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65      */.      cre
355b0 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20  ateConch = 1;.  
355c0 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68    }.    /* if th
355d0 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
355e0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70  s and the lock p
355f0 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73  ath already exis
35600 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a  ts in the conch.
35610 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79      ** we'll try
35620 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68   to use the path
35630 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61   there, if we ca
35640 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61  n't open that pa
35650 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a  th, we'll .    *
35660 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e  * retry with a n
35670 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  ew auto-generate
35680 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20  d path .    */. 
35690 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61     do { /* in ca
356a0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  se we need to tr
356b0 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a  y again for an :
356c0 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b  auto: named lock
356d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
356e0 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68  if( !createConch
356f0 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63   && !forceNewLoc
35700 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
35710 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21   hostIdMatch = !
35720 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b  memcmp(&readBuf[
35730 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
35740 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20  , myHostID, .   
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
35770 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
35780 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74  .        /* if t
35790 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
357a0 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
357b0 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
357c0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
357d0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
357e0 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
357f0 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
35800 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
35810 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
35820 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
35830 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68         ** use th
35840 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
35850 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c  e path that's al
35860 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20  ready in there. 
35870 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
35880 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49         if( hostI
35890 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  dMatch ){.      
358a0 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74        size_t pat
358b0 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20  hLen = (readLen 
358c0 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  - PROXY_PATHINDE
358d0 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  X);.            
358e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
358f0 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54   pathLen>=MAXPAT
35900 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  HLEN ){.        
35910 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41        pathLen=MA
35920 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20  XPATHLEN-1;.    
35930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35940 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63        memcpy(loc
35950 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  kPath, &readBuf[
35960 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
35970 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  , pathLen);.    
35980 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68          lockPath
35990 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20  [pathLen] = 0;. 
359a0 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c             tempL
359b0 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
359c0 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
359d0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
359e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
359f0 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
35a00 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
35a10 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  h if the conch i
35a20 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
35a30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
35a40 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
35a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
35a60 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d  else if( hostIdM
35a70 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  atch.           
35a80 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28      && !strncmp(
35a90 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35aa0 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
35ab0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a  OXY_PATHINDEX],.
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c             readL
35ae0 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en-PROXY_PATHIND
35af0 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  EX).        ){. 
35b00 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63           /* conc
35b10 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20  h host and lock 
35b20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20  path match */.  
35b30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
35b40 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20  _takeconch; .   
35b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35b60 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69       .      /* i
35b70 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  f the conch isn'
35b80 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64  t writable and d
35b90 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65  oesn't match, we
35ba0 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a   can't take it *
35bb0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e  /.      if( (con
35bc0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
35bd0 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29  s&O_RDWR) == 0 )
35be0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
35bf0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
35c00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
35c10 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
35c20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
35c30 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68  either the conch
35c40 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72   didn't match or
35c50 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
35c60 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  te a new one */.
35c70 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
35c80 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
35c90 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47  {.        proxyG
35ca0 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d  etLockPath(pCtx-
35cb0 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74  >dbPath, lockPat
35cc0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
35cd0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
35ce0 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
35cf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61  .        /* crea
35d00 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
35d10 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79   lock path _only
35d20 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  _ if the conch i
35d30 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
35d40 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
35d50 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
35d60 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
35d70 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
35d80 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
35d90 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ess.      ** has
35da0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
35db0 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20  lready), if the 
35dc0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c  host id matches,
35dd0 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20   use the big.   
35de0 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20     ** stick..   
35df0 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69     */.      futi
35e00 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mes(conchFile->h
35e10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  , NULL);.      i
35e20 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26  f( hostIdMatch &
35e30 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29  & !createConch )
35e40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
35e50 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  nchFile->pInode 
35e60 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  && conchFile->pI
35e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
35e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35e90 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
35ea0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
35eb0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
35ec0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
35ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
35ee0 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
35ef0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
35f00 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
35f10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35f20 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
35f30 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
35f40 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
35f50 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
35f60 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
35f70 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
35f80 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
35f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35fa0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
35fb0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
35fc0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
35fd0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
35fe0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
35ff0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
36000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36010 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
36020 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
36030 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
36040 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
36050 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
36060 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
36070 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
36080 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
36090 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
360a0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
360b0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
360c0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
360d0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
360e0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
360f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
36100 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
36110 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
36120 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
36130 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
36140 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
36150 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
36160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36170 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
36180 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
36190 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
361a0 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
361b0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
361c0 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
361d0 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
361e0 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
361f0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
36200 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
36210 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e      robust_ftrun
36220 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  cate(conchFile->
36230 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20  h, writeSize);. 
36240 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
36250 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
36260 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
36270 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72   writeBuffer, wr
36280 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  iteSize, 0);.   
36290 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68       fsync(conch
362a0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
362b0 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74    /* If we creat
362c0 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66  ed a new conch f
362d0 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70  ile (not just up
362e0 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e  dated the conten
362f0 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20  ts of a .       
36300 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68    ** valid conch
36310 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d   file), try to m
36320 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73  atch the permiss
36330 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
36340 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a  base .         *
36350 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
36360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
36370 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
36380 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
36390 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20  tat buf;.       
363a0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46     int err = osF
363b0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
363c0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  buf);.          
363d0 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20  if( err==0 ){.  
363e0 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74            mode_t
363f0 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f   cmode = buf.st_
36400 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f  mode&(S_IRUSR|S_
36410 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c  IWUSR | S_IRGRP|
36420 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20  S_IWGRP |.      
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36450 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54    S_IROTH|S_IWOT
36460 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  H);.            
36470 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  /* try to match 
36480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36490 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e  e R/W permission
364a0 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72  s, ignore failur
364b0 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
364c0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
364d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 46 63              osFc
364e0 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
364f0 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65  h, cmode);.#else
36500 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b  .            do{
36510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
36520 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e  c = osFchmod(con
36530 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
36540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
36550 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20  while( rc==(-1) 
36560 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
36570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36580 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
36590 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
365a0 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
365b0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
365c0 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
365d0 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
365e0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
365f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36600 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
36610 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
36620 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
36630 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
36640 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
36650 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
36660 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
36670 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
36680 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
36690 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
366a0 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
366b0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
366c0 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
366d0 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
366e0 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
366f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
36700 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
36710 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
36720 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
36730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36740 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
36750 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
36760 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
36770 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
36780 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
36790 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
367a0 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
367b0 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
367c0 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
367d0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
367e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
367f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
36800 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
36810 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20 20   int fd;.       
36820 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
36830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f   ){.          ro
36840 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
36850 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
36860 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d  NE__);.        }
36870 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
36880 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  h = -1;.        
36890 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
368a0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
368b0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c  File->openFlags,
368c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54   0);.        OST
368d0 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
368e0 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20  Y: OPEN  %d\n", 
368f0 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fd));.        if
36900 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
36910 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
36920 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  fd;.        }els
36930 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  e{.          rc=
36940 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
36950 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f  BKPT; /* SQLITE_
36960 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43  BUSY? proxyTakeC
36970 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20  onch called.    
36980 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f         during lo
36990 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
369a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
369b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
369c0 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63  OK && !pCtx->loc
369d0 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
369e0 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74    char *path = t
369f0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65  empLockPath ? te
36a00 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74  mpLockPath : pCt
36a10 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
36a20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
36a30 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
36a40 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e  le(path, &pCtx->
36a50 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20  lockProxy, 1);. 
36a60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36a70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
36a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
36a90 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29  tryOldLockPath )
36aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77  {.          /* w
36ab0 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74  e couldn't creat
36ac0 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  e the proxy lock
36ad0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f   file with the o
36ae0 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  ld lock file pat
36af0 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  h.           ** 
36b00 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61  so try again via
36b10 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20   auto-naming .  
36b20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36b30 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f        forceNewLo
36b40 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
36b50 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
36b60 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Path = 0;.      
36b70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
36b80 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20   go back to the 
36b90 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72  do {} while star
36ba0 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61  t point, try aga
36bb0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  in */.        }.
36bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36be0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ){.        /* Ne
36bf0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
36c00 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20  y of path if we 
36c10 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61  extracted the va
36c20 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  lue.         ** 
36c30 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66  from the conch f
36c40 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20  ile or the path 
36c50 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  was allocated on
36c60 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20   the stack.     
36c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
36c80 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  f( tempLockPath 
36c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
36ca0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
36cb0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
36cc0 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  up(0, tempLockPa
36cd0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  th);.          i
36ce0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
36cf0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
36d00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
36d10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
36d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
36d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36d50 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
36d60 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a  >conchHeld = 1;.
36d70 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
36d80 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
36d90 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  roxy->pMethod ==
36da0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
36db0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c  {.          afpL
36dc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61  ockingContext *a
36dd0 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20  fpCtx;.         
36de0 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f   afpCtx = (afpLo
36df0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36e00 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
36e10 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
36e20 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
36e30 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d  ->dbPath = pCtx-
36e40 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
36e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36e60 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
36e70 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
36e80 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36e90 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
36ea0 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
36eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
36ec0 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
36ed0 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
36ee0 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
36ef0 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
36f00 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66  QLITE_OK?"ok":"f
36f10 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
36f20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36f30 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69   while (1); /* i
36f40 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
36f50 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74  o retry the :aut
36f60 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a  o: lock file - .
36f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f80 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65   ** we should ne
36f90 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63  ver get here exc
36fa0 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e  ept via the 'con
36fb0 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a  tinue' call. */.
36fc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
36fd0 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f  pFile holds a lo
36fe0 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69  ck on a conch fi
36ff0 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65  le, then release
37000 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73   that lock..*/.s
37010 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52  tatic int proxyR
37020 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78  eleaseConch(unix
37030 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
37040 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37050 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  OK;         /* S
37060 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
37070 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79   code */.  proxy
37080 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37090 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f  pCtx;  /* The lo
370a0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  cking context fo
370b0 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  r the proxy lock
370c0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
370d0 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
370e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
370f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a   conch file */..
37100 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c    pCtx = (proxyL
37110 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
37120 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
37130 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69  ntext;.  conchFi
37140 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
37150 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  File;.  OSTRACE(
37160 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
37170 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
37180 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
37190 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  h,.           (p
371a0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
371b0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
371c0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
371d0 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20  o:"), .         
371e0 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20    getpid()));.  
371f0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
37200 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20  eld>0 ){.    rc 
37210 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
37220 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
37230 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
37240 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
37250 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f  ;.  }.  pCtx->co
37260 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f  nchHeld = 0;.  O
37270 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
37280 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
37290 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
372a0 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
372b0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
372c0 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20  : "failed")));. 
372d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
372e0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
372f0 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
37300 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20  e file, compute 
37310 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20  the name of its 
37320 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53  conch file..** S
37330 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66  tore the conch f
37340 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72  ilename in memor
37350 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
37360 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
37370 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63  ..** Make *pConc
37380 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74  hPath point to t
37390 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65  he new name.  Re
373a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
373b0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
373c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
373d0 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e  unable to obtain
373e0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
373f0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
37400 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
37410 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61  uring that the a
37420 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
37430 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e  ** space is even
37440 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  tually freed..**
37450 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  .** *pConchPath 
37460 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
37470 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
37480 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
37490 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
374a0 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  t proxyCreateCon
374b0 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20  chPathname(char 
374c0 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a  *dbPath, char **
374d0 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69  pConchPath){.  i
374e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
374f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37500 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
37510 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74    int len = (int
37520 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
37530 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61   /* Length of da
37540 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
37550 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68  - dbPath */.  ch
37560 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20  ar *conchPath;  
37570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
37580 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
37590 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63  o construct conc
375a0 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20  h name */..  /* 
375b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
375c0 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
375d0 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61  ename and initia
375e0 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  lize the name to
375f0 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
37600 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
37610 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
37620 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68    .  *pConchPath
37630 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28   = conchPath = (
37640 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
37650 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a  alloc(len + 8);.
37660 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d    if( conchPath=
37670 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
37680 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37690 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63   }.  memcpy(conc
376a0 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c  hPath, dbPath, l
376b0 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  en+1);.  .  /* n
376c0 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20  ow insert a "." 
376d0 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
376e0 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  / character */. 
376f0 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b   for( i=(len-1);
37700 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20   i>=0; i-- ){.  
37710 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b    if( conchPath[
37720 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
37730 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61   i++;.      brea
37740 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  k;.    }.  }.  c
37750 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b  onchPath[i]='.';
37760 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e  .  while ( i<len
37770 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74   ){.    conchPat
37780 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d  h[i+1]=dbPath[i]
37790 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
377a0 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20    /* append the 
377b0 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20  "-conch" suffix 
377c0 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
377d0 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61   memcpy(&conchPa
377e0 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68  th[i+1], "-conch
377f0 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 7);.  assert(
37800 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e   (int)strlen(con
37810 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37  chPath) == len+7
37820 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
37830 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
37840 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f  Takes a fully co
37850 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c  nfigured proxy l
37860 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69  ocking-style uni
37870 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63  x file and switc
37880 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  hes.** the local
37890 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
378a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
378b0 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
378c0 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  th(unixFile *pFi
378d0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
378e0 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
378f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
37900 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
37910 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
37920 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37930 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61  t;.  char *oldPa
37940 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
37950 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20  roxyPath;.  int 
37960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37970 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
37980 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
37990 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
379a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
379b0 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20   ..  /* nothing 
379c0 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74  to do if the pat
379d0 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f  h is NULL, :auto
379e0 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65  : or matches the
379f0 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a   existing path *
37a00 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c  /.  if( !path ||
37a10 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c   path[0]=='\0' |
37a20 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20  | !strcmp(path, 
37a30 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20  ":auto:") ||.   
37a40 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74   (oldPath && !st
37a50 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70  rncmp(oldPath, p
37a60 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
37a70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
37a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
37a90 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
37aa0 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
37ab0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
37ac0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
37ad0 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74  xy=NULL;.    pCt
37ae0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
37af0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72  ;.    if( lockPr
37b00 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  oxy!=NULL ){.   
37b10 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d     rc=lockProxy-
37b20 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
37b30 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
37b40 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
37b50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37b60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
37b70 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
37b80 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oxy);.    }.    
37b90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64  sqlite3_free(old
37ba0 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d  Path);.    pCtx-
37bb0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
37bc0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
37bd0 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20  (0, path);.  }. 
37be0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
37bf0 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73  ../*.** pFile is
37c00 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
37c10 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
37c20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61  a prior xOpen ca
37c30 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69  ll.  dbPath.** i
37c40 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  s a string buffe
37c50 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41  r at least MAXPA
37c60 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65  THLEN+1 characte
37c70 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  rs in size..**.*
37c80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66  * This routine f
37c90 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ind the filename
37ca0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
37cb0 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65   pFile and write
37cc0 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61  s it.** int dbPa
37cd0 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
37ce0 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68  t proxyGetDbPath
37cf0 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
37d00 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
37d10 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20  r *dbPath){.#if 
37d20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
37d30 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  _).  if( pFile->
37d40 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
37d50 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
37d60 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65  /* afp style kee
37d70 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ps a reference t
37d80 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e  o the db path in
37d90 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69   the filePath fi
37da0 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  eld .    ** of t
37db0 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  he struct */.   
37dc0 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
37dd0 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
37de0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37df0 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
37e00 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62  ;.    strlcpy(db
37e10 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69  Path, ((afpLocki
37e20 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37e30 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37e40 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50  t)->dbPath, MAXP
37e50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73  ATHLEN);.  } els
37e60 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  e.#endif.  if( p
37e70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
37e80 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
37e90 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74  ds ){.    /* dot
37ea0 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73   lock style uses
37eb0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
37ec0 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
37ed0 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a  e dot lock.    *
37ee0 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  * file path */. 
37ef0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
37f00 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c  len((char *)pFil
37f10 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37f20 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c  t) - strlen(DOTL
37f30 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20  OCK_SUFFIX);.   
37f40 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20   memcpy(dbPath, 
37f50 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
37f60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c  ockingContext, l
37f70 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65  en + 1);.  }else
37f80 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68  {.    /* all oth
37f90 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68  er styles use th
37fa0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
37fb0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64  t to store the d
37fc0 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  b file path */. 
37fd0 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
37fe0 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
37ff0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
38000 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
38010 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74     strlcpy(dbPat
38020 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
38030 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
38040 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
38050 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
38060 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
38070 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79  Takes an already
38080 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20   filled in unix 
38090 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20  file and alters 
380a0 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c  it so all file l
380b0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20  ocking .** will 
380c0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  be performed on 
380d0 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  the local proxy 
380e0 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20  lock file.  The 
380f0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
38100 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76 65  .** are preserve
38110 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  d in the locking
38120 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74   context so that
38130 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
38140 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68  tored and .** th
38150 65 20 75 6e 69 78 20 73 74 72 75 63 74 75 72 65  e unix structure
38160 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65   properly cleane
38170 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69  d up at close ti
38180 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e  me:.**  ->lockin
38190 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70  gContext.**  ->p
381a0 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63  Method.*/.static
381b0 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
381c0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
381d0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
381e0 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
381f0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
38200 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
38210 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50  char dbPath[MAXP
38220 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20  ATHLEN+1];      
38230 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
38240 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
38250 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  .  char *lockPat
38260 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63  h=NULL;.  int rc
38270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
38280 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
38290 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
382a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
382b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
382c0 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68    proxyGetDbPath
382d0 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ForUnixFile(pFil
382e0 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66  e, dbPath);.  if
382f0 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b  ( !path || path[
38300 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72  0]=='\0' || !str
38310 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f  cmp(path, ":auto
38320 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50  :") ){.    lockP
38330 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  ath=NULL;.  }els
38340 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  e{.    lockPath=
38350 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20  (char *)path;.  
38360 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  }.  .  OSTRACE((
38370 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20  "TRANSPROXY  %d 
38380 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
38390 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
383a0 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68         (lockPath
383b0 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a   ? lockPath : ":
383c0 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28  auto:"), getpid(
383d0 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73  )));..  pCtx = s
383e0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
383f0 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
38400 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
38410 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38420 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
38430 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20  memset(pCtx, 0, 
38440 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a  sizeof(*pCtx));.
38450 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65  .  rc = proxyCre
38460 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
38470 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  (dbPath, &pCtx->
38480 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
38490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
384a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
384b0 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
384c0 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ile(pCtx->conchF
384d0 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  ilePath, &pCtx->
384e0 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20  conchFile, 0);. 
384f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38500 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28  E_CANTOPEN && ((
38510 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
38520 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29  &O_RDWR) == 0) )
38530 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61  {.      /* if (a
38540 29 20 74 68 65 20 6f 70 65 6e 20