/ Hex Artifact Content
Login

Artifact a4d7076a6edd4e6a8594191880e540a31b2c8598:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 20 20  on */..#endif.  
22c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
22d0: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
22e0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
22f0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
2300: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
2310: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f  ite3_int64 mmapO
2320: 72 69 67 73 69 7a 65 3b 20 20 20 20 20 2f 2a 20  rigsize;     /* 
2330: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2340: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
2350: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
2360: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d 69  3_int64 mmapLimi
2370: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t;        /* Con
2380: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
2390: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23a0: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
23b0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
23c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
23d0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
23e0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
2410: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
2420: 72 65 66 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20  refs */..#ifdef 
2430: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2440: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2450: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2460: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2470: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
2480: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
2490: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
24a0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
24b0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
24c0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
24d0: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
24e0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
24f0: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2500: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2510: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2520: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2530: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2540: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2550: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2560: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2570: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2580: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
2590: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
25a0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
25b0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
25c0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
25d0: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
25e0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
25f0: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2600: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2610: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2620: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2630: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2640: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2650: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2660: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2670: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
2680: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
2690: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
26a0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
26b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
26c0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
26d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26e0: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
26f0: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2700: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2710: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2720: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2730: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2740: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2750: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2760: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2770: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
2780: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
2790: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
27a0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
27b0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
27c0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
27d0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
27e0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
27f0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2800: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2810: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2820: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2830: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2840: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2850: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2860: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2870: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2880: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2890: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
28a0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
28b0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
28c0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
28d0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
28e0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
28f0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2900: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2910: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2920: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2930: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2940: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2950: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2960: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2970: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2980: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2990: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
29a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
29b0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
29c0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
29d0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
29e0: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
29f0: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2a00: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2a10: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2a20: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2a30: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2a40: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2a50: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2a60: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2a70: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
2a80: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
2a90: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
2aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
2ab0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
2ac0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2ad0: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2ae0: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2af0: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2b00: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2b10: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2b20: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2b30: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2b40: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2b50: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2b60: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
2b70: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
2b80: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
2b90: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
2ba0: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
2bb0: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
2bc0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
2bd0: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
2be0: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
2bf0: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
2c00: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
2c10: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
2c20: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
2c30: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
2c40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2c50: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
2c60: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
2c70: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
2c80: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
2c90: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
2ca0: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
2cb0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2cc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2cd0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2ce0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2d00: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2d10: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2d20: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2d30: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2d40: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2d50: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2d60: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2d70: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2d80: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2d90: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2da0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2db0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2dc0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2dd0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2de0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2df0: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2e00: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2e10: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2e20: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e40: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2e50: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2e60: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2e70: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2e80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2e90: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ea0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2eb0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2ec0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2ed0: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2ee0: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2ef0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2f00: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2f10: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2f20: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2f30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2f40: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2f50: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2f60: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2f70: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2f80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2f90: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2fa0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2fb0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2fc0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2fd0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2fe0: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2ff0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3000: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
3010: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
3020: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
3030: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3040: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
3050: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
3060: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
3070: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3080: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
3090: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
30a0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
30b0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
30c0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
30d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
30e0: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
30f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3100: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
3110: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
3120: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
3130: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
3140: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
3150: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
3160: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
3170: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
3180: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
3190: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
31a0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
31b0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
31c0: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
31d0: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
31e0: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
31f0: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3200: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3210: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3220: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3230: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3240: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3250: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
3260: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
3270: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
3280: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
32a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
32b0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
32c0: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
32d0: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
32e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
32f0: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3300: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3310: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3320: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3330: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3340: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3350: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
3360: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
3370: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
3380: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
3390: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
33a0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
33b0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
33c0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
33d0: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
33e0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
33f0: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3400: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3410: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3420: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3430: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3440: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3450: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
3460: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3470: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
3480: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
3490: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
34a0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
34b0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
34c0: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
34d0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
34e0: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
34f0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3500: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3530: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3540: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3550: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3560: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3570: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3580: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3590: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
35a0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
35b0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
35c0: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
35d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
35e0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
35f0: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3600: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3610: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3620: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3630: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3640: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3650: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3660: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3670: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
3680: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
3690: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
36a0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
36b0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
36c0: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
36d0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
36e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
36f0: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3700: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3710: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3720: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3730: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3740: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3750: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3760: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
3770: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
3780: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
3790: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
37a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
37b0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
37c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
37d0: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
37e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
37f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3800: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3810: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3820: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3830: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3840: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3860: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
3870: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3880: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
3890: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
38a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
38b0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
38c0: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
38d0: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
38e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
38f0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3900: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3910: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3920: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3930: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3940: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3950: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3960: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3970: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3980: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
3990: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
39a0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
39b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
39c0: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
39d0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
39e0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
39f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3a00: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3a10: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3a20: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3a30: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3a40: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3a50: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3a60: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
3a70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3a80: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3a90: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3aa0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3ab0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ac0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3ad0: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3ae0: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3af0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3b00: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3b10: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3b20: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b30: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3b40: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3b50: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3b60: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3b70: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
3b80: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3b90: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
3ba0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3bb0: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
3bc0: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3bd0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3be0: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3bf0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3c00: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3c10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3c20: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3c30: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3c40: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3c50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3c60: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3c70: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3c80: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3c90: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3ca0: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3cb0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3cc0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3cd0: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3ce0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3cf0: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3d00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3d10: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3d20: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e  nt)..  { "fchown
3d30: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3d40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3d50: 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30  sixFchown,     0
3d60: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
3d70: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3d80: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
3d90: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
3da0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
3db0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
3dc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3dd0: 29 6d 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a  )mmap,     0 },.
3de0: 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28  #define osMmap (
3df0: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
3e00: 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69  size_t,int,int,i
3e10: 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  nt,off_t))aSysca
3e20: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3e30: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
3e40: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
3e50: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
3e60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
3e70: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
3e80: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
3e90: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
3ea0: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69  l of the.** "uni
3eb0: 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  x" VFSes.  Retur
3ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
3ed0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
3ee0: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
3ef0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
3f00: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
3f10: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
3f20: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
3f30: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
3f40: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
3f60: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
3f70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3f80: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
3f90: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
3fa0: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
3fb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3fc0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
3fd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
3fe0: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
3ff0: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
4000: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
4010: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
4020: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
4030: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
4040: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
4050: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4060: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
4070: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4080: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
4090: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
40a0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
40b0: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
40c0: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
40d0: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
40e0: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
40f0: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
4100: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
4110: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4120: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4130: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4140: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4150: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4160: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
4170: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
4180: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4190: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
41a0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
41b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
41c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
41d0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
41e0: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
41f0: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
4200: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
4210: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
4220: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
4230: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
4240: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
4250: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
4260: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
4270: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
4280: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
4290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
42a0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
42b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
42c0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
42d0: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
42e0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
42f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4300: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4310: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
4320: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
4330: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
4340: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
4350: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
4360: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
4370: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
4380: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4390: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
43a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
43b0: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
43c0: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
43d0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
43e0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
43f0: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
4400: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
4410: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
4420: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
4430: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
4440: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
4450: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
4460: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4470: 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61   unixGetSystemCa
4480: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
4490: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63  s *pNotUsed,.  c
44a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
44b0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
44c0: 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  nt i;..  UNUSED_
44d0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
44e0: 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ed);.  for(i=0; 
44f0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
4500: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
4510: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
4520: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4530: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4540: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
4550: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  rn aSyscall[i].p
4560: 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  Current;.  }.  r
4570: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4580: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
4590: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
45a0: 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72  ystem call after
45b0: 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d   zName.  If zNam
45c0: 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  e==NULL.** then 
45d0: 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  return the name 
45e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
45f0: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
4600: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a  n NULL if zName.
4610: 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73  ** is the last s
4620: 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66  ystem call or if
4630: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68   zName is not th
4640: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
4650: 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  d.** system call
4660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
4670: 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74  t char *unixNext
4680: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
4690: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
46a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
46b0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
46c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
46d0: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
46e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
46f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
4700: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
4710: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
4720: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
4730: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
4740: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4750: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
4760: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4770: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4780: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4790: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
47a0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
47b0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
47c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
47d0: 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f  voke open().  Do
47e0: 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d   so multiple tim
47f0: 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74  es, until it eit
4800: 68 65 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a  her succeeds or.
4810: 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d  ** fails for som
4820: 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74  e reason other t
4830: 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a  han EINTR..**.**
4840: 20 49 66 20 74 68 65 20 66 69 6c 65 20 63 72 65   If the file cre
4850: 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69  ation mode "m" i
4860: 73 20 30 20 74 68 65 6e 20 73 65 74 20 69 74 20  s 0 then set it 
4870: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  to the default f
4880: 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54  or.** SQLite.  T
4890: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 53 51  he default is SQ
48a0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
48b0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e  E_PERMISSIONS (n
48c0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29  ormally.** 0644)
48d0: 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20   as modified by 
48e0: 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b  the system umask
48f0: 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30  .  If m is not 0
4900: 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74  , then.** make t
4910: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
4920: 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79   mode be exactly
4930: 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20   m ignoring the 
4940: 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  umask..**.** The
4950: 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c   m parameter wil
4960: 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  l be non-zero on
4970: 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ly when creating
4980: 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c   -wal, -journal,
4990: 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c  .** and -shm fil
49a0: 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f  es.  We want tho
49b0: 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65  se files to have
49c0: 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73   *exactly* the s
49d0: 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f  ame.** permissio
49e0: 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72 69 67  ns as their orig
49f0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75  inal database, u
4a00: 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62 79 20  nadulterated by 
4a10: 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e  the umask..** In
4a20: 20 74 68 61 74 20 77 61 79 2c 20 69 66 20 61 20   that way, if a 
4a30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
4a40: 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72   -rw-rw-rw or -r
4a50: 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a  w-rw-r-, and a.*
4a60: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  * transaction cr
4a70: 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73  ashes and leaves
4a80: 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72   behind hot jour
4a90: 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  nals, then any.*
4aa0: 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 69  * process that i
4ab0: 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20  s able to write 
4ac0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
4ad0: 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c  will also be abl
4ae0: 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20  e to.** recover 
4af0: 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  the hot journals
4b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4b10: 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73  robust_open(cons
4b20: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66  t char *z, int f
4b30: 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69  , mode_t m){.  i
4b40: 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20  nt fd;.  mode_t 
4b50: 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c  m2 = m ? m : SQL
4b60: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
4b70: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20  _PERMISSIONS;.  
4b80: 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
4b90: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
4ba0: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
4bb0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
4bc0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
4bd0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
4be0: 64 69 66 0a 20 20 7d 77 68 69 6c 65 28 20 66 64  dif.  }while( fd
4bf0: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
4c00: 54 52 20 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  TR );.  if( fd>=
4c10: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
4c20: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
4c30: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
4c40: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
4c50: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
4c60: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
4c70: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
4c80: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
4c90: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
4ca0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
4cb0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
4cc0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
4cd0: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
4ce0: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
4cf0: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
4d00: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
4d10: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
4d20: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
4d30: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
4d40: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
4d50: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
4d60: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
4d70: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
4d80: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
4d90: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
4da0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
4db0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
4dc0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
4dd0: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
4de0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
4df0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
4e00: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
4e10: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
4e20: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
4e30: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
4e40: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
4e50: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
4e60: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
4e70: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
4e80: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
4e90: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
4ea0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
4eb0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
4ec0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
4ed0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
4ee0: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
4ef0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
4f00: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
4f10: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
4f20: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
4f30: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
4f40: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
4f50: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
4f60: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
4f70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4f80: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
4f90: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
4fa0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
4fb0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
4fc0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
4fd0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
4fe0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
4ff0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5000: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5010: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5020: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5030: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5040: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
5050: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
5060: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5070: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
5080: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5090: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
50a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
50b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
50c0: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
50d0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
50e0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
50f0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5100: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5110: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5120: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
5130: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
5140: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
5150: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
5160: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
5170: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
5180: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5190: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
51a0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
51b0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
51c0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
51d0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
51e0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
51f0: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
5200: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
5210: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
5220: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
5230: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
5240: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
5250: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
5260: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
5270: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
5280: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
5290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
52a0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
52b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
52c0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
52d0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
52e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
52f0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
5300: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
5310: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
5320: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
5330: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
5340: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
5350: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
5360: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
5370: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
5380: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
5390: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
53a0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
53b0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
53c0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
53d0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
53e0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
53f0: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
5400: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
5410: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
5420: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
5430: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
5440: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
5450: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
5460: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
5470: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
5480: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
5490: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
54a0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
54b0: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
54c0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
54d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
54e0: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
54f0: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
5500: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
5510: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
5520: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
5530: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
5540: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
5550: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
5560: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
5570: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
5580: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5590: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
55a0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
55b0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
55c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
55d0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
55e0: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
55f0: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
5600: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
5610: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
5620: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
5630: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5640: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
5650: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
5660: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
5670: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
5680: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
5690: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
56a0: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
56b0: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
56c0: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
56d0: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
56e0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
56f0: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
5700: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
5710: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
5720: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
5730: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5740: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
5750: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
5760: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
5770: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
5780: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
5790: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
57a0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
57b0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
57c0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
57d0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
57e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
57f0: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
5800: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5810: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
5820: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5830: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
5840: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
5850: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
5860: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
5870: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
5880: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
5890: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
58a0: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
58b0: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
58c0: 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64  undef osFcntl.#d
58d0: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f  efine osFcntl lo
58e0: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
58f0: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
5900: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
5910: 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20  try ftruncate() 
5920: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
5930: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
5940: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
5950: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
5960: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
5970: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
5980: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
5990: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
59a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
59b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
59c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
59d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
59e0: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
59f0: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
5a00: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
5a10: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
5a20: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
5a30: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
5a40: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
5a50: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
5a60: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
5a70: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
5a80: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
5a90: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
5aa0: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
5ab0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
5ac0: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
5ad0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
5ae0: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
5af0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
5b00: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
5b10: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
5b20: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
5b30: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
5b40: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
5b50: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
5b60: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
5b70: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
5b80: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
5b90: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
5ba0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
5bb0: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
5bc0: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
5bd0: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
5be0: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
5bf0: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
5c00: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
5c10: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
5c20: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
5c30: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
5c40: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
5c50: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
5c60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
5c70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
5c80: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
5c90: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
5ca0: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
5cb0: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
5cc0: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
5cd0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
5ce0: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
5cf0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
5d00: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
5d10: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
5d20: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
5d30: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
5d40: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
5d50: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
5d60: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
5d70: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
5d80: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
5d90: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
5da0: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
5db0: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
5dc0: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
5dd0: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
5de0: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
5df0: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
5e00: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
5e10: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
5e20: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
5e30: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
5e40: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
5e50: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
5e60: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
5e70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
5e80: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
5e90: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
5ea0: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
5eb0: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
5ec0: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
5ed0: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
5ee0: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
5ef0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
5f00: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
5f10: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
5f20: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
5f30: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
5f40: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
5f50: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
5f60: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
5f70: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
5f80: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
5f90: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
5fa0: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
5fb0: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
5fc0: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
5fd0: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
5fe0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
5ff0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
6000: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
6010: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6020: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
6030: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
6040: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6050: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
6060: 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  ||.        (sqli
6070: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6080: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
6090: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
60a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
60b0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
60c0: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
60d0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
60e0: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
60f0: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
6100: 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44  .    .  /* EDEAD
6110: 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  LK is only possi
6120: 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ble if a call to
6130: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29   fcntl(F_SETLKW)
6140: 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20   is made. And.  
6150: 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e  ** this module n
6160: 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20  ever makes such 
6170: 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20  a call. And the 
6180: 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69  code in SQLite i
6190: 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65  tself .  ** asse
61a0: 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f  rts that SQLITE_
61b0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73  IOERR_BLOCKED is
61c0: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e   never returned.
61d0: 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f   For these reaso
61e0: 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73  ns.  ** this cas
61f0: 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e  e is also commen
6200: 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20  ted out. If the 
6210: 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20  system does set 
6220: 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b  errno to EDEADLK
6230: 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75  ,.  ** the defau
6240: 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  lt SQLITE_IOERR_
6250: 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  XXX code will be
6260: 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69   returned. */.#i
6270: 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44  f 0.  case EDEAD
6280: 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LK:.    return S
6290: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
62a0: 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  KED;.#endif.    
62b0: 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21  .#if EOPNOTSUPP!
62c0: 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20  =ENOTSUP.  case 
62d0: 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20  EOPNOTSUPP: .   
62e0: 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   /* something we
62f0: 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79  nt terribly awry
6300: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6310: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6320: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
6330: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6340: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6350: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6360: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ys */.#endif.#if
6370: 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61  def ENOTSUP.  ca
6380: 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20  se ENOTSUP: .   
6390: 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20   /* invalid fd, 
63a0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
63b0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
63c0: 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  t introspection,
63d0: 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20   in which .     
63e0: 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  * it actually me
63f0: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
6400: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73   */.#endif.  cas
6410: 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42  e EIO:.  case EB
6420: 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56  ADF:.  case EINV
6430: 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43  AL:.  case ENOTC
6440: 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44  ONN:.  case ENOD
6450: 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f  EV:.  case ENXIO
6460: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a  :.  case ENOENT:
6470: 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20  .#ifdef ESTALE  
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20     /* ESTALE is 
64a0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49  not defined on I
64b0: 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a  nterix systems *
64c0: 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  /.  case ESTALE:
64d0: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
64e0: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
64f0: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
6500: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
6510: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
6520: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
6530: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
6540: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
6550: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
6560: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65b0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
65c0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
65d0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
65e0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
65f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6600: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
6610: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
6620: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
6630: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
6640: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6650: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6660: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6670: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6680: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6690: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
66a0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
66b0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
66c0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
66d0: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
66e0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
66f0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
6700: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6710: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6720: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
6730: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
6740: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6750: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6760: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6770: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6780: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6790: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
67a0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
67b0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
67c0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
67d0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
67e0: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
67f0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6800: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6810: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6820: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6830: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6840: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6850: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6860: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6870: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6880: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6890: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
68a0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
68b0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
68c0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
68d0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
68e0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
68f0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6900: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6910: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6920: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6950: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6960: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6970: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6980: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6990: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
69a0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
69b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
69c0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
69d0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
69e0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
69f0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6a00: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6a10: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6a20: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6a30: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6a40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6a50: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
6a60: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6a70: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
6a80: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
6a90: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
6aa0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
6ab0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
6ac0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
6ad0: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
6ae0: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
6af0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
6b00: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
6b10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
6b20: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
6b30: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
6b40: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
6b50: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
6b60: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
6b70: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
6b80: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
6b90: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
6ba0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
6bb0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
6bc0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
6bd0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
6be0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
6bf0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
6c00: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
6c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
6c20: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6c30: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
6c40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
6c50: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
6c60: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
6c70: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
6c80: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
6c90: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
6ca0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6cb0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
6cc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
6cd0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
6ce0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
6cf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
6d00: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6d10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6d20: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6d30: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
6d40: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
6d50: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
6d60: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
6d70: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
6d80: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
6d90: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
6da0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
6db0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
6dc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6dd0: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
6de0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
6df0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
6e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
6e10: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
6e20: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
6e30: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
6e40: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
6e50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
6e60: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6e70: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
6e80: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
6e90: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
6ea0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
6eb0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
6ec0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
6ed0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
6ee0: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
6ef0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
6f00: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
6f10: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
6f20: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
6f30: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
6f40: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
6f50: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
6f60: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6f70: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
6f80: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
6f90: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
6fa0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
6fb0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
6fc0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
6fd0: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
6fe0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6ff0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
7000: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
7010: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
7020: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7030: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
7040: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
7050: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7060: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
7070: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
70a0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
70b0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
70c0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
70d0: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
70e0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
70f0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
7100: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7110: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
7120: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
7130: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7140: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7150: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7160: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
7170: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
7180: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7190: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
71a0: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
71b0: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
71c0: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
71d0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
71e0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
71f0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
7200: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
7210: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
7220: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
7230: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
7240: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7250: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
7260: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
7270: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7280: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
7290: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
72a0: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
72b0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
72c0: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
72d0: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
72e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
72f0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
7300: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
7310: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
7320: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7330: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
7340: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
7350: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
7360: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
7370: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
7380: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
7390: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
73a0: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
73b0: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
73c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
73d0: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
73e0: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
73f0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
7400: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
7410: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
7420: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
7430: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
7440: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
7450: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
7460: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7470: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
7480: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
7490: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
74a0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
74b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
74c0: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
74d0: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
74e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
74f0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7510: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
7520: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
7530: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
7540: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7550: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
7560: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
7570: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
7580: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
7590: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
75a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
75b0: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
75c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
75d0: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
75e0: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
75f0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
7600: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
7610: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
7620: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
7630: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
7640: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7650: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
7660: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
7680: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
7690: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
76a0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
7710: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
7780: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
7790: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
77c0: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
77d0: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
77e0: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
77f0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
7800: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
7810: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
7820: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
7830: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
7840: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
7850: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
7860: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
7870: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
7880: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
7890: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
78a0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
78b0: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
78c0: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
78d0: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
78e0: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
78f0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7900: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
7910: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7920: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
7930: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
7940: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
7950: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
7960: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
7970: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7980: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
7990: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
79a0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
79b0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
79c0: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
79d0: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
79e0: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
79f0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
7a00: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
7a10: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
7a20: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
7a30: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
7a40: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7a50: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
7a60: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
7a70: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
7a80: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
7a90: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
7aa0: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
7ab0: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
7ac0: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
7ad0: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
7ae0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
7af0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
7b00: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
7b10: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
7b20: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
7b30: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
7b40: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
7b50: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
7b60: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
7b70: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
7b80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7b90: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
7ba0: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
7bb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
7bc0: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
7bd0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
7be0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
7bf0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
7c00: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
7c10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
7c20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
7c30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
7c40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
7c50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
7c60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
7c70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
7c80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
7c90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
7ca0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
7cb0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
7cc0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
7cd0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
7ce0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
7cf0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
7d00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
7d10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
7d20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
7d30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
7d40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
7d50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
7d60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
7d70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
7d80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
7d90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
7da0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
7db0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
7dc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
7dd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
7de0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
7df0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
7e00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
7e10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
7e20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
7e30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
7e40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
7e50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
7e60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
7e70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
7e80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
7e90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
7ea0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
7eb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
7ec0: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
7ed0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
7ee0: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
7ef0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
7f00: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
7f10: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
7f20: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
7f30: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
7f40: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
7f50: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
7f60: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
7f70: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
7f80: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
7f90: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
7fa0: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
7fb0: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
7fc0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
7fd0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7fe0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
7ff0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
8000: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
8010: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
8020: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
8030: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8040: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8050: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
8060: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
8070: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
8080: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
8090: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
80a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
80b0: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
80c0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
80d0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
80e0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
80f0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
8100: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
8110: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
8120: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
8130: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
8140: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
8150: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
8160: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
8170: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
8180: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
8190: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
81a0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
81b0: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
81c0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
81d0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
81e0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
81f0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
8200: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
8210: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
8220: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
8230: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
8240: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
8250: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
8260: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
8270: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
8280: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
8290: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
82a0: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
82b0: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
82c0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
82d0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
82e0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
82f0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
8300: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
8310: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
8320: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
8330: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
8340: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
8350: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
8360: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
8370: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
8380: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8390: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
83a0: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
83b0: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
83c0: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
83d0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
83e0: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
83f0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
8400: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
8410: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
8420: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
8430: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
8440: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
8450: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8460: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
8470: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
8480: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
8490: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
84a0: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
84b0: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
84c0: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
84d0: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
84e0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
84f0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
8500: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
8510: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
8520: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8530: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
8540: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
8550: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
8560: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
8570: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
8580: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
8590: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
85a0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
85b0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
85c0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
85d0: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
85e0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
85f0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
8600: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
8610: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
8620: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
8630: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
8640: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
8650: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
8660: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
8670: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
8680: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
8690: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
86a0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
86b0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
86c0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
86d0: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
86e0: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
86f0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
8700: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
8710: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
8720: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
8730: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
8740: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
8750: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
8760: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
8770: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
8780: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
8790: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
87a0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
87b0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
87c0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
87d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
87e0: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
87f0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
8800: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
8810: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
8820: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
8830: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
8840: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
8850: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8860: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
8870: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
8880: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
8890: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
88a0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
88b0: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
88c0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
88d0: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
88e0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
88f0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
8900: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
8910: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
8920: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
8930: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
8940: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
8950: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
8960: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
8970: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
8980: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
8990: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
89a0: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
89b0: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
89c0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
89d0: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
89e0: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
89f0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
8a00: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
8a10: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
8a20: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
8a30: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
8a40: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
8a50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
8a60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8a70: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
8a80: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
8a90: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
8aa0: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
8ab0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
8ac0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
8ad0: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
8ae0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
8af0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
8b00: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
8b10: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
8b20: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
8b30: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
8b40: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
8b50: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
8b60: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
8b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8b80: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
8b90: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8ba0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8bb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8bc0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
8bd0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
8be0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
8bf0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
8c00: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
8c10: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
8c20: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
8c30: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
8c40: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
8c50: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
8c60: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
8c70: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
8c80: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
8c90: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
8ca0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8cb0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
8cc0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
8cd0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
8ce0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
8cf0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
8d00: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
8d10: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
8d20: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
8d30: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
8d40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
8d50: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
8d60: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
8d70: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
8da0: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
8db0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8dc0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
8dd0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
8de0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
8df0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
8e00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8e10: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
8e20: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
8e30: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
8e40: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
8e50: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
8e80: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
8e90: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
8ea0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
8eb0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
8ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
8ed0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
8ee0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
8ef0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8f10: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
8f20: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
8f30: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
8f40: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
8f50: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
8f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
8f70: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
8f80: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
8f90: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
8fa0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
8fb0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8fc0: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
8fd0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
8fe0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
8ff0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
9000: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
9010: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
9020: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
9030: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
9040: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
9050: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
9060: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
9070: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9080: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
90b0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
90c0: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
90d0: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
90e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
90f0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
9100: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
9110: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
9120: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9130: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
9140: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
9150: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
9160: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9170: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
9180: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
9190: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
91a0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
91b0: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
91c0: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
91d0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
91e0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
91f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
9200: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
9210: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
9220: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
9230: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
9240: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
9250: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
9260: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
9270: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
9280: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
9290: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
92a0: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
92b0: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
92c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
92d0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
92e0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
92f0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
9300: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
9310: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
9320: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
9330: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
9340: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
9350: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
9360: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
9370: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
9380: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
9390: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
93a0: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
93b0: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
93c0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
93d0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
93e0: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
93f0: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
9400: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
9410: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
9420: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
9430: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9440: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
9450: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
9480: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9490: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
94b0: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
94c0: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
94d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
94e0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
94f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
9500: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9510: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
9520: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9540: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
9550: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
9560: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
9570: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9590: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
95a0: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
95b0: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
95c0: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95e0: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
95f0: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
9600: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
9610: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
9620: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
9630: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
9640: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
9650: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
9660: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
9670: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
9680: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9690: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
96a0: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
96b0: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
96c0: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
96d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
96e0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
96f0: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
9700: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
9710: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
9720: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
9730: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
9740: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
9750: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
9760: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
9770: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
9780: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9790: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
97a0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
97b0: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
97c0: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
97d0: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
97e0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
97f0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
9800: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
9810: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
9820: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
9830: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
9840: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
9850: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
9860: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
9870: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
9880: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
9890: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
98a0: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
98b0: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
98c0: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
98d0: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
98e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
98f0: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
9900: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
9910: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
9920: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
9930: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
9940: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
9950: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
9960: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9970: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
9980: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
9990: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
99a0: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
99b0: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
99c0: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
99d0: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
99e0: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
99f0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
9a00: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
9a10: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
9a20: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
9a30: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
9a40: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
9a50: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
9a60: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
9a70: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
9a80: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
9a90: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
9aa0: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
9ab0: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
9ac0: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
9ad0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
9ae0: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
9af0: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
9b00: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
9b10: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
9b20: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
9b30: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
9b40: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72 72  f..  assert( err
9b50: 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  code!=SQLITE_OK 
9b60: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  );.  if( zPath==
9b70: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
9b80: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
9b90: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
9ba0: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
9bb0: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
9bc0: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
9bd0: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
9be0: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
9bf0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
9c00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
9c10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9c20: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
9c30: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
9c40: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
9c50: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
9c60: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
9c70: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
9c80: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
9c90: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
9ca0: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
9cb0: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
9cc0: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
9cd0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
9ce0: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
9cf0: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
9d00: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
9d10: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
9d20: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
9d30: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
9d40: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
9d50: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
9d60: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
9d70: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
9d80: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
9d90: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
9da0: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
9db0: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
9dc0: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
9dd0: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
9de0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
9df0: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
9e00: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
9e10: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
9e20: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
9e30: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
9e40: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
9e50: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
9e60: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
9e90: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
9ea0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9eb0: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
9ec0: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
9ed0: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
9ee0: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
9ef0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
9f00: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
9f10: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
9f20: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
9f30: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
9f40: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
9f50: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
9f60: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
9f70: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
9f80: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
9f90: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
9fa0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
9fb0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72   p->pNext;.    r
9fc0: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
9fd0: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
9fe0: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
9ff0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
a000: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
a010: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
a020: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
a030: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
a040: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
a050: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
a060: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
a070: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a080: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a090: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a0a0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a0b0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a0c0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a0d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a0e0: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
a0f0: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
a100: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a110: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a120: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a130: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
a140: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
a150: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
a160: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
a170: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
a180: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
a190: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a1a0: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
a1b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
a1c0: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
a1d0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
a1e0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
a210: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
a220: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a230: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a240: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a250: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a260: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
a270: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
a280: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
a290: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a2a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a2b0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
a2c0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
a2d0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
a2e0: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
a2f0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
a300: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
a310: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
a320: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
a330: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a340: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
a350: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
a360: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a370: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
a380: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a390: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
a3a0: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
a3b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
a3c0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
a3d0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
a3e0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
a3f0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
a400: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
a410: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
a420: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
a430: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
a440: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
a450: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
a460: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
a470: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a480: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
a490: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
a4a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
a4b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
a4c0: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
a4d0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a4f0: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
a500: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
a510: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
a520: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
a530: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
a540: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
a550: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
a560: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a570: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
a590: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
a5a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
a5b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a5d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a5e0: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
a5f0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
a600: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
a610: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
a620: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a630: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
a640: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
a650: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
a660: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
a670: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
a680: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a690: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
a6a0: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
a6b0: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
a6c0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a6d0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
a6e0: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
a6f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
a700: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
a710: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
a720: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
a730: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
a740: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
a750: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
a760: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
a770: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
a780: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
a790: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
a7a0: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
a7b0: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
a7c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a7d0: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
a7e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
a7f0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
a800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a810: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
a820: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
a830: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
a840: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
a850: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
a860: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
a870: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
a880: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
a890: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
a8a0: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
a8b0: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
a8c0: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
a8d0: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
a8e0: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
a8f0: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
a900: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
a910: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
a920: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
a930: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
a940: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
a950: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
a960: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
a970: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
a980: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
a990: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
a9a0: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
a9b0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
a9c0: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
a9d0: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
a9e0: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
a9f0: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
aa00: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
aa10: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
aa20: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
aa30: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
aa40: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
aa50: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
aa60: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
aa70: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
aa80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
aa90: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
aaa0: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
aab0: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
aac0: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
aad0: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
aae0: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
aaf0: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
ab00: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
ab10: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =1 ){.      pFil
ab30: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
ab40: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
ab50: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
ab60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ab70: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
ab80: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
ab90: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  c!=0 ){.      pF
aba0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
abb0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
abc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
abd0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
abe0: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
abf0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
ac00: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
ac10: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
ac20: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
ac30: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
ac40: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
ac50: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
ac60: 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  Id.ino = statbuf
ac70: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
ac80: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
ac90: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
aca0: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
acb0: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
acc0: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
acd0: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
ace0: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
acf0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
ad00: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
ad10: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
ad20: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
ad30: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a  eof(*pInode) );.
ad40: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d      if( pInode==
ad50: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
ad60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ad70: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
ad80: 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  (pInode, 0, size
ad90: 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20  of(*pInode));.  
ada0: 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65    memcpy(&pInode
adb0: 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49  ->fileId, &fileI
adc0: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
add0: 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ));.    pInode->
ade0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  nRef = 1;.    pI
adf0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  node->pNext = in
ae00: 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e  odeList;.    pIn
ae10: 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ode->pPrev = 0;.
ae20: 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73      if( inodeLis
ae30: 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70  t ) inodeList->p
ae40: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  Prev = pInode;. 
ae50: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
ae60: 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Inode;.  }else{.
ae70: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
ae80: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f  ++;.  }.  *ppIno
ae90: 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72  de = pInode;.  r
aea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
aeb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
aec0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
aed0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
aee0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
aef0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
af00: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
af10: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
af20: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
af30: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
af40: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
af50: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
af60: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
af70: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
af80: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
af90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
afa0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
afb0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
afc0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
afd0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
afe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
aff0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
b000: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
b010: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
b020: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
b030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
b040: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
b050: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b060: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b070: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
b080: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
b090: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b0a0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b0c0: 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
b0d0: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
b0e0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
b0f0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
b100: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
b110: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
b120: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
b130: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
b140: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
b150: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
b160: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
b170: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
b180: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  rved = 1;.  }.. 
b190: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
b1a0: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
b1b0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
b1c0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f  ..  */.#ifndef _
b1d0: 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21  _DJGPP__.  if( !
b1e0: 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69  reserved && !pFi
b1f0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
b200: 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  cessLock ){.    
b210: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
b220: 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  k;.    lock.l_wh
b230: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b240: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
b250: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
b260: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
b270: 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e  n = 1;.    lock.
b280: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
b290: 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74  ;.    if( osFcnt
b2a0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
b2b0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  TLK, &lock) ){. 
b2c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b2d0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b2e0: 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RVEDLOCK;.      
b2f0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
b300: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20   = errno;.    } 
b310: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
b320: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
b330: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
b340: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
b350: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
b360: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
b370: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
b380: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
b390: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
b3a0: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
b3b0: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
b3c0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
b3d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b3e0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
b3f0: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
b400: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
b410: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
b420: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
b430: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
b440: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
b450: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
b460: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
b470: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
b480: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
b490: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
b4a0: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
b4b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
b4c0: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
b4d0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
b4e0: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
b4f0: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
b500: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
b510: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
b520: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
b530: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
b540: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
b550: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
b560: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
b570: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
b580: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
b590: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b5a0: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
b5b0: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
b5c0: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
b5d0: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
b5e0: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
b5f0: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
b600: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
b610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
b620: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
b630: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
b640: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
b650: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
b660: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
b670: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
b680: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
b690: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
b6a0: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
b6b0: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
b6c0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
b6d0: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
b6e0: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
b6f0: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
b700: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
b710: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
b720: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
b730: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
b740: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
b750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
b760: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
b770: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
b780: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  t flock *pLock){
b790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
b7a0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
b7b0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
b7c0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
b7d0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
b7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
b7f0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  e!=0 );.  if( ((
b800: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b810: 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c   & UNIXFILE_EXCL
b820: 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  )!=0 || pInode->
b830: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20  bProcessLock).  
b840: 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72   && ((pFile->ctr
b850: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
b860: 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20  E_RDONLY)==0).  
b870: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  ){.    if( pInod
b880: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
b890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
b8a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
b8b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
b8c0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b  ode->nLock==0 );
b8d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
b8e0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b8f0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
b900: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
b910: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
b920: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
b930: 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ZE;.      lock.l
b940: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
b950: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
b960: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b970: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
b980: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
b990: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
b9a0: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
b9b0: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
b9c0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
b9d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b9e0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
b9f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
ba00: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
ba10: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
ba20: 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ock);.  }.  retu
ba30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ba40: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
ba50: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
ba60: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
ba70: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
ba80: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
ba90: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
baa0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
bab0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
bac0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
bad0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
bae0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
baf0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
bb00: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
bb10: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
bb20: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
bb30: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
bb40: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
bb50: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
bb60: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
bb70: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
bb80: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
bb90: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
bba0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
bbb0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
bbc0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
bbd0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
bbe0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
bbf0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
bc00: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
bc10: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
bc20: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
bc30: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
bc40: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
bc50: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
bc60: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
bc70: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
bc80: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
bc90: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
bca0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
bcb0: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
bcc0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
bcd0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
bce0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
bcf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bd00: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
bd10: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
bd20: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
bd30: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
bd40: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
bd50: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
bd60: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
bd70: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
bd80: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
bd90: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
bda0: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
bdb0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
bdc0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
bdd0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
bde0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
bdf0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
be00: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
be10: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
be20: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
be30: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
be40: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
be50: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
be60: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
be70: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
be80: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
be90: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
bea0: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
beb0: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
bec0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
bed0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
bee0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
bef0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
bf00: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
bf10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
bf20: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
bf30: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
bf40: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
bf50: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
bf60: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
bf70: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
bf80: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
bf90: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
bfa0: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
bfb0: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
bfc0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
bfd0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
bfe0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
bff0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
c000: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
c010: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
c020: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
c030: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
c040: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
c050: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
c060: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
c070: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
c080: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
c090: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
c0a0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c0b0: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
c0c0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
c0d0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
c0e0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
c0f0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
c100: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c110: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
c120: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
c130: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
c140: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
c150: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
c160: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
c170: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
c180: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
c190: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
c1a0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
c1b0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
c1c0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
c1d0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
c1e0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
c1f0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
c200: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
c210: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
c220: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
c230: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
c240: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c250: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
c260: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
c270: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
c280: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
c290: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
c2a0: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
c2b0: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
c2c0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
c2d0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
c2e0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
c2f0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
c300: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
c310: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
c320: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
c330: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
c340: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
c350: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
c360: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
c370: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
c380: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
c390: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
c3a0: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
c3b0: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
c3c0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
c3d0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
c3e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
c3f0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
c400: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
c410: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
c420: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
c430: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
c440: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
c450: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
c460: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
c470: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
c480: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
c490: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
c4a0: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
c4b0: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
c4c0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
c4d0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
c4e0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
c4f0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
c500: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
c510: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
c520: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
c530: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
c540: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
c550: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
c560: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
c570: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
c580: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
c590: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
c5a0: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
c5b0: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
c5c0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
c5d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c5e0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
c5f0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c600: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
c610: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
c620: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
c630: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
c640: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
c650: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c660: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
c670: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
c680: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
c690: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
c6a0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
c6b0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
c6c0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
c6d0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
c6e0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
c6f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
c700: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
c710: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c720: 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
c730: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c740: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
c750: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
c760: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
c770: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
c780: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
c790: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
c7a0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
c7b0: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
c7c0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
c7d0: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
c7e0: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
c7f0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
c800: 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
c810: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
c820: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
c830: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75  already held) (u
c840: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
c850: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  h,.            a
c860: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
c870: 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
c880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c890: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
c8a0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
c8b0: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
c8c0: 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  t..  **  (1) We 
c8d0: 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
c8e0: 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
c8f0: 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
c900: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
c910: 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
c920: 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
c930: 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
c940: 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
c950: 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
c960: 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
c970: 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
c980: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
c990: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c9a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c9b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
c9c0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c9d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
c9e0: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
c9f0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
ca00: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
ca10: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
ca20: 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
ca30: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ca40: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
ca50: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
ca60: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
ca70: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
ca80: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
ca90: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
caa0: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
cab0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
cac0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
cad0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
cae0: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
caf0: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
cb00: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
cb10: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
cb20: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
cb30: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
cb40: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
cb50: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
cb60: 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
cb70: 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
cb80: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
cb90: 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
cba0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
cbb0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
cbc0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
cbd0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
cbe0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
cbf0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
cc00: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
cc10: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
cc20: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
cc30: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
cc40: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
cc50: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
cc60: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
cc70: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
cc80: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
cc90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
cca0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
ccb0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
ccc0: 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d   .      (pInode-
ccd0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
cce0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
ccf0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
cd00: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
cd10: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
cd20: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
cd30: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
cd40: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
cd50: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
cd60: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
cd70: 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
cd80: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
cd90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
cda0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
cdb0: 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
cdc0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
cdd0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
cde0: 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ...  /* A PENDIN
cdf0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
ce00: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
ce10: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
ce20: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
ce30: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
ce40: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
ce50: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
ce60: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
ce70: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
ce80: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  ased..  */.  loc
ce90: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
cea0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ceb0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
cec0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ced0: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
cee0: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
cef0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
cf00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
cf10: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
cf20: 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
cf30: 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  pe = (eFileLock=
cf40: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
cf50: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
cf60: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
cf70: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
cf80: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
cf90: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
cfa0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
cfb0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
cfc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
cfd0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
cfe0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
cff0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
d000: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d010: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
d020: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d030: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d040: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
d050: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
d060: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
d070: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
d080: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
d090: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
d0a0: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
d0b0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
d0c0: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
d0d0: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
d0e0: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
d0f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d100: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d110: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
d120: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d130: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d140: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
d150: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
d160: 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
d170: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
d180: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
d190: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d1a0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
d1b0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
d1c0: 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
d1d0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d1e0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
d1f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d200: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d210: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d220: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d230: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
d240: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d250: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
d260: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
d270: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d280: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
d290: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
d2a0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
d2b0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d2c0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  LCK;.    if( uni
d2d0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
d2e0: 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53   &lock) && rc==S
d2f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d300: 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20    /* This could 
d310: 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65  happen with a ne
d320: 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20  twork mount */. 
d330: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d340: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d350: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d360: 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK; .    }..   
d370: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d380: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d390: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
d3a0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d3b0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d3c0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
d3d0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
d3e0: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
d3f0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
d400: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
d410: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
d420: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
d430: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
d440: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
d450: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
d460: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
d470: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
d480: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
d490: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
d4a0: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
d4b0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
d4c0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
d4d0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
d4e0: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
d4f0: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
d500: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
d510: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
d520: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
d530: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
d540: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
d550: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
d560: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
d570: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
d580: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
d590: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
d5a0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
d5b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d5c0: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
d5d0: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
d5e0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
d5f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
d600: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
d610: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
d620: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d630: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
d640: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d650: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
d660: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d670: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
d680: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
d690: 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
d6a0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
d6b0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d6c0: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
d6d0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d6e0: 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
d6f0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d700: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
d710: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
d720: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d730: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d740: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d750: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d760: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
d770: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
d780: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
d790: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d7a0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d7b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23  .    }.  }.  ..#
d7c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d7d0: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
d7e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
d7f0: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
d800: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
d810: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
d820: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
d830: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
d840: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
d850: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
d860: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
d870: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
d880: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
d890: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
d8a0: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
d8b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
d8c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
d8d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
d8e0: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
d8f0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
d900: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
d910: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
d920: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
d930: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
d940: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
d950: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
d960: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
d970: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
d980: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
d990: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d9a0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d9b0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
d9c0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
d9d0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d9e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
d9f0: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
da00: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
da10: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
da20: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
da30: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
da40: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
da50: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
da60: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
da70: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
da80: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
da90: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
daa0: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
dab0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
dac0: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
dad0: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
dae0: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
daf0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
db00: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
db10: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
db20: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
db30: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
db40: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
db50: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
db60: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
db70: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
db80: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
db90: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
dba0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
dbb0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
dbc0: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
dbd0: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
dbe0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
dbf0: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
dc00: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
dc10: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
dc20: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
dc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
dc40: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
dc50: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
dc60: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
dc70: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
dc80: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
dc90: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
dca0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
dcb0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
dcc0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
dcd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
dce0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
dcf0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
dd00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
dd10: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
dd20: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
dd30: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
dd40: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
dd50: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
dd60: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
dd70: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
dd80: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
dd90: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
dda0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
ddb0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
ddc0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
ddd0: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
dde0: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
ddf0: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
de00: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
de10: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
de20: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
de30: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
de40: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
de50: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
de60: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
de70: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
de80: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
de90: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
dea0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
deb0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
dec0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ded0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
dee0: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
def0: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
df00: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
df10: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
df20: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
df30: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
df40: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
df50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
df60: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
df70: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
df80: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
df90: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
dfa0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
dfb0: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
dfc0: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
dfd0: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
dfe0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
dff0: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
e000: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
e010: 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
e020: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
e030: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
e040: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
e050: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
e060: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e080: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
e090: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
e0a0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
e0b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e0c0: 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
e0d0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e0e0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
e0f0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
e100: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
e110: 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
e120: 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66  eLock );..#ifdef
e130: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
e140: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
e150: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
e160: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
e170: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
e180: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e190: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
e1a0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
e1b0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
e1c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
e1d0: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
e1e0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
e1f0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
e200: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
e210: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
e220: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
e230: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
e240: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
e250: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
e260: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
e270: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
e280: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
e290: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
e2a0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
e2b0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
e2c0: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
e2d0: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
e2e0: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
e2f0: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
e300: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
e310: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
e320: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
e330: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
e340: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
e350: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
e360: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
e370: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
e380: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
e390: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
e3a0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
e3b0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
e3c0: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
e3d0: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
e3e0: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
e3f0: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
e400: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
e410: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
e420: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
e430: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
e440: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
e450: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
e460: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
e470: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
e480: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
e490: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
e4a0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
e4b0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
e4c0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
e4d0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20  ED_LOCK ){..#if 
e4e0: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
e4f0: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
e500: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
e510: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
e520: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
e530: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
e540: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
e550: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
e560: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
e570: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
e580: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e590: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
e5a0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
e5b0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
e5c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
e5d0: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
e5e0: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
e5f0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
e600: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
e610: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
e620: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
e630: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e640: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
e650: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e660: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e670: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e680: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e690: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e6a0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
e6b0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
e6c0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e6d0: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
e6e0: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
e6f0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e700: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e710: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
e720: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
e730: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
e740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
e750: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e760: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
e770: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
e780: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
e790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e7a0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e7b0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
e7c0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
e7d0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
e7e0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e7f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
e800: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
e810: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
e820: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
e830: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e840: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
e850: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
e860: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
e870: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e880: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e890: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e8a0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
e8b0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
e8c0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
e8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
e8e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e8f0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
e900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
e910: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
e920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e930: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e940: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
e950: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
e960: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
e970: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e980: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
e990: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
e9a0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
e9b0: 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
e9c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
e9d0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e9e0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
ea00: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ea10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ea20: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
ea30: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
ea40: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
ea50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
ea60: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
ea70: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
ea80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
ea90: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
eaa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eab0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
eac0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
ead0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
eae0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
eaf0: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
eb00: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
eb10: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
eb20: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
eb30: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
eb40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
eb50: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
eb60: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
eb70: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
eb80: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
eb90: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
eba0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
ebb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
ebc0: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
ebd0: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
ebe0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
ebf0: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
ec00: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
ec10: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
ec20: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
ec30: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
ec40: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
ec50: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
ec60: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
ec70: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
ec80: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
ec90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
eca0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
ecb0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
ecc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ecd0: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
ece0: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
ecf0: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
ed00: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
ed10: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
ed20: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
ed30: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
ed40: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
ed50: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
ed60: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
ed70: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
ed80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ed90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
eda0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
edb0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
edc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
edd0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ede0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
edf0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ee00: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
ee10: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
ee20: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
ee30: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
ee40: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
ee50: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
ee60: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
ee70: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ee80: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
ee90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
eea0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
eeb0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
eec0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
eed0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
eee0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
eef0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
ef00: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
ef10: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
ef20: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
ef30: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
ef40: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
ef50: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
ef60: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
ef70: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
ef80: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
ef90: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
efa0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
efb0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
efc0: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
efd0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
efe0: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
eff0: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
f000: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
f010: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
f020: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f030: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
f040: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f050: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
f060: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
f070: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
f080: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f090: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
f0b0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f0c0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
f0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f0f0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f100: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f110: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f120: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
f130: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
f140: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
f150: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
f160: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
f170: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
f180: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
f190: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
f1a0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
f1b0: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
f1c0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
f1d0: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
f1e0: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
f1f0: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
f200: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
f210: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
f220: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
f230: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
f240: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
f250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f260: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
f270: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
f280: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
f290: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
f2a0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
f2b0: 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
f2c0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
f2d0: 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
f2e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
f2f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
f300: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
f310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f320: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
f330: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
f340: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
f350: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
f360: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
f370: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
f380: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
f390: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
f3a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
f3b0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
f3c0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
f3d0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
f3e0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
f3f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
f400: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
f410: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
f420: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
f430: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f440: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
f450: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
f460: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
f470: 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20  K || ((unixFile 
f480: 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74  *)id)->nFetchOut
f490: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f4a0: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
f4b0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
f4c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
f4d0: 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
f4e0: 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
f4f0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
f500: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
f510: 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f  ixFile *pFd);../
f520: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
f530: 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
f540: 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
f550: 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
f560: 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
f570: 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
f580: 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
f590: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
f5a0: 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
f5b0: 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
f5c0: 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
f5d0: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
f5e0: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
f5f0: 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
f600: 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
f610: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
f620: 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
f630: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f640: 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
f650: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
f660: 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
f670: 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
f680: 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
f690: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
f6a0: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
f6b0: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
f6c0: 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
f6d0: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
f6e0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f6f0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
f700: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
f710: 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
f720: 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
f730: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
f740: 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
f750: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
f760: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
f770: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
f780: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
f790: 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
f7a0: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
f7b0: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
f7c0: 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
f7d0: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
f7e0: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
f7f0: 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
f800: 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
f810: 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
f820: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
f830: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
f840: 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  (("CLOSE   %-3d\
f850: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
f860: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
f870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
f880: 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  e(pFile->pUnused
f890: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
f8a0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
f8b0: 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  xFile));.  retur
f8c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f8d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
f8e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
f8f0: 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
f900: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
f910: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f920: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
f930: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f940: 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55  le *)id;.  unixU
f950: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
f960: 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  K);.  unixEnterM
f970: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e  utex();..  /* un
f980: 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73  ixFile.pInode is
f990: 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65   always valid he
f9a0: 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  re. Otherwise, a
f9b0: 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65   different close
f9c0: 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65  .  ** routine (e
f9d0: 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  .g. nolockClose(
f9e0: 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c  )) would be call
f9f0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f  ed instead..  */
fa00: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
fa10: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ->pInode->nLock>
fa20: 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  0 || pFile->pIno
fa30: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
fa40: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ==0 );.  if( ALW
fa50: 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  AYS(pFile->pInod
fa60: 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  e) && pFile->pIn
fa70: 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
fa80: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
fa90: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
faa0: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
fab0: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
fac0: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
fad0: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
fae0: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
faf0: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
fb00: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
fb10: 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
fb20: 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55  or to pInode->pU
fb30: 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20  nused list.  It 
fb40: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
fb50: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20  cally closed .  
fb60: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61    ** when the la
fb70: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
fb80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
fb90: 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
fba0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
fbb0: 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
fbc0: 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
fbd0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
fbe0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
fbf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fc00: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
fc10: 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   End of the posi
fc20: 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20  x advisory lock 
fc30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
fc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc50: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
fca0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcf0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
fd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd10: 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
fd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
fd50: 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
fd60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
fd70: 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
fd80: 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
fd90: 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
fda0: 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
fdb0: 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
fdc0: 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
fdd0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
fde0: 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
fdf0: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
fe00: 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
fe10: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
fe20: 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
fe30: 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
fe40: 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
fe50: 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
fe60: 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
fe70: 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
fe80: 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
fe90: 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
fea0: 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
feb0: 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
fec0: 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
fed0: 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
fee0: 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
fef0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
ff00: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
ff10: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ff20: 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
ff30: 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
ff40: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
ff50: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
ff60: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
ff70: 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
ff80: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
ff90: 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
ffa0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
ffb0: 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
ffc0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
ffd0: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
ffe0: 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
fff0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
10000 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
10010 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
10020 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68  tic int nolockCh
10030 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
10040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
10050 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73  tUsed, int *pRes
10060 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
10070 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
10080 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
10090 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
100a0 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
100b0 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73  int nolockLock(s
100c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
100d0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
100e0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
100f0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10100 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10120 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
10130 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
10140 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
10150 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
10160 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10170 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
10180 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
10190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
101a0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
101b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
101c0 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  int nolockClose(
101d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
101e0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f  ) {.  return clo
101f0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10200 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
10210 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
10220 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d  he no-op lock im
10230 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10250 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
10310 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63  gin dot-file Loc
10320 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10340 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  ***.**.** The do
10350 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  tfile locking im
10360 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
10370 73 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  s the existence 
10380 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b  of separate lock
10390 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c  .** files (reall
103a0 79 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74  y a directory) t
103b0 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
103c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
103d0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a  .  This works.**
103e0 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65   on just about e
103f0 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20  very filesystem 
10400 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74  imaginable.  But
10410 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f   there are serio
10420 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a  us downsides:.**
10430 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72  .**    (1)  Ther
10440 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72  e is zero concur
10450 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65  rency.  A single
10460 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61   reader blocks a
10470 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  ll other.**     
10480 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
10490 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20  from reading or 
104a0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
104b0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  base..**.**    (
104c0 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69  2)  An applicati
104d0 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65  on crash or powe
104e0 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65  r loss can leave
104f0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65   stale lock file
10500 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74  s.**         sit
10510 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74  ting around that
10520 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
10530 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a  red manually..**
10540 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73  .** Nevertheless
10550 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61  , a dotlock is a
10560 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  n appropriate lo
10570 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75  cking mode for u
10580 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65  se if no.** othe
10590 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  r locking strate
105a0 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  gy is available.
105b0 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c  .**.** Dotfile l
105c0 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20  ocking works by 
105d0 63 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69  creating a subdi
105e0 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73  rectory in the s
105f0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
10600 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
10610 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
10620 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
10630 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
10640 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
10650 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
10660 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  a lock directory
10670 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
10680 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
10690 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74   other.** lock t
106a0 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
106b0 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
106c0 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
106d0 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
106e0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
106f0 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
10700 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
10710 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
10720 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
10730 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a  lock directory..
10740 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f  */.#define DOTLO
10750 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b  CK_SUFFIX ".lock
10760 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
10770 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
10780 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
10790 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
107a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
107b0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
107c0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
107d0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
107e0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
107f0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
10800 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
10810 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
10820 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
10830 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
10840 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
10850 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
10860 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
10870 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
10880 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ock checking..**
10890 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c  .** In dotfile l
108a0 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61  ocking, either a
108b0 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20   lock exists or 
108c0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f  it does not.  So
108d0 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   in this.** vari
108e0 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65  ation of CheckRe
108f0 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70  servedLock(), *p
10900 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
10910 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63   true if any loc
10920 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20  k.** is held on 
10930 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c  the file and fal
10940 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  se if the file i
10950 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73  s unlocked..*/.s
10960 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
10970 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10980 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10990 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
109a0 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
109b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
109c0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
109d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
109e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
109f0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
10a00 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
10a10 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
10a20 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
10a30 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
10a40 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
10a50 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
10a60 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
10a70 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
10a80 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10a90 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
10aa0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10ab0 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e  Either this conn
10ac0 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f  ection or some o
10ad0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
10ae0 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
10af0 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73  ess.    ** holds
10b00 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
10b10 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ile.  No need to
10b20 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20   check further. 
10b30 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  */.    reserved 
10b40 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
10b50 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73    /* The lock is
10b60 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c   held if and onl
10b70 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c  y if the lockfil
10b80 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
10b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63  const char *zLoc
10ba0 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  kFile = (const c
10bb0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
10bc0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
10bd0 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
10be0 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  ess(zLockFile, 0
10bf0 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  )==0;.  }.  OSTR
10c00 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
10c10 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74  CK %d %d %d (dot
10c20 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
10c30 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
10c40 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  ));.  *pResOut =
10c50 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
10c60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10c70 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
10c80 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
10c90 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
10ca0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
10cb0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
10cc0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
10cd0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
10ce0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
10cf0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
10d00 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
10d10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
10d20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
10d30 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
10d40 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
10d50 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
10d60 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
10d70 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
10d80 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
10d90 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
10da0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
10db0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
10dc0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
10dd0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
10de0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
10df0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
10e00 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
10e10 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
10e20 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
10e30 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
10e40 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
10e50 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
10e60 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
10e70 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
10e80 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
10e90 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
10ea0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
10eb0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10ec0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
10ed0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
10ee0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
10ef0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10f00 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
10f10 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10f20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10f30 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
10f40 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
10f50 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10f60 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10f70 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10f80 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a  king level..**.*
10f90 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c  * With dotfile l
10fa0 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c  ocking, we reall
10fb0 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73  y only support s
10fc0 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53  tate (4): EXCLUS
10fd0 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74  IVE..** But we t
10fe0 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c  rack the other l
10ff0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e  ocking levels in
11000 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61  ternally..*/.sta
11010 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c  tic int dotlockL
11020 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11030 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11040 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
11050 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
11060 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
11070 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
11080 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
11090 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
110a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
110b0 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
110c0 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
110d0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
110e0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
110f0 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
11100 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
11110 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
11120 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
11130 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
11140 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
11150 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
11160 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11170 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11180 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77  Lock;.    /* Alw
11190 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
111a0 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
111b0 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64  old file */.#ifd
111c0 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20  ef HAVE_UTIME.  
111d0 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c    utime(zLockFil
111e0 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a  e, NULL);.#else.
111f0 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
11200 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
11210 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
11220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11230 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
11240 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
11250 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a    rc = osMkdir(z
11260 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b  LockFile, 0777);
11270 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
11280 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
11290 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
112a0 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a  lock directory *
112b0 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  /.    int tErrno
112c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
112d0 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72  ( EEXIST == tErr
112e0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
112f0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11300 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11310 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11320 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11330 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11340 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
11350 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11360 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11370 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11380 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
11390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
113a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
113b0 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
113c0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
113d0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
113e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
113f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
11400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11410 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
11420 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
11430 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
11440 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
11450 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
11460 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
11470 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
11480 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
11490 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
114a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
114b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
114c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
114d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
114e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
114f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11500 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
11510 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
11520 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
11530 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
11540 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
11550 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11560 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
11570 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11580 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
11590 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
115a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
115b0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
115c0 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
115d0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
115e0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
115f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11600 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
11610 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
11620 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
11630 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11640 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
11650 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
11660 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
11670 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
11680 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
11690 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
116a0 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
116b0 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
116c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
116d0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
116e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
11700 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
11710 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
11720 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
11730 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
11740 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
11750 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
11760 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
11770 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
11780 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
11790 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
117a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
117b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
117c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
117d0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
117e0 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
117f0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
11800 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
11810 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
11820 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
11830 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
11840 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
11850 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 65  .  if( rc<0 && e
11860 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20  rrno==ENOTDIR ) 
11870 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c  rc = osUnlink(zL
11880 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ockFile);.  if( 
11890 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc<0 ){.    int 
118a0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
118b0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
118c0 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
118d0 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
118e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
118f0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  UNLOCK;.    }.  
11900 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11910 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11920 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11930 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
11940 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
11950 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
11960 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
11970 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
11980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11990 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20   Close a file.  
119a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
119b0 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65  ck has been rele
119c0 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73  ased before clos
119d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
119e0 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
119f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11a00 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11a10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11a20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
11a30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11a40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
11a50 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
11a60 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
11a70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
11a80 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
11a90 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
11aa0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11ac0 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
11ad0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
11ae0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20  e dot-file lock 
11af0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b60 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
11bd0 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69  egin flock Locki
11be0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ***.**.** Use th
11c10 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d  e flock() system
11c20 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65   call to do file
11c30 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   locking..**.** 
11c40 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
11c50 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65  is like dot-file
11c60 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74   locking in that
11c70 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
11c80 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69  fine-grain locki
11c90 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72  ng levels suppor
11ca0 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72  ted by SQLite ar
11cb0 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f  e collapsed into
11cc0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63  .** a single exc
11cd0 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e  lusive lock.  In
11ce0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48   other words, SH
11cf0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
11d00 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c  and.** PENDING l
11d10 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d  ocks are the sam
11d20 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58  e thing as an EX
11d30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53  CLUSIVE lock.  S
11d40 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77  QLite.** still w
11d50 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f  orks when you do
11d60 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75   this, but concu
11d70 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65  rrency is reduce
11d80 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20  d since.** only 
11d90 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
11da0 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
11db0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
11dc0 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d  a time..**.** Om
11dd0 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  it this section 
11de0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
11df0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69  _LOCKING_STYLE i
11e00 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  s turned off or 
11e10 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20  if.** compiling 
11e20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a  for VXWORKS..*/.
11e30 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
11e40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
11e50 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  && !OS_VXWORKS..
11e60 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
11e70 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
11e80 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
11e90 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
11ea0 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
11eb0 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
11ec0 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
11ed0 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
11ee0 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
11ef0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
11f00 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
11f10 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
11f20 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
11f30 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
11f40 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
11f50 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
11f60 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11f70 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11f80 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11f90 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11fa0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11fb0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11fc0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11fd0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
11fe0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
11ff0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
12000 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
12010 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
12020 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
12030 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
12040 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
12050 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
12060 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
12070 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
12080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12090 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
120a0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
120b0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
120c0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
120d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
120e0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
120f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12100 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12110 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
12120 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
12130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
12140 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
12150 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
12160 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
12170 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12180 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12190 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
121a0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
121b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
121c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
121d0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
121e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
121f0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12200 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12210 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
12220 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
12230 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
12240 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
12250 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
12260 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12270 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
12280 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
12290 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
122a0 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
122b0 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
122c0 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
122d0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
122e0 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
122f0 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
12300 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12310 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12320 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
12330 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
12340 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
12350 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
12360 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
12370 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12380 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
12390 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
123a0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
123b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72           rc = lr
123c0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
123d0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
123e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
123f0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12400 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12410 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12420 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
12430 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
12440 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
12450 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12460 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12470 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
12480 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
12490 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
124a0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
124b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
124c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
124d0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
124e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
124f0 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
12500 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f  CK %d %d %d (flo
12510 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12520 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
12530 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
12540 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
12550 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
12560 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
12570 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
12580 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
12590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
125a0 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
125b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
125c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
125d0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
125e0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
125f0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12600 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12610 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12620 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12630 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12640 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
12650 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12660 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12670 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12680 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12690 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
126a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
126b0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
126c0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
126d0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
126e0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
126f0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12700 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12710 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12720 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12730 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12740 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
12750 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
12760 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
12770 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
12780 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
12790 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
127a0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
127b0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
127c0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
127d0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
127e0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
127f0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12800 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12810 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12820 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12830 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12840 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
12850 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
12860 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12870 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
12880 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12890 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
128a0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
128b0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
128c0 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
128d0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
128e0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
128f0 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
12900 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
12910 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
12920 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
12930 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
12940 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
12950 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
12960 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
12970 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
12980 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
12990 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
129a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
129b0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
129c0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
129d0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
129e0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
129f0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
12a00 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
12a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12a20 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12a30 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12a40 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
12a50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12a60 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
12a70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12a80 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
12a90 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
12aa0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
12ab0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
12ac0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
12ad0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
12ae0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
12af0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
12b00 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
12b10 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
12b20 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
12b30 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
12b40 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
12b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12b60 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
12b70 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
12b80 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
12b90 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12ba0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
12bb0 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
12bc0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12bd0 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
12be0 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
12bf0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12c00 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12c10 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12c20 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
12c30 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12c40 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12c50 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12c60 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12c70 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
12c80 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
12c90 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
12ca0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
12cb0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12cc0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12cd0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c   }.  OSTRACE(("L
12ce0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
12cf0 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
12d00 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
12d10 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
12d20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
12d30 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
12d40 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64  "failed"));.#ifd
12d50 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12d60 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12d70 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
12d80 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
12d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12db0 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BUSY;.  }.#endif
12dc0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
12dd0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12de0 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ORS */.  return 
12df0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
12e00 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12e10 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12e20 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12e30 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12e40 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12e50 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12e60 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12e80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12e90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12ea0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12eb0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12ec0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12ed0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12ee0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12ef0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12f00 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
12f10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12f20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12f30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12f40 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12f50 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
12f60 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
12f70 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
12f80 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
12f90 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
12fa0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
12fb0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
12fc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
12fd0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
12fe0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
12ff0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
13000 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
13010 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
13020 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
13030 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
13040 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13050 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
13060 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
13070 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
13080 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
13090 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
130a0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
130b0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
130c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
130d0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
130e0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
130f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13100 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
13110 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
13120 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
13130 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
13140 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
13150 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13160 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
13170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13180 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
13190 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
131a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
131b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
131d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
131e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
131f0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
13200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13210 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
13220 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
13230 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
13240 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13250 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
13260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13270 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
13280 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
13290 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20  LOCK);.    rc = 
132a0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
132b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
132c0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
132d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
132e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
132f0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
13320 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
13330 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
133a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
133b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
133f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13400 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
13410 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
13420 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13440 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
13450 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
13460 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
13470 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
13480 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
13490 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
134a0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
134b0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
134c0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
134d0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
134e0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
134f0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
13500 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
13510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13520 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
13530 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
13540 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
13550 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
13560 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
13570 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
13580 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
13590 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
135a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
135b0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
135c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
135d0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
135e0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
135f0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
13600 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
13610 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
13620 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
13630 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
13640 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
13650 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
13660 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
13670 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
13680 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
13690 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
136a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
136b0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
136c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
136d0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
136e0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
136f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
13700 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
13710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13720 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13730 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13740 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13750 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
13760 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
13770 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13780 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
13790 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
137a0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
137b0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
137c0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
137d0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
137e0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
137f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
13800 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13810 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13820 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
13830 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
13840 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
13850 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
13860 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
13870 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
13880 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
13890 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
138a0 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
138b0 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
138c0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
138d0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
138e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
138f0 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
13900 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
13910 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13920 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13930 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13940 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
13950 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
13960 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13970 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
13980 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13990 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
139a0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
139b0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
139c0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
139d0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
139e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
139f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13a00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
13a10 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
13a20 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
13a30 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
13a40 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
13a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
13a60 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
13a70 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
13a80 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
13a90 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
13aa0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
13ab0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
13ac0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13ad0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
13ae0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
13af0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
13b00 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
13b10 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
13b20 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
13b30 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
13b40 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
13b50 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
13b60 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
13b70 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
13b80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
13b90 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
13ba0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
13bb0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
13bc0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
13bd0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
13be0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
13bf0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
13c00 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
13c10 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
13c20 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
13c30 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
13c40 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
13c50 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
13c60 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
13c70 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
13c80 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
13c90 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
13ca0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
13cb0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
13cc0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
13cd0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
13ce0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
13cf0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
13d00 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
13d10 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13d20 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13d30 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
13d40 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
13d50 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13d60 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
13d70 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
13d80 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
13d90 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
13da0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
13db0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
13dc0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
13dd0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
13de0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
13df0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
13e00 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
13e10 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
13e20 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
13e30 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
13e40 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
13e50 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
13e60 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
13e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13e80 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
13e90 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
13ea0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
13eb0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
13ec0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
13ed0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
13ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13ef0 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
13f00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
13f10 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
13f20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13f30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
13f40 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
13f50 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
13f60 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
13f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f80 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
13f90 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
13fa0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
13fb0 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
13fc0 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
13fd0 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
13fe0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
13ff0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
14000 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
14010 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14020 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
14030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14040 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
14050 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
14060 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
14070 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
14080 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
14090 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
140a0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
140b0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
140c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
140d0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
140e0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
140f0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14100 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14110 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
14120 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14130 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
14140 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
14150 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14160 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
14170 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
14180 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
14190 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
141a0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
141b0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
141c0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
141d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
141e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
141f0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
14200 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
14210 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
14220 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
14230 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
14240 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14250 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
14260 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
14270 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14280 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
14290 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
142a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
142b0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
142c0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
142d0 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
142e0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
142f0 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
14300 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
14310 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
14320 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
14330 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
14340 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
14350 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
14360 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
14370 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
14380 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
14390 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
143a0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
143b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
143c0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
143d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
143e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
143f0 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
14400 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
14410 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
14420 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
14430 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
14440 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
14450 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
14460 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14470 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
14480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14490 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
144a0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
144b0 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
144c0 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
144d0 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
144e0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
144f0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14500 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14510 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
14520 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
14530 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14540 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
14550 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
14560 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
14570 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
14580 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14590 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
145a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
145b0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
145c0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
145d0 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
145e0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
145f0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
14600 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
14610 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14620 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
14630 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14650 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
14660 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14670 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
14680 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
14690 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
146a0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
146b0 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
146c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
146d0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
146e0 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
146f0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
14700 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14710 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
14720 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14740 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
14750 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
14760 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14770 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
147d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14830 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
14840 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
14870 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
14880 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
14890 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
148a0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
148b0 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
148c0 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
148d0 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
148e0 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
148f0 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
14900 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
14910 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
14920 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
14930 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
14940 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
14950 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
14960 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
14970 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14980 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
14990 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
149a0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
149b0 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
149c0 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
149d0 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
149e0 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
149f0 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
14a00 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
14a10 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14a20 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
14a30 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
14a40 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
14a50 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14a60 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
14a70 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
14a80 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
14a90 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14aa0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
14ab0 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
14ac0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
14ad0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14ae0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
14af0 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
14b00 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14b10 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
14b20 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
14b30 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
14b40 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
14b50 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
14b60 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
14b70 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
14b80 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
14b90 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
14ba0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14bb0 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14bc0 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14bd0 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14be0 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14bf0 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14c20 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14c30 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
14c40 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
14c50 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
14c60 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
14c70 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
14c80 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14c90 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
14ca0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
14cb0 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
14cc0 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
14cd0 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
14ce0 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
14cf0 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
14d00 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14d10 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
14d20 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
14d30 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
14d40 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
14d50 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
14d60 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14d70 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
14d80 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
14d90 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
14da0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
14db0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
14dc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
14dd0 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14de0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14df0 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14e00 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14e10 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14e20 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14e30 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14e40 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
14e50 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
14e60 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
14e70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14e80 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
14e90 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
14ea0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
14eb0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14ec0 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
14ed0 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14ee0 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14ef0 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14f00 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14f10 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14f20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14f30 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14f40 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
14f50 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
14f60 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
14f70 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
14f80 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
14f90 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
14fa0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
14fb0 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
14fc0 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
14fd0 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14fe0 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14ff0 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
15000 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
15010 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
15020 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
15030 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15040 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
15050 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15060 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
15070 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
15080 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
15090 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
150a0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
150b0 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
150c0 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
150d0 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
150e0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
150f0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15100 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
15110 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15120 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15140 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
15150 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
15160 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
15170 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15180 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
15190 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
151a0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
151b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
151c0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
151d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
151e0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
151f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15200 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
15210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15230 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
15240 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
15250 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
15260 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
15270 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
15280 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
15290 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
152a0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
152b0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
152c0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
152d0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
152e0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
152f0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15300 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15310 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
15320 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
15330 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
15340 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
15350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
15360 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15370 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15380 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15390 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
153a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
153b0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
153c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
153d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
153e0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
153f0 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
15400 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15410 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15420 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15430 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15440 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15450 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
15460 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15470 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15480 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15490 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
154a0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
154b0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
154c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
154d0 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
154e0 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
154f0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15500 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15510 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
15520 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15530 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15540 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
15550 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
15560 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
15570 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
15580 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
15590 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
155a0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
155b0 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
155c0 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
155d0 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
155e0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
155f0 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
15600 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
15610 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
15620 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15630 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15640 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15650 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
15660 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
15670 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15680 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
15690 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
156a0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
156b0 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
156c0 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
156d0 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
156e0 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
156f0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15700 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15710 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
15720 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15730 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
15740 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
15750 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
15760 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
15770 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
15780 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
15790 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
157a0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
157b0 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
157c0 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
157d0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
157e0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
157f0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
15800 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15810 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
15820 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
15830 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
15840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15850 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
15860 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
15870 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
15880 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
15890 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
158a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
158b0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
158c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
158d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
158e0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
158f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15900 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15910 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15920 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15930 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15940 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15950 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
15960 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
15970 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
15980 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
15990 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
159a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
159b0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
159c0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
159d0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
159e0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
159f0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
15a00 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
15a10 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
15a20 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
15a30 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
15a40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
15a50 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
15a60 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
15a70 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
15a80 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
15a90 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
15aa0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
15ab0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
15ac0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
15ad0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
15ae0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
15af0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
15b00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15b10 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
15b20 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
15b30 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
15b40 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
15b50 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
15b60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
15b70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
15b80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15b90 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
15ba0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
15bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15bc0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15bd0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15be0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
15bf0 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15c00 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
15c10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15c20 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15c30 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15c40 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15c50 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
15c60 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
15c70 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
15c80 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
15c90 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
15ca0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15cb0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15cc0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
15cd0 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
15ce0 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
15cf0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15d00 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
15d10 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
15d20 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
15d30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
15d40 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15d50 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
15d60 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
15d70 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
15d80 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
15d90 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
15da0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
15db0 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
15dc0 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
15dd0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15de0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15e00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
15e10 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
15e20 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15e30 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
15e40 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
15e50 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15e60 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15e70 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
15e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15e90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
15ea0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
15eb0 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
15ec0 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
15ed0 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
15ee0 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
15ef0 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
15f00 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
15f10 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
15f20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
15f30 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
15f40 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
15f50 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
15f60 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
15f70 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
15f80 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
15f90 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
15fa0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15fb0 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
15fc0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
15fd0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15fe0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15ff0 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
16000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
16010 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
16020 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
16030 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
16040 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
16050 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
16060 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
16070 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
16080 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
16090 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
160a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
160b0 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
160c0 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
160d0 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
160e0 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
160f0 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
16100 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
16110 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
16120 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
16130 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
16140 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
16150 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
16160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
16170 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
16180 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
16190 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
161a0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
161b0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
161c0 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
161d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
161e0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
161f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16200 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
16210 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
16220 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
16230 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
16240 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
16250 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
16260 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
16270 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
16280 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
16290 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
162a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
162b0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
162c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
162d0 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
162e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
162f0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
16300 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
16310 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
16320 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
16330 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16340 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
16350 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16360 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
16370 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
16380 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
16390 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
163a0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
163b0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
163c0 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
163d0 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
163e0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
163f0 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
16400 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
16410 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
16420 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
16430 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
16440 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
16450 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16460 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
16470 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
16480 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
16490 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
164a0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
164b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
164c0 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
164d0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
164e0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
164f0 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
16500 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
16510 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
16520 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16530 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16540 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
16550 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
16560 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
16570 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
16580 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
16590 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
165a0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
165b0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
165c0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
165d0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
165e0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
165f0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
16600 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
16610 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
16620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
16630 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16640 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
16650 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
16660 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
16670 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
16680 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
16690 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
166a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
166b0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
166c0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
166d0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
166e0 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
166f0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
16700 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
16710 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
16720 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
16730 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
16740 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
16750 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
16760 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
16770 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
16780 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
16790 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
167a0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
167b0 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
167c0 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
167d0 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
167e0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
167f0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
16800 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
16810 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
16820 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
16830 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16840 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
16850 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
16860 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16870 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
16880 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
16890 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
168a0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
168b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
168c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
168d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
168e0 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
168f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16900 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
16910 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16920 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
16930 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
16940 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
16950 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
16960 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
16970 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
16980 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
16990 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
169a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
169b0 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
169c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
169d0 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
169e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
169f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16a00 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
16a10 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
16a20 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
16a30 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
16a40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
16a50 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16a60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16a70 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
16a80 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
16a90 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
16aa0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
16ab0 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
16ac0 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
16ad0 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
16ae0 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
16af0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
16b00 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
16b10 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
16b20 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
16b30 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
16b40 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
16b50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
16b60 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
16b70 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
16b80 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
16b90 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
16ba0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
16bb0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
16bc0 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
16bd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
16be0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16bf0 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
16c00 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
16c10 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
16c20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
16c30 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
16c40 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
16c50 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
16c60 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
16c70 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
16c80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16c90 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16ca0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
16cb0 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
16cc0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
16cd0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
16ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16cf0 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
16d00 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
16d10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
16d20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
16d30 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
16d40 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16d50 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
16d60 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16d70 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
16d80 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
16d90 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
16da0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
16db0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16dc0 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
16dd0 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
16de0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16df0 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
16e00 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16e10 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
16e20 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
16e50 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
16e60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
16e70 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
16e80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
16e90 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
16ea0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
16eb0 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
16ec0 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
16ed0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16ee0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16ef0 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16f00 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16f30 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16f40 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
16f50 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
16f60 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16f70 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
16fa0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16fb0 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
16fc0 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
16fd0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16fe0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
16ff0 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
17000 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
17010 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
17020 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
17030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17040 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
17050 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
17060 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
17070 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17090 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
170a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
170b0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
170c0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
170d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
170e0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
170f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17100 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
17110 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
17120 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
17130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17140 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17150 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17160 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
17170 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
17180 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
17190 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
171a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
171b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
171c0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
171d0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
171e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
171f0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
17200 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
17210 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
17220 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
17230 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
17240 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
17250 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
17260 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
17270 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
17280 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
17290 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
172a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
172b0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
172c0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
172d0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
172e0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
172f0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
17300 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
17310 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
17320 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
17330 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17340 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17350 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
17360 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
17370 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
17380 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
17390 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
173a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
173b0 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
173c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
173d0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
173e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
173f0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
17400 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17410 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
17420 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
17430 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
17440 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
17450 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
17460 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
17470 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
17480 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
17490 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
174a0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
174b0 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
174c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
174d0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
174e0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
174f0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
17500 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
17510 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
17520 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
17530 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
17540 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17550 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
17560 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
17570 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
17580 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
17590 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
175a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
175b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
175c0 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
175d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
175e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
175f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
17600 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
17610 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
17620 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
17630 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
17640 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17650 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
17660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
17670 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17680 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
17690 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
176a0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
176b0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
176c0 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
176d0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
176e0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
176f0 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
17700 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
17710 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
17720 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
17730 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
17740 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
17750 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
17760 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
17770 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17780 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
17790 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
177a0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
177b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
177c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
177d0 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
177e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
177f0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
17800 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
17810 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
17820 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
17830 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
17840 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
17850 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
17860 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
17870 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
17880 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
17890 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
178a0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
178b0 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
178c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
178d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
178e0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
178f0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
17900 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
17910 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
17920 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
17930 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
17940 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
17950 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
17960 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
17970 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
17980 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
17990 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
179a0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
179b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
179c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
179d0 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
179e0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
179f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17a00 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
17a10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17a20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
17a30 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
17a40 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
17a50 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17a60 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
17a70 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
17a80 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
17a90 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
17aa0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17ab0 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
17ac0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17ad0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17ae0 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
17af0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
17b00 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17b10 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
17b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17b40 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
17b50 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
17b60 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
17b70 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
17b80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17b90 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
17ba0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17bb0 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
17bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
17bd0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
17be0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
17bf0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
17c00 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17c10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17c20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17c30 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17c40 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
17c50 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
17c60 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
17c70 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
17c80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17ca0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
17cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17cc0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
17cd0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
17ce0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17cf0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
17d00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17d10 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
17d20 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
17d30 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
17d40 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
17d50 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
17d60 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
17d70 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
17d80 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
17d90 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
17da0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
17db0 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
17dc0 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
17dd0 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
17de0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
17df0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
17e00 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17e10 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
17e20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
17e30 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
17e40 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
17e50 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
17e60 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17e70 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
17e80 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
17e90 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
17ea0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17eb0 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
17ec0 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
17ed0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
17ee0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17ef0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
17f00 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
17f10 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
17f20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
17f30 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
17f40 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17f50 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
17f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
17f70 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
17f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17fa0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
17fb0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
17fc0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
17fd0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
17fe0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
17ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
18000 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
18010 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
18020 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
18030 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18050 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
18060 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
18070 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18080 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
18090 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
180a0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
180b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
180c0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
180d0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
180e0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
180f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18100 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
18110 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18120 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18130 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
18140 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
18150 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18160 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
18170 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
18180 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
18190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
181a0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
181b0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
181c0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
181d0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
181e0 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
181f0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
18200 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
18210 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
18220 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
18230 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
18240 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
18250 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
18260 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
18270 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
18280 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
18290 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
182a0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
182b0 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
182c0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
182d0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
182e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
182f0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
18300 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
18310 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
18320 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
18330 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
18340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18350 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
18360 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
18370 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18380 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
18390 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
183a0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
183b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
183c0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
183d0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
183e0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
183f0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
18400 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
18410 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
18420 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
18430 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
18440 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
18450 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
18460 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
18470 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
18480 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
184a0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
184b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
184c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18520 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
18530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18570 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18590 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
185a0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
185d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
185e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
185f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
18600 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
18610 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
18620 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
18630 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
18640 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
18650 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
18660 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
18670 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
18680 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
18690 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
186a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
186b0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
186c0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
186d0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
186e0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
186f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
18700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
18710 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
18720 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
18730 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
18740 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
18750 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
18760 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18770 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18780 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18790 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
187a0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
187b0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
187c0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
187d0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
187e0 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
187f0 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
18800 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
18810 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
18820 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
18830 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
18840 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18860 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
18870 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18880 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
18890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
18940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
18950 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
18960 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
18990 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
189a0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
189b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
189c0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
189d0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
189e0 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
189f0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
18a00 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
18a10 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
18a20 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
18a30 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
18a40 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
18a50 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
18a60 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
18a70 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
18a80 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
18a90 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
18aa0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
18ab0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
18ac0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
18ad0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
18ae0 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
18af0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18b00 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
18b10 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
18b20 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
18b30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18b40 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
18b50 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
18b60 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
18b70 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
18b80 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
18b90 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
18ba0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
18bb0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
18bc0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
18bd0 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
18be0 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
18bf0 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
18c00 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
18c10 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
18c20 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
18c30 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
18c40 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
18c50 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
18c60 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
18c70 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
18c80 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
18c90 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
18ca0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
18cb0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
18cc0 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
18cd0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
18ce0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18d00 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
18d10 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
18d20 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
18d30 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
18d40 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
18d50 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
18d60 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
18d70 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
18d80 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18d90 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
18da0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
18db0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73  IMER_START;.  as
18dc0 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
18dd0 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e  0x1ffff) );.  cn
18de0 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
18df0 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
18e00 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
18e10 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
18e20 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
18e30 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
18e40 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
18e50 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
18e60 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18e70 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
18e80 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
18e90 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18ea0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18eb0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
18ec0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
18ed0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
18ee0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
18ef0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
18f00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
18f10 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
18f20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18f30 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
18f40 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
18f50 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
18f60 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18f70 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
18f80 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
18f90 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
18fa0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18fb0 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rno = 0;.      }
18fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
18fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
18fe0 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
18ff0 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
19000 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
19010 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
19020 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
19030 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
19040 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
19050 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
19060 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
19070 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19080 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19090 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72   errno;.      br
190a0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
190b0 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
190c0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
190d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
190e0 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
190f0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19100 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19110 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19120 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19130 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19140 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19150 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19160 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
19170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
19180 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
19190 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
191a0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
191b0 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
191c0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
191d0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
191e0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
191f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19200 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
19210 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19220 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19230 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19240 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19250 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19260 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
19270 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19280 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
19290 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
192a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
192b0 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
192c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
192d0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
192e0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
192f0 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  id );..  /* If t
19300 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
19310 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
19320 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
19330 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
19340 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
19350 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
19360 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
19370 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
19380 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
19390 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
193a0 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
193b0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
193c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
193d0 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
193e0 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
193f0 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
19400 66 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  f..  /* Deal wit
19410 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
19420 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
19430 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
19440 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
19450 64 61 74 61 20 74 6f 20 74 68 65 20 6d 65 6d 6f  data to the memo
19460 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
19470 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
19480 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
19490 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
194a0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
194b0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
194c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
194d0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
194e0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
194f0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
19500 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
19510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19530 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
19540 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
19550 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
19560 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
19570 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
19580 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
19590 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
195a0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
195b0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
195c0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
195d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
195e0 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  opy;.    }.  }..
195f0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
19600 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
19610 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
19620 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
19630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19640 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
19650 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
19660 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19670 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
19680 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
19690 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
196a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
196b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
196c0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
196d0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
196e0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
196f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
19700 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
19710 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
19720 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
19730 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
19740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
19750 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
19760 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
19770 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
19780 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
19790 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
197a0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
197b0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
197c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
197d0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
197e0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
197f0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
19800 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
19810 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
19820 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
19830 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
19840 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
19850 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
19870 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
19880 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
19890 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
198a0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
198b0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
198c0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
198d0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
198e0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
198f0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19900 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
19910 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
19920 66 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30  f) );.  cnt &= 0
19930 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
19940 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
19950 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
19960 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69  do{ got = osPwri
19970 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
19980 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
19990 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
199a0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
199b0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
199c0 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
199d0 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34  got = osPwrite64
199e0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
199f0 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c  t, offset);}whil
19a00 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
19a10 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
19a20 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66  .  do{.    newOf
19a30 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
19a40 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
19a50 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
19a60 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
19a70 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69  ffset-- );.    i
19a80 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
19a90 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  fset ){.      if
19aa0 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
19ab0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75  1 ){.        ((u
19ac0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19ad0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
19ae0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19af0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
19b00 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
19b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19b20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19b30 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19b40 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
19b50 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69  uf, cnt);.  }whi
19b60 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
19b70 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
19b80 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
19b90 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
19ba0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19bb0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19bc0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
19bd0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
19be0 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
19bf0 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
19c00 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
19c10 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
19c20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
19c30 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
19c40 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
19c50 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
19c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
19c70 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
19c80 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
19c90 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
19ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
19cb0 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
19cc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
19cd0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
19ce0 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
19cf0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19d00 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
19d10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19d20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
19d30 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
19d40 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
19d50 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
19d60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
19d70 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
19d80 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
19d90 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
19da0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
19db0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
19dc0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
19dd0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
19de0 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
19df0 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
19e00 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
19e10 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
19e20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
19e30 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
19e40 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
19e50 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
19e60 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
19e70 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
19e80 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  G.  /* If we are
19e90 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
19ea0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
19eb0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
19ec0 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69  osed to.  ** doi
19ed0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
19ee0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
19ef0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
19f00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
19f10 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
19f20 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72  ase file) then r
19f30 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
19f40 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
19f50 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65  .  ** has change
19f60 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
19f70 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
19f80 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f  s modified, reco
19f90 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63  rd that.  ** fac
19fa0 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  t too..  */.  if
19fb0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
19fc0 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46  lWrite ){.    pF
19fd0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
19fe0 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  1;  /* The datab
19ff0 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
1a000 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  ified */.    if(
1a010 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f   offset<=24 && o
1a020 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b  ffset+amt>=27 ){
1a030 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1a040 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74       char oldCnt
1a050 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75  r[4];.      Simu
1a060 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a070 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1a080 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a090 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c  le, 24, oldCntr,
1a0a0 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   4);.      Simul
1a0b0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a0c0 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  (0);.      if( r
1a0d0 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f  c!=4 || memcmp(o
1a0e0 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a  ldCntr, &((char*
1a0f0 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74  )pBuf)[24-offset
1a100 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ], 4)!=0 ){.    
1a110 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1a120 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f  CntrChng = 1;  /
1a130 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1a140 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68  n counter has ch
1a150 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d  anged */.      }
1a160 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a170 66 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  f..  /* Deal wit
1a180 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
1a190 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
1a1a0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1a1b0 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1a1c0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1a1d0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1a1e0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1a1f0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1a200 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a210 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1a220 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1a230 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1a240 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1a250 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a260 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1a270 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  f, amt);.      r
1a280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a2a0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1a2b0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1a2c0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1a2d0 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1a2e0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1a2f0 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1a300 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1a310 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1a320 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1a330 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1a340 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1a350 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1a360 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
1a370 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1a380 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1a390 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a3a0 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
1a3b0 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1a3c0 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1a3d0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1a3e0 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1a3f0 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1a400 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1a410 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1a420 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1a430 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1a440 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1a450 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
1a460 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1a470 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1a480 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1a490 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1a4a0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1a4b0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1a4c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a4d0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1a4e0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1a4f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
1a500 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1a510 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1a520 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1a530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1a540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a550 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1a560 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1a570 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1a580 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1a590 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1a5a0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1a5b0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1a5c0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1a5d0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1a5e0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1a5f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a600 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1a610 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1a620 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1a630 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1a640 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1a650 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1a660 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1a670 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1a680 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1a690 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1a6a0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1a6b0 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1a6c0 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1a6d0 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1a6e0 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1a6f0 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1a700 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1a710 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1a720 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1a730 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1a740 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
1a750 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1a760 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  c).# define fdat
1a770 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
1a780 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
1a790 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1a7a0 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
1a7b0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1a7c0 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
1a7d0 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
1a7e0 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
1a7f0 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
1a800 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
1a810 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
1a820 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
1a830 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
1a840 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
1a850 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
1a860 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
1a870 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
1a880 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
1a890 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
1a8a0 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
1a8b0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
1a8c0 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
1a8d0 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
1a8e0 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
1a8f0 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
1a900 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
1a910 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
1a920 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
1a930 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
1a940 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
1a950 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
1a960 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
1a970 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
1a980 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
1a990 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
1a9a0 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
1a9b0 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
1a9c0 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
1a9d0 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
1a9e0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1a9f0 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
1aa00 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
1aa10 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1aa20 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
1aa30 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
1aa40 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
1aa50 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
1aa60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ..**.** SQLite s
1aa80 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79  ets the dataOnly
1aa90 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a   flag if the siz
1aaa0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
1aab0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54   unchanged..** T
1aac0 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64  he idea behind d
1aad0 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20  ataOnly is that 
1aae0 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77  it should only w
1aaf0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f  rite the file co
1ab00 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b  ntent.** to disk
1ab10 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e  , not the inode.
1ab20 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61    We only set da
1ab30 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  taOnly if the fi
1ab40 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75  le size is .** u
1ab50 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74  nchanged since t
1ab60 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1ab70 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64  part of the inod
1ab80 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a  e.  However, .**
1ab90 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20   Ted Ts'o tells 
1aba0 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  us that fdatasyn
1abb0 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72  c() will also wr
1abc0 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66  ite the inode if
1abd0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a   the.** file siz
1abe0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  e has changed.  
1abf0 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69  The only real di
1ac00 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1ac10 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20   fdatasync().** 
1ac20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64  and fsync(), Ted
1ac30 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68   tells us, is th
1ac40 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1ac50 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68  ill not flush th
1ac60 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68  e.** inode if th
1ac70 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72  e mtime or owner
1ac80 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20   or other inode 
1ac90 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20  attributes have 
1aca0 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f  changed..** We o
1acb0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
1acc0 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f  he file size, no
1acd0 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65  t the other file
1ace0 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a   attributes, so.
1acf0 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c  ** as far as SQL
1ad00 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ite is concerned
1ad10 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29  , an fdatasync()
1ad20 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75   is always adequ
1ad30 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61  ate..** So, we a
1ad40 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73  lways use fdatas
1ad50 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61  ync() if it is a
1ad60 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64  vailable, regard
1ad70 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76  less of.** the v
1ad80 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1ad90 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74  Only flag..*/.st
1ada0 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
1adb0 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
1adc0 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
1add0 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
1ade0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
1adf0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
1ae00 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
1ae10 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
1ae20 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
1ae30 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
1ae40 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
1ae50 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
1ae60 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
1ae70 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
1ae80 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
1ae90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aea0 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
1aeb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1aec0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1aed0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
1aee0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aef0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1af00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1af10 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
1af20 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1af30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1af40 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
1af50 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
1af60 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1af70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1af80 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1af90 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
1afa0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
1afb0 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
1afc0 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
1afd0 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
1afe0 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
1aff0 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
1b000 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
1b010 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
1b020 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
1b030 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
1b040 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
1b050 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b060 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
1b070 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
1b080 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
1b090 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
1b0a0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
1b0b0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
1b0c0 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
1b0d0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
1b0e0 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
1b0f0 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
1b100 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1b110 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
1b120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
1b130 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1b140 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1b150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   ){.    rc = osF
1b160 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1b170 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1b180 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1b190 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1b1a0 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1b1b0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1b1c0 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1b1d0 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1b1e0 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1b1f0 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1b200 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1b210 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1b220 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1b230 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1b240 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1b250 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1b260 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1b270 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1b280 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1b290 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1b2a0 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1b2b0 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1b2c0 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1b2d0 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1b2e0 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1b2f0 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1b300 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1b310 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1b320 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1b330 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1b340 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1b350 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1b360 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1b370 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1b380 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1b390 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1b3a0 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1b3b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1b3c0 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1b3d0 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1b3e0 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1b3f0 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1b400 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1b410 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1b420 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1b430 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1b440 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1b450 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1b460 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1b470 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1b480 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1b490 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1b4a0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1b4b0 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1b4c0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1b4d0 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1b4e0 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1b4f0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1b500 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1b510 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1b520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b530 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1b540 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1b550 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1b560 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1b570 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1b580 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1b590 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1b5a0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1b5b0 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1b5c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b5d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1b5e0 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1b5f0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1b600 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1b610 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1b620 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1b630 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1b640 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1b650 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1b660 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1b670 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1b680 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1b690 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1b6a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1b6b0 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1b6c0 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1b6d0 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1b6e0 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1b6f0 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1b700 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1b710 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1b720 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1b730 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1b740 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1b750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b760 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1b770 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1b780 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1b790 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1b7a0 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1b7b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1b7c0 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1b7d0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1b7e0 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1b7f0 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1b800 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1b810 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1b820 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1b830 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1b840 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1b850 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1b860 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1b870 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1b880 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1b890 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1b8a0 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1b8b0 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1b8c0 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1b8d0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1b8e0 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1b8f0 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1b900 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1b910 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1b920 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1b930 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1b940 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1b950 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1b960 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1b970 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1b980 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1b990 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1b9a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1b9b0 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1b9c0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1b9d0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1b9e0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1b9f0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1ba00 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1ba10 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1ba20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1ba30 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1ba40 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1ba50 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
1ba60 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1ba70 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1ba80 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1ba90 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1baa0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1bab0 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1bac0 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1bad0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
1bae0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1baf0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1bb00 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1bb10 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
1bb20 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
1bb30 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
1bb40 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72  ITE_OK:unixLogEr
1bb50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1bb60 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
1bb70 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a  , zDirname));.}.
1bb80 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1bb90 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1bba0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1bbb0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1bbc0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1bbd0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1bbe0 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1bbf0 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1bc00 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1bc10 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
1bc20 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
1bc30 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
1bc40 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
1bc50 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
1bc60 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1bc70 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
1bc80 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1bc90 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1bca0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
1bcb0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
1bcc0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
1bcd0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
1bce0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1bcf0 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
1bd00 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
1bd10 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
1bd20 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
1bd30 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
1bd40 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
1bd50 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1bd60 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
1bd70 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
1bd80 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
1bd90 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
1bda0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
1bdb0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1bdc0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
1bdd0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
1bde0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1bdf0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
1be00 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
1be10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
1be20 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
1be30 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
1be40 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
1be50 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1be60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1be70 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
1be80 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
1be90 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
1bea0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1beb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1bec0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
1bed0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
1bee0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1bef0 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
1bf00 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
1bf10 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1bf20 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
1bf30 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
1bf40 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1bf50 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
1bf60 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
1bf70 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
1bf80 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1bf90 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
1bfa0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1bfb0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
1bfc0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
1bfd0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
1bfe0 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
1bff0 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
1c000 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
1c010 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
1c020 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
1c030 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1c040 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
1c050 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c060 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
1c070 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
1c080 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1c090 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
1c0a0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
1c0b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
1c0c0 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1c0d0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1c0e0 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1c0f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c100 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1c110 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1c120 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1c130 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1c140 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c150 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1c160 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1c170 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1c180 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1c190 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1c1a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c1b0 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1c1c0 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1c1d0 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1c1e0 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1c1f0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1c200 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1c210 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1c220 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1c230 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1c240 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1c250 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1c260 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1c270 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1c280 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1c290 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1c2a0 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1c2b0 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1c2c0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1c2d0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1c2e0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1c2f0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1c300 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1c310 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1c320 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1c330 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1c340 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c350 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30  E_OK && dirfd>=0
1c360 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
1c370 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
1c380 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
1c390 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1c3a0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1c3b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1c3c0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1c3d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c3e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c3f0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1c400 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
1c410 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20  E_DIRSYNC;.  }. 
1c420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c430 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1c440 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1c450 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1c460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c470 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1c480 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1c490 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1c4a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c4b0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1c4c0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1c4d0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1c4e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1c4f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c500 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1c510 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1c520 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1c530 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1c540 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1c550 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1c560 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1c570 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1c580 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1c590 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1c5a0 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1c5b0 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1c5c0 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1c5d0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1c5e0 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1c5f0 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1c600 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1c610 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1c620 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1c630 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1c640 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1c650 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1c660 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1c670 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1c680 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  e->h, (off_t)nBy
1c690 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1c6a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1c6b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1c6c0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1c6d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1c6e0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1c6f0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1c700 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1c710 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1c720 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1c730 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1c740 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1c750 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c760 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1c770 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1c780 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1c790 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1c7a0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1c7b0 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1c7c0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1c7d0 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1c7e0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1c7f0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1c800 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1c810 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1c820 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1c830 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1c840 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1c850 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1c860 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1c870 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1c880 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1c890 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1c8a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1c8b0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1c8c0 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1c8d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1c8e0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1c8f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1c900 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1c910 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61   was just trunca
1c920 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
1c930 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
1c940 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
1c950 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
1c960 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1c970 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
1c980 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
1c990 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   will.    ** use
1c9a0 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
1c9b0 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
1c9c0 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
1c9d0 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
1c9e0 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
1c9f0 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  f( nByte<pFile->
1ca00 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1ca10 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ca20 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d  e = nByte;.    }
1ca30 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
1ca40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1ca50 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1ca60 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1ca70 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1ca80 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1ca90 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1caa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1cab0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1cac0 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1cad0 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1cae0 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1caf0 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
1cb00 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
1cb10 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
1cb20 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1cb30 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1cb40 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1cb50 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1cb60 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1cb70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1cb80 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1cb90 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1cba0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1cbb0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1cbc0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1cbd0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1cbe0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1cbf0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1cc00 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1cc10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1cc20 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1cc30 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1cc40 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1cc50 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1cc60 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1cc70 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1cc80 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1cc90 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1cca0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1ccb0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1ccc0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1ccd0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1cce0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1ccf0 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1cd00 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1cd10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1cd20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1cd30 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1cd40 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1cd50 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1cd60 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1cd70 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1cd80 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1cd90 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1cda0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1cdb0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1cdc0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1cdd0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1cde0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1cdf0 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1ce00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ce10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1ce20 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1ce30 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1ce40 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1ce50 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1ce60 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1ce70 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1ce80 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1ce90 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1cea0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1ceb0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1cec0 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1ced0 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1cee0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1cef0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1cf00 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1cf10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1cf20 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1cf30 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1cf40 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1cf50 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1cf60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1cf70 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1cf80 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1cf90 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1cfa0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1cfb0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1cfc0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1cfd0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1cfe0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1cff0 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51  buf) ) return SQ
1d000 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1d010 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  ;..    nSize = (
1d020 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a  (nByte+pFile->sz
1d030 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65  Chunk-1) / pFile
1d040 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1d050 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
1d060 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29   if( nSize>(i64)
1d070 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a  buf.st_size ){..
1d080 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
1d090 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1d0a0 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
1d0b0 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20  FALLOCATE.      
1d0c0 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f  /* The code belo
1d0d0 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68  w is handling th
1d0e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1d0f0 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20  f osFallocate() 
1d100 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
1d110 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  tly. posix_fallo
1d120 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65  cate() is define
1d130 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65  d to "returns ze
1d140 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a  ro on success, .
1d150 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65        ** or an e
1d160 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20  rror number on  
1d170 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68  failure". See th
1d180 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65  e manpage for de
1d190 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1d1a0 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64  int err;.      d
1d1b0 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d  o{.        err =
1d1c0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69   osFallocate(pFi
1d1d0 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69  le->h, buf.st_si
1d1e0 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74  ze, nSize-buf.st
1d1f0 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77  _size);.      }w
1d200 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52  hile( err==EINTR
1d210 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72   );.      if( er
1d220 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
1d230 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1d240 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1d250 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1d260 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1d270 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1d280 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20  . First use.    
1d290 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29    ** ftruncate()
1d2a0 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65   to set the file
1d2b0 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74   size, then writ
1d2c0 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
1d2d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1d2e0 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1d2f0 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74  h block within t
1d300 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69  he extended regi
1d310 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  on. This.      *
1d320 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65  * is the same te
1d330 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20  chnique used by 
1d340 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65  glibc to impleme
1d350 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  nt posix_falloca
1d360 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  te().      ** on
1d370 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
1d380 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c   not have a real
1d390 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73   fallocate() sys
1d3a0 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  tem call..      
1d3b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1d3c0 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1d3d0 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1d3e0 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1d3f0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1d400 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1d410 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1d420 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1d430 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  /..      if( rob
1d440 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1d450 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29  ile->h, nSize) )
1d460 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1d470 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1d480 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1d490 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1d4a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d4b0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1d4c0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1d4d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d4e0 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1d4f0 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1d500 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1d510 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  -1;.      while(
1d520 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b   iWrite<nSize ){
1d530 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72  .        int nWr
1d540 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1d550 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1d560 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1d570 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1d580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d590 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1d5a0 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e       iWrite += n
1d5b0 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Blk;.      }.#en
1d5c0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
1d5d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
1d5e0 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 69  Limit>0 ){.    i
1d5f0 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
1d600 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30  File->szChunk<=0
1d610 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f   ){.      if( ro
1d620 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1d630 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  File->h, nByte) 
1d640 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1d650 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1d660 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
1d670 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d680 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d690 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d6a0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d6b0 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1d6c0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1d6d0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1d6e0 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1d6f0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  n rc;.  }..  ret
1d700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d710 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
1d720 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
1d730 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
1d740 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
1d750 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
1d760 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
1d770 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1d780 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
1d790 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1d7a0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
1d7b0 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
1d7c0 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
1d7d0 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
1d7e0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1d7f0 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
1d800 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
1d810 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1d820 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1d830 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
1d840 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
1d850 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
1d860 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1d870 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
1d880 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
1d890 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
1d8a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1d8b0 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
1d8c0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1d8d0 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
1d8e0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1d8f0 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
1d900 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
1d910 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1d920 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
1d930 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1d940 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1d950 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1d960 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1d970 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1d980 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1d990 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1d9a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1d9b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d9c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1d9d0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1d9e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1d9f0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1da00 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1da10 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1da20 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1da30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1da40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1da50 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1da60 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1da70 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1da80 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1da90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1daa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dab0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1dac0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1dad0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1dae0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1daf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1db00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1db10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1db20 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1db30 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1db40 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1db50 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1db60 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1db70 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1db80 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1db90 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1dba0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1dbb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1dbc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1dbd0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1dbe0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1dbf0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1dc00 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1dc10 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1dc20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1dc30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dc40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1dc50 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1dc60 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1dc70 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1dc80 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1dc90 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1dca0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1dcb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dcc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1dcd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1dce0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1dcf0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1dd00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1dd10 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1dd20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1dd30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dd40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1dd50 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
1dd60 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
1dd70 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
1dd80 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1dd90 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
1dda0 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20  athname );.     
1ddb0 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20   if( zTFile ){. 
1ddc0 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65         unixGetTe
1ddd0 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
1dde0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
1ddf0 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
1de00 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1de10 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
1de20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1de30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1de40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1de50 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
1de60 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d  {.      pFile->m
1de70 6d 61 70 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  mapLimit = *(i64
1de80 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1de90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dea0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1deb0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
1dec0 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
1ded0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
1dee0 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
1def0 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
1df00 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
1df10 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1df20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
1df30 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
1df40 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
1df50 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
1df60 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
1df70 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
1df80 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
1df90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1dfa0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1dfb0 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
1dfc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1dfd0 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
1dfe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1dff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1e000 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1e010 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1e020 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1e030 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
1e040 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
1e050 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
1e060 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
1e070 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1e080 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1e090 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1e0a0 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
1e0b0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1e0c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e0d0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1e0e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1e0f0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
1e100 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1e110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e120 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
1e130 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
1e140 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
1e150 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
1e160 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1e170 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
1e180 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
1e190 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
1e1a0 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
1e1b0 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
1e1c0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
1e1d0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
1e1e0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
1e1f0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
1e200 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
1e210 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
1e220 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
1e230 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
1e240 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
1e250 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
1e260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
1e270 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
1e280 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
1e290 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
1e2a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
1e2b0 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20  NXNTO__ .static 
1e2c0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1e2d0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1e2e0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1e2f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1e300 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1e310 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1e320 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23  SECTOR_SIZE;.}.#
1e330 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1e340 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69   following versi
1e350 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72  on of unixSector
1e360 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69  Size() is optimi
1e370 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a  zed for QNX..*/.
1e380 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1e390 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  _.#include <sys/
1e3a0 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
1e3b0 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
1e3c0 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  s.h>.static int 
1e3d0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
1e3e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1e3f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1e400 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1e410 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
1e420 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20  ->sectorSize == 
1e430 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1e440 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a  statvfs fsInfo;.
1e450 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53         .    /* S
1e460 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20  et defaults for 
1e470 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69  non-supported fi
1e480 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20  lesystems */.   
1e490 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e4a0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
1e4b0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1e4c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
1e4d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1e4e0 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66  s = 0;.    if( f
1e4f0 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68  statvfs(pFile->h
1e500 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
1e510 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
1e520 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
1e530 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
1e540 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1e550 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1e560 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
1e570 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e580 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1e590 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1e5a0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1e5b0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1e5c0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1e5d0 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
1e5e0 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
1e5f0 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
1e600 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1e610 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1e620 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1e630 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1e640 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1e650 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
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 2a                 *
1e680 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1e690 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1e6a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1e6b0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1e6c0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1e6d0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1e6e0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1e710 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1e720 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1e730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1e740 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
1e750 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
1e760 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1e770 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1e780 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1e790 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1e7a0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1e7b0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
1e7c0 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
1e7d0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1e7e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
1e7f0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1e800 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1e810 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
1e820 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1e830 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1e840 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1e850 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1e860 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1e8a0 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1e8b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1e8c0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1e8d0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1e8e0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1e8f0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1e930 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1e940 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1e950 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1e960 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1e970 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
1e980 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e990 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1e9a0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1e9b0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1e9c0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1e9d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1e9e0 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
1e9f0 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
1ea00 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1ea10 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1ea20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1ea30 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1ea40 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1ea50 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1ea60 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ea90 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1eaa0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1eab0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1eac0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1ead0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1eae0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1eaf0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1eb20 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1eb30 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1eb40 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
1eb50 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
1eb60 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
1eb70 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1eb80 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1eb90 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1eba0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1ebb0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1ebc0 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
1ebd0 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
1ebe0 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
1ebf0 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
1ec00 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
1ec10 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ec20 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1ec30 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1ec40 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
1ec50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1ec60 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1ec70 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1ec80 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1ec90 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1ecd0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1ece0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1ecf0 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
1ed00 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
1ed10 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
1ed20 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1ed30 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1ed40 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1ed50 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ed60 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
1ed70 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
1ed80 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
1ed90 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
1eda0 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
1edb0 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
1edc0 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1edd0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1ede0 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
1edf0 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
1ee00 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1ee10 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1ee20 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1ee30 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1ee40 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1ee70 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1ee80 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1ee90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
1eea0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1eeb0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1eec0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1eed0 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
1eee0 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
1eef0 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1ef00 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1ef10 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1ef20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1ef30 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1ef40 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1ef80 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1ef90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1efa0 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
1efb0 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
1efc0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1efd0 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
1efe0 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
1eff0 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
1f000 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
1f010 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
1f020 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
1f030 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f040 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
1f050 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1f060 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1f070 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1f080 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1f090 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
1f0a0 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
1f0b0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a   __QNXNTO__ */..
1f0c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f0d0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1f0e0 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
1f0f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
1f100 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
1f110 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1f120 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1f130 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
1f140 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
1f150 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
1f160 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73   contraversial s
1f170 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
1f180 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1f190 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
1f1a0 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
1f1b0 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
1f1c0 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
1f1d0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
1f1e0 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
1f1f0 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
1f200 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
1f210 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
1f220 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
1f230 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
1f240 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
1f250 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
1f260 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
1f270 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
1f280 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
1f290 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
1f2a0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
1f2b0 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
1f2c0 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
1f2d0 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
1f2e0 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
1f2f0 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
1f300 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
1f310 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1f320 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
1f330 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
1f340 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
1f350 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1f360 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
1f370 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
1f380 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
1f390 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
1f3a0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
1f3b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f3c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1f3d0 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
1f3e0 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  p = (unixFile*)i
1f3f0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
1f400 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1f410 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74  __.  if( p->sect
1f420 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78  orSize==0 ) unix
1f430 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a  SectorSize(id);.
1f440 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65    rc = p->device
1f450 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1f460 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1f470 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1f480 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
1f490 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49    rc |= SQLITE_I
1f4a0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1f4b0 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20  VERWRITE;.  }.  
1f4c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1f4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f4e0 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62  T_WAL.../*.** Ob
1f4f0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
1f500 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
1f510 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
1f520 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
1f530 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1f540 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1f550 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
1f560 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
1f570 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
1f580 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
1f590 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
1f5a0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1f5b0 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
1f5c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1f5d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1f5e0 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
1f5f0 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
1f600 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
1f610 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
1f620 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1f630 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
1f640 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
1f650 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
1f660 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
1f670 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
1f680 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
1f690 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
1f6a0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
1f6b0 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
1f6c0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
1f6d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
1f6e0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
1f6f0 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
1f700 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
1f710 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
1f720 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
1f730 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
1f740 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
1f750 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
1f760 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
1f770 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1f780 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
1f790 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1f7a0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
1f7b0 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
1f7c0 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
1f7d0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1f7e0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1f7f0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1f800 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1f810 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1f820 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1f830 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1f840 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1f850 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1f860 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
1f870 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
1f880 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
1f890 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
1f8a0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
1f8b0 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
1f8c0 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
1f8d0 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
1f8e0 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
1f8f0 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1f900 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
1f910 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
1f920 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1f930 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
1f940 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
1f950 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
1f960 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
1f970 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1f980 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
1f990 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
1f9a0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
1f9b0 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
1f9c0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
1f9d0 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
1f9e0 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
1f9f0 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1fa00 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
1fa10 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1fa20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
1fa30 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
1fa60 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
1fa70 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
1fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fa90 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1faa0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
1fab0 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
1fac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fad0 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
1fae0 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
1faf0 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
1fb00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1fb10 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68  ead-only */.  ch
1fb20 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
1fb30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1fb40 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
1fb50 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1fb60 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1fb90 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1fba0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1fbb0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
1fbc0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1fbd0 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
1fbe0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1fbf0 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
1fc00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1fc10 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1fc30 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1fc40 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1fc50 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1fc70 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1fc80 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
1fc90 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1fcb0 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
1fcc0 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
1fcd0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1fce0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
1fcf0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
1fd00 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
1fd10 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
1fd20 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
1fd30 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
1fd40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1fd50 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1fd60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
1fd70 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
1fd80 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
1fd90 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
1fda0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
1fdb0 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
1fdc0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
1fdd0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
1fde0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
1fdf0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
1fe00 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
1fe10 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1fe20 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1fe30 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1fe40 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1fe50 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
1fe60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1fe70 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
1fe80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
1fe90 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1fea0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
1feb0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1fec0 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
1fed0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
1fee0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
1fef0 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
1ff00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ff10 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
1ff20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
1ff30 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1ff60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1ff70 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1ff80 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
1ff90 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1ffa0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1ffb0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1ffc0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
1ffd0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1ffe0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1fff0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
20000 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
20010 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
20020 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
20030 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
20040 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
20050 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
20060 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
20070 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
20080 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
20090 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
200a0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
200b0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
200c0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
200d0 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
200e0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
200f0 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
20100 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
20110 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
20120 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
20130 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
20140 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
20150 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
20160 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
20170 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
20180 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
20190 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
201a0 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
201b0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
201c0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
201d0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
201e0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
201f0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
20200 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
20210 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
20220 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
20230 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
20240 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
20250 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
20280 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
20290 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
202a0 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
202b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
202c0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
202d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
202e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
202f0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
20300 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
20310 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
20320 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20330 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
20340 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
20350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20360 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
20370 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
20380 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
20390 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
203a0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
203b0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
203c0 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
203d0 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
203e0 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
203f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
20400 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
20410 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
20420 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
20430 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  _NLOCK );..  if(
20440 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20450 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
20460 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
20470 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
20480 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c     memset(&f, 0,
20490 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20   sizeof(f));.   
204a0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
204b0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
204c0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
204d0 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
204e0 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
204f0 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20  en = n;..    rc 
20500 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
20510 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  de->h, F_SETLK, 
20520 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72  &f);.    rc = (r
20530 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54  c!=(-1)) ? SQLIT
20540 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55  E_OK : SQLITE_BU
20550 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  SY;.  }..  /* Up
20560 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
20570 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
20580 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
20590 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
205a0 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
205b0 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
205c0 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
205d0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
205e0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
205f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
20610 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
20620 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
20630 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
20640 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
20650 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
20660 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
20670 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20680 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
20690 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
206a0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
206b0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
206c0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
206d0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
206e0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
206f0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
20700 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
20710 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
20720 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
20730 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
20740 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
20750 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
20760 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
20770 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
20780 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
20790 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
207a0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
207b0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
207c0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
207d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
207e0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
207f0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
20800 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
20810 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
20820 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
20830 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
20840 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
20850 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
20860 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
20870 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
20880 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
20890 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
208a0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
208b0 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
208c0 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
208d0 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
208e0 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
208f0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
20900 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
20910 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
20920 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
20930 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
20940 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
20950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  }.../*.** Purge 
20960 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c  the unixShmNodeL
20970 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
20980 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
20990 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
209a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
209b0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
209c0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
209d0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
209e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
209f0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
20a00 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
20a10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20a20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69  unixShmPurge(uni
20a30 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75  xFile *pFd){.  u
20a40 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20  nixShmNode *p = 
20a50 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  pFd->pInode->pSh
20a60 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
20a70 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
20a80 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
20a90 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
20aa0 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
20ab0 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
20ac0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
20ad0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20ae0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
20af0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20b00 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
20b10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
20b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75  =0 ){.        mu
20b30 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e  nmap(p->apRegion
20b40 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e  [i], p->szRegion
20b50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20b70 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
20b80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
20b90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
20ba0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
20bb0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  );.    if( p->h>
20bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
20bd0 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d  st_close(pFd, p-
20be0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
20bf0 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a       p->h = -1;.
20c00 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e      }.    p->pIn
20c10 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
20c20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
20c30 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
20c40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72  *.** Open a shar
20c50 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
20c60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f  ssociated with o
20c70 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
20c80 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68  e pDbFd.  .** Th
20c90 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d  is particular im
20ca0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
20cb0 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
20cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
20cd0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
20ce0 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
20cf0 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  is in the same d
20d00 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74  irectory.** as t
20d10 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
20d20 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68   file and has th
20d30 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
20d40 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
20d50 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68  .** file with th
20d60 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20  e "-shm" suffix 
20d70 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  added.  For exam
20d80 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61  ple, if the data
20d90 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20  base file.** is 
20da0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
20db0 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65  fig.db" then the
20dc0 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72   file that is cr
20dd0 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  eated and mmappe
20de0 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20  d.** for shared 
20df0 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63  memory will be c
20e00 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65  alled "/home/use
20e10 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d  r1/config.db-shm
20e20 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68  ".  .**.** Anoth
20e30 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69  er approach to i
20e40 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69  s to use files i
20e50 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64  n /dev/shm or /d
20e60 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20  ev/tmp or an.** 
20e70 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73  some other tmpfs
20e80 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61   mount. But if a
20e90 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65   file in a diffe
20ea0 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a  rent directory.*
20eb0 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  * from the datab
20ec0 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64  ase file is used
20ed0 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67  , then differing
20ee0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
20ef0 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f  ons.** or a chro
20f00 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65  ot() might cause
20f10 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70   two different p
20f20 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20  rocesses on the 
20f30 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  same.** database
20f40 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67   to end up using
20f50 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
20f60 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
20f70 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  ry - .** meaning
20f80 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f   that their memo
20f90 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61  ry would not rea
20fa0 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20  lly be shared - 
20fb0 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20  resulting.** in 
20fc0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
20fd0 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ion.  Neverthele
20fe0 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66  ss, this tmpfs f
20ff0 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e  ile usage.** can
21000 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63   be enabled at c
21010 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e  ompile-time usin
21020 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44  g -DSQLITE_SHM_D
21030 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73  IRECTORY="/dev/s
21040 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71  hm".** or the eq
21050 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75  uivalent.  The u
21060 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  se of the SQLITE
21070 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
21080 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f  ompile-time.** o
21090 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ption results in
210a0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
210b0 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65   build of SQLite
210c0 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c  ;  builds of SQL
210d0 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68  ite.** that with
210e0 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54   differing SQLIT
210f0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
21100 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74  settings attempt
21110 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73   to use the.** s
21120 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
21130 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
21140 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72  me, database cor
21150 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b  ruption will lik
21160 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54  ely.** result. T
21170 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
21180 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
21190 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63  time option is c
211a0 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e  onsidered.** "un
211b0 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d  supported" and m
211c0 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20  ay go away in a 
211d0 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65  future SQLite re
211e0 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lease..**.** Whe
211f0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
21200 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
21210 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
21220 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
21230 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
21240 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
21250 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
21260 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
21270 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
21280 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
21290 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
212a0 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
212b0 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
212c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
212d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
212e0 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69  e file (pDbFd) i
212f0 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69  s using the "uni
21300 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74  x-excl" VFS.** t
21310 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
21320 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
21330 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
21340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
21350 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68  d.** that no oth
21360 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  er processes are
21370 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72   able to read or
21380 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
21390 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74  ase.  In.** that
213a0 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74   case, we do not
213b0 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61   really need sha
213c0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20  red memory.  No 
213d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  shared memory.**
213e0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
213f0 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  .  The shared me
21400 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d  mory will be sim
21410 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70  ulated with heap
21420 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
21430 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53  ic int unixOpenS
21440 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78  haredMemory(unix
21450 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
21460 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a  struct unixShm *
21470 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
21480 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
21490 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
214a0 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  /.  struct unixS
214b0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
214c0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
214d0 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
214e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
21510 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78  t code */.  unix
21520 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
21530 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
21540 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a  he inode of fd *
21550 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69  /.  char *zShmFi
21560 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
21570 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21580 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  he file used for
21590 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   SHM */.  int nS
215a0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
215b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
215c0 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c  e of the SHM fil
215d0 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  ename in bytes *
215e0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
215f0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
21600 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ew unixShm objec
21610 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  t. */.  p = sqli
21620 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
21630 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
21640 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
21650 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
21660 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
21670 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
21680 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
21690 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
216a0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
216b0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
216c0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
216d0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
216e0 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
216f0 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
21700 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
21710 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  ary..  */.  unix
21720 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
21730 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
21740 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
21750 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
21760 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
21770 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
21780 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
21790 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
217a0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
217b0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
217c0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
217d0 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
217e0 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
217f0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
21800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21810 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
21820 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
21830 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
21840 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
21850 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
21860 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
21870 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
21880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
21890 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
218a0 26 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64  &sStat) && pInod
218b0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
218c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
218d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
218e0 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  TAT;.      goto 
218f0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
21900 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
21910 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21920 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
21930 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
21940 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
21950 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20   + 31;.#else.   
21960 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
21970 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  6 + (int)strlen(
21980 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23  pDbFd->zPath);.#
21990 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
219a0 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
219b0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  loc( sizeof(*pSh
219c0 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c  mNode) + nShmFil
219d0 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28  ename );.    if(
219e0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
219f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21a00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
21a10 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
21a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
21a30 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20  et(pShmNode, 0, 
21a40 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
21a50 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  )+nShmFilename);
21a60 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  .    zShmFilenam
21a70 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
21a80 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
21a90 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
21aa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
21ab0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
21ac0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21ad0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
21ae0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  hmFilename, .   
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
21b10 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
21b20 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
21b50 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
21b60 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
21b70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21b80 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
21b90 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22   zShmFilename, "
21ba0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
21bb0 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
21bc0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
21bd0 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
21be0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
21bf0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
21c00 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
21c10 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21c20 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
21c30 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
21c40 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
21c50 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
21c60 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
21c70 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
21c80 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
21c90 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
21ca0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
21cb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21cc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21cd0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
21ce0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
21cf0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
21d00 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
21d10 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
21d20 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
21d30 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
21d40 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
21d50 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
21d60 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
21d70 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
21d80 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
21d90 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
21da0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
21db0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
21dc0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21dd0 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
21de0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
21df0 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
21e00 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
21e10 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
21e20 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
21e30 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
21e40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
21e50 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
21e60 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
21e70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
21e80 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
21e90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
21ea0 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
21eb0 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
21ec0 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
21ed0 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
21ee0 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
21ef0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
21f00 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
21f10 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
21f20 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
21f30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
21f40 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
21f50 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
21f60 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a  connect..      *
21f70 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  /.      osFchown
21f80 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
21f90 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61  tat.st_uid, sSta
21fa0 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20  t.st_gid);.  .  
21fb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
21fc0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
21fd0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
21fe0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
21ff0 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20  witch..      ** 
22000 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
22010 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
22020 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20  o length. .     
22030 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
22040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22050 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
22060 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
22070 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
22080 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
22090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
220a0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
220b0 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
220c0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
220d0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
220e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
220f0 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
22100 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
22110 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
22120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22150 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
22160 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
22170 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
22180 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  S, 1);.      }. 
22190 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
221a0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
221b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
221c0 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
221d0 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
221e0 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
221f0 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
22200 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
22210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22220 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
22230 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
22240 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
22250 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
22260 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
22270 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
22280 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
22290 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
222a0 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
222b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
222c0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
222d0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
222e0 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
222f0 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
22300 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
22310 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
22320 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
22330 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
22340 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
22350 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
22360 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
22370 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
22380 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
22390 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
223a0 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
223b0 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
223c0 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
223d0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
223e0 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
223f0 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
22400 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
22410 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
22420 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
22430 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
22440 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
22450 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
22460 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
22470 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
22480 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
22490 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
224a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
224b0 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
224c0 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
224d0 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
224e0 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
224f0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
22500 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
22510 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
22520 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
22530 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
22540 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22560 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22570 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
22580 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
22590 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
225a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
225b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
225c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
225d0 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
225e0 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
225f0 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
22600 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
22610 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
22620 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
22630 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
22640 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
22650 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22660 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
22670 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
22680 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
22690 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
226a0 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
226b0 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
226c0 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
226d0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
226e0 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
226f0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
22700 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
22710 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
22720 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
22730 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
22740 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
22750 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
22760 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
22770 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
22780 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
22790 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
227a0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
227b0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
227c0 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
227d0 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
227e0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
227f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22800 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
22810 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
22820 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
22830 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
22840 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
22850 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
22860 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
22870 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
22880 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22890 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
228a0 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
228b0 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
228c0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
228d0 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
228e0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
228f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
22900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22910 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
22920 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
22930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
22940 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
22950 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
22960 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
22990 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
229a0 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
229b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
229c0 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
229d0 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
22a00 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
22a10 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
22a20 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a40 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
22a50 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
22a60 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
22a70 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
22a80 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
22a90 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
22aa0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
22ab0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
22ac0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
22ad0 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ory file has not
22ae0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
22af0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
22b00 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70  /.  if( pDbFd->p
22b10 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Shm==0 ){.    rc
22b20 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65   = unixOpenShare
22b30 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
22b40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22b50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22b60 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44  c;.  }..  p = pD
22b70 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68  bFd->pShm;.  pSh
22b80 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
22b90 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ode;.  sqlite3_m
22ba0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
22bb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
22bc0 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
22bd0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
22be0 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
22bf0 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20  >nRegion==0 );. 
22c00 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
22c10 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
22c20 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
22c30 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
22c40 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
22c50 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
22c60 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
22c70 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
22c80 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
22c90 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
22ca0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
22cb0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
22cc0 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
22cd0 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
22d00 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
22d10 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
22d20 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
22d30 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
22d40 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
22d50 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
22d60 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d80 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
22d90 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
22da0 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
22db0 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
22dc0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
22dd0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
22de0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
22df0 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
22e00 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
22e10 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
22e20 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
22e30 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
22e40 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
22e50 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
22e60 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
22e70 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
22e80 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
22e90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
22ea0 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
22eb0 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
22ec0 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
22ed0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
22ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
22ef0 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
22f00 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
22f10 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
22f20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
22f30 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
22f40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
22f50 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
22f60 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
22f70 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
22f80 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
22f90 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
22fa0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
22fb0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
22fc0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
22fd0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
22fe0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
22ff0 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
23000 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
23010 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63  true, use ftrunc
23020 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
23030 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
23040 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
23050 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
23060 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
23070 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f   !bExtend ) goto
23080 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23 69   shmpage_out;.#i
23090 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
230a0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
230b0 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
230c0 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20 20  LLOCATE.        
230d0 69 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  if( osFallocate(
230e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
230f0 61 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79 74  at.st_size, nByt
23100 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
23110 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
23120 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23130 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c 6c  R_SHMSIZE, "fall
23140 6f 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ocate",.        
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
23170 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23180 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23190 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
231a0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
231b0 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
231c0 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
231d0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
231e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
231f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23200 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
23210 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
23240 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
23250 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
23260 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
23270 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
23280 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
23290 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
232a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
232b0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
232c0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
232d0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
232e0 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
232f0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
23300 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
23310 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
23320 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  )*sizeof(char *)
23330 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
23340 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
23350 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
23360 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
23370 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
23380 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
23390 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
233a0 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
233b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  (pShmNode->nRegi
233c0 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20  on<=iRegion){.  
233d0 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
233e0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
233f0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
23400 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28      pMem = mmap(
23410 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20  0, szRegion,.   
23420 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
23430 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20  e->isReadonly ? 
23440 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54  PROT_READ : PROT
23450 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
23460 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  , .            M
23470 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
23480 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e  ode->h, szRegion
23490 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e  *(i64)pShmNode->
234a0 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  nRegion.        
234b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
234c0 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
234d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
234e0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
234f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
23500 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
23510 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
23520 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23530 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
23540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
23550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
23560 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
23570 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  oc(szRegion);.  
23580 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
23590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
235a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
235b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
235c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
235d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
235e0 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
235f0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
23600 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
23610 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
23620 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d  Node->nRegion] =
23630 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68   pMem;.      pSh
23640 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
23650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
23660 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
23670 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
23680 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
23690 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
236a0 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
236b0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
236c0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
236d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
236e0 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
236f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
23700 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
23710 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
23720 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
23730 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
23740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23750 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
23760 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
23770 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
23780 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
23790 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
237a0 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
237b0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
237c0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
237d0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
237e0 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
237f0 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
23800 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
23810 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
23820 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
23830 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
23840 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
23850 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
23860 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
23870 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
23880 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
23890 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
238a0 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
238b0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
238c0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
238d0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
238e0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
238f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
23900 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
23910 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
23920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23930 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
23940 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
23950 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
23980 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
23990 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
239a0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
239b0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
239c0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
239d0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
239e0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
239f0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
23a00 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
23a10 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
23a20 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
23a30 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
23a40 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
23a50 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
23a60 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
23a70 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
23a80 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23aa0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
23ab0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
23ac0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
23ad0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
23ae0 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
23af0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
23b00 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
23b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
23b40 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23b70 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
23b80 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
23b90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
23ba0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
23bb0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
23bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
23bd0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
23be0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
23bf0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
23c00 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
23c10 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
23c20 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
23c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
23c40 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
23c50 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
23c60 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
23c70 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
23c80 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
23c90 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
23ca0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
23cb0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
23cc0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
23cd0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
23ce0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
23cf0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
23d00 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
23d10 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
23d20 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
23d30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
23d40 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
23d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
23d60 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
23d70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
23d80 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
23d90 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
23da0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
23db0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
23dc0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
23dd0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
23de0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
23df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
23e00 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
23e10 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
23e20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
23e30 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23e40 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
23e50 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
23e60 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
23e70 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
23e80 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
23e90 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
23ea0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
23eb0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
23ec0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
23ed0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
23ee0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
23ef0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
23f00 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
23f10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23f20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
23f30 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
23f40 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
23f50 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
23f60 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
23f70 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
23f80 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
23f90 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
23fa0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
23fb0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
23fc0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
23fd0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23fe0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
23ff0 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
24000 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
24010 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24030 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
24040 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
24050 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
24060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24070 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
24080 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
24090 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
240a0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
240b0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
240c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
240d0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
240e0 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
240f0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
24100 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
24110 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
24120 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
24130 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
24140 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
24150 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
24160 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
24170 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
24180 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
24190 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
241a0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
241b0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
241c0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
241d0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
241e0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
241f0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
24200 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
24210 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
24220 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
24230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
24240 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
24250 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
24270 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
24280 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
24290 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
242a0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
242b0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
242c0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
242d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
242e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
242f0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
24300 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
24310 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
24320 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
24330 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
24340 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
24350 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
24360 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
24380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
24390 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
243a0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
243b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
243c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
243d0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
243e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
243f0 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
24400 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
24410 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
24420 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
24430 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
24440 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
24450 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
24460 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
24470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
24480 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
24490 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
244a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
244b0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
244c0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
244d0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
244e0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
244f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24500 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
24510 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
24520 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
24530 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
24540 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
24550 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
24560 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
24570 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
24580 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
24590 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
245a0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
245b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
245c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
245d0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
245e0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
245f0 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
24600 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
24610 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24630 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
24640 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
24650 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
24660 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
24670 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
24680 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
24690 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
246a0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
246b0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
246c0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
246d0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
246e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
246f0 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
24700 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
24710 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
24720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24730 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
24740 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
24750 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
24760 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
24770 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
24780 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
24790 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
247a0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
247b0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
247c0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
247d0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
247e0 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
247f0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
24800 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
24810 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
24820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24830 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
24840 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
24850 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
24860 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24870 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
24880 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
24890 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
248a0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
248b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
248c0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
248d0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
248e0 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
248f0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
24900 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
24910 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
24920 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
24930 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
24940 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
24950 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
24960 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
24970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
24980 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
24990 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
249c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
249d0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
249e0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
249f0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
24a00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
24a10 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
24a20 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
24a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24a40 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
24a50 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
24a60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
24a70 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
24a80 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
24a90 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
24aa0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
24ab0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
24ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
24ad0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
24ae0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
24af0 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
24b00 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
24b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
24b20 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
24b30 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
24b40 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
24b50 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
24b60 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
24b70 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
24b80 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
24b90 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
24ba0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24bb0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
24bc0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
24bd0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24be0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
24bf0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
24c00 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
24c10 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
24c20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
24c30 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
24c40 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
24c50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
24c60 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24c70 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
24c80 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
24c90 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
24ca0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
24cb0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
24cc0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
24cd0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
24ce0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
24cf0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
24d00 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
24d10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24d20 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
24d30 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
24d40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
24d50 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
24d60 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
24d70 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
24d80 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
24d90 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
24da0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
24db0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
24dc0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
24dd0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
24de0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
24df0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
24e00 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
24e10 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
24e20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
24e30 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
24e40 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
24e50 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
24e60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
24e70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24e80 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
24e90 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
24ea0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
24eb0 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
24ec0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
24ed0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
24ee0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
24ef0 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
24f00 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
24f10 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
24f20 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72  ** If it is curr
24f30 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70  ently memory map
24f40 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20  ped, unmap file 
24f50 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pFd..*/.static v
24f60 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
24f70 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
24f80 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
24f90 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
24fa0 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70  .  if( pFd->pMap
24fb0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6d 75  Region ){.    mu
24fc0 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
24fd0 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 4f  gion, pFd->mmapO
24fe0 72 69 67 73 69 7a 65 29 3b 0a 20 20 20 20 70 46  rigsize);.    pF
24ff0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
25000 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
25010 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
25020 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20  d->mmapOrigsize 
25030 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
25040 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
25050 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
25060 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
25070 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
25080 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
25090 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
250a0 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
250b0 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
250c0 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
250d0 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
250e0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
250f0 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
25100 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
25110 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
25120 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
25130 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
25140 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
25150 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25160 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
25170 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
25180 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
25190 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
251a0 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
251b0 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
251c0 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
251d0 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
251e0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
251f0 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
25200 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
25210 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25220 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
25230 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
25240 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
25250 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
25260 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
25270 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
25280 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
25290 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
252a0 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68  MMAP_SIZE, which
252b0 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
252c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
252d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
252e0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
252f0 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
25300 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
25310 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
25320 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
25330 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
25340 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
25350 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
25360 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
25370 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
25380 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
25390 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34  64 nByte){.  i64
253a0 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
253b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
253c0 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
253d0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
253e0 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e   );.  if( pFd->n
253f0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
25400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
25410 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
25420 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
25430 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
25440 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
25450 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
25460 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  */.    rc = osFs
25470 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61  tat(pFd->h, &sta
25480 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
25490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
254a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
254b0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
254c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20  .    }.    nMap 
254d0 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  = statbuf.st_siz
254e0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  e;.  }.  if( nMa
254f0 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74  p>pFd->mmapLimit
25500 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
25510 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3b 0a 20  Fd->mmapLimit;. 
25520 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d   }..  if( nMap!=
25530 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  pFd->mmapSize ){
25540 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
25550 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
25560 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
25570 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
25580 52 43 45 29 0a 20 20 20 20 69 66 28 20 70 46 64  RCE).    if( pFd
25590 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20  ->pMapRegion && 
255a0 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  nMap>0 ){.      
255b0 70 4e 65 77 20 3d 20 6d 72 65 6d 61 70 28 70 46  pNew = mremap(pF
255c0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
255d0 46 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  Fd->mmapOrigsize
255e0 2c 20 6e 4d 61 70 2c 20 4d 52 45 4d 41 50 5f 4d  , nMap, MREMAP_M
255f0 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7d 65 6c  AYMOVE);.    }el
25600 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
25610 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
25620 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 20 20  ile(pFd);.      
25630 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20  if( nMap>0 ){.  
25640 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
25650 3d 20 50 52 4f 54 5f 52 45 41 44 3b 0a 20 20 20  = PROT_READ;.   
25660 20 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63       if( (pFd->c
25670 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
25680 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
25690 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57   flags |= PROT_W
256a0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 70 4e  RITE;.        pN
256b0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
256c0 4d 61 70 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  Map, flags, MAP_
256d0 53 48 41 52 45 44 2c 20 70 46 64 2d 3e 68 2c 20  SHARED, pFd->h, 
256e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
256f0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  }..    if( pNew=
25700 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
25710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25720 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3b 0a 20  TE_IOERR_MMAP;. 
25730 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d     }.    pFd->pM
25740 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
25750 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
25760 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70  ze = nMap;.    p
25770 46 64 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  Fd->mmapOrigsize
25780 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
25790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
257a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f  ;.}../*.** If po
257b0 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
257c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
257d0 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
257e0 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
257f0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
25800 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
25810 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
25820 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
25830 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
25840 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
25850 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
25860 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
25870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
25880 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
25890 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
258a0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
258b0 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
258c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
258d0 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
258e0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
258f0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
25900 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
25910 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
25920 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
25930 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
25940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
25950 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
25960 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
25970 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
25980 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
25990 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
259a0 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
259b0 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
259c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
259d0 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
259e0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
259f0 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
25a00 64 20 2a 2a 70 70 29 7b 0a 20 20 75 6e 69 78 46  d **pp){.  unixF
25a10 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
25a20 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
25a30 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25a40 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25a50 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 69 66    *pp = 0;..  if
25a60 28 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74  ( pFd->mmapLimit
25a70 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
25a80 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
25a90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
25aa0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
25ab0 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
25ac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25ad0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25ae0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
25af0 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
25b00 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
25b10 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
25b20 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
25b30 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
25b40 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
25b50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25b70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
25b80 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
25b90 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
25ba0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
25bb0 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65  ses a .** refere
25bc0 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
25bd0 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
25be0 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20  to unixFetch(). 
25bf0 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  The second.** ar
25c00 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
25c10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
25c20 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
25c30 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
25c40 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ding.** argument
25c50 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64   that was passed
25c60 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63   to the unixFetc
25c70 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  h() invocation. 
25c80 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
25c90 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
25ca0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
25cb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25cc0 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a  being called .**
25cd0 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
25ce0 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
25cf0 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
25d00 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
25d10 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20  mapping .** may 
25d20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61  now be invalid a
25d30 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d  nd should be unm
25d40 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  apped..*/.static
25d50 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68   int unixUnfetch
25d60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
25d70 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
25d80 64 20 2a 70 29 7b 0a 20 20 75 6e 69 78 46 69 6c  d *p){.  unixFil
25d90 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
25da0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
25db0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
25dc0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
25dd0 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
25de0 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
25df0 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
25e00 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
25e10 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
25e20 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
25e30 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
25e40 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
25e50 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
25e60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
25e70 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
25e80 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
25e90 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25ea0 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
25eb0 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
25ec0 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
25ed0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
25ee0 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
25ef0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
25f00 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
25f10 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
25f20 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
25f30 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
25f40 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
25f50 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
25f60 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
25f70 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
25f80 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72  tchOut>=0 );.  r
25f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
25fb0 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
25fc0 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
25fd0 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
25fe0 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
25ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
26000 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
26010 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
26020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26030 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
26040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26080 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
26090 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
260a0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
260b0 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
260c0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
260d0 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
260e0 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
260f0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
26100 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
26110 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
26120 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
26130 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
26140 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
26150 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
26160 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
26170 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
26180 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
26190 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
261a0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
261b0 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
261c0 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
261d0 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
261e0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
261f0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
26200 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
26210 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
26220 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
26230 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
26240 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
26250 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
26260 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
26270 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
26280 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
26290 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
262a0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
262b0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
262c0 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
262d0 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
262e0 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
262f0 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
26300 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
26310 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
26320 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
26330 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
26340 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
26350 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
26360 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
26370 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
26380 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
26390 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
263a0 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
263b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
263c0 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
263d0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
263e0 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
263f0 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
26400 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
26410 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
26420 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
26430 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
26440 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
26450 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
26460 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
26470 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
26480 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
26490 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
264a0 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
264b0 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
264c0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
264d0 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
264e0 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
264f0 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
26500 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
26510 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
26520 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26530 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
26540 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
26550 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
26560 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
26570 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
26580 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
26590 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
265a0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
265b0 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
265c0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
265d0 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
265e0 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
265f0 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
26600 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
26610 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
26620 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
26630 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
26640 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
26650 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
26660 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
26670 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
266d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
267e0 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
267f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26800 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26830 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26850 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
26880 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
268a0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
268d0 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268f0 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
26920 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
26930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26940 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
26970 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
26980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
26990 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
269a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
269b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
269c0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
269d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
269e0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
26a10 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
26a20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
26a30 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
26a60 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
26a70 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
26a80 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
26a90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
26aa0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
26ab0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
26ac0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
26ad0 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
26b00 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
26b10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
26b20 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
26b50 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
26b60 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
26b70 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
26ba0 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
26bb0 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
26bc0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
26bf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26c00 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c30 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
26c40 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
26c50 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26cd0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
26ce0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
26cf0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
26d00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
26d10 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
26d20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26d30 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
26d40 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
26d70 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
26e10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
26e20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
26e30 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
26e40 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
26e50 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
26e60 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
26e70 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
26e80 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
26e90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
26ea0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
26eb0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
26ec0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
26ed0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
26ee0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
26ef0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
26f00 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
26f10 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
26f20 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
26f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26f40 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
26f50 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
26f60 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
26f70 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
26f80 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
26f90 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
26fc0 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
26fd0 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
26fe0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
26ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
27000 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
27010 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
27020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
27030 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
27040 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
27050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
27060 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
27070 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
27080 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
27090 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
270a0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
270b0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
270c0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
270d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
270e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
270f0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
27100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
27110 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
27120 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
27130 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
27140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
27150 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
27160 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
27170 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
27180 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
27190 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
271a0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
271b0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
271c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
271d0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
271e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
271f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
27200 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
27210 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
27220 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
27230 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
27240 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
27250 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
27260 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
27270 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
27280 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
27290 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
272a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
272b0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
272e0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
272f0 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
27300 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
27310 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
27320 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
27330 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
27340 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
27350 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
27360 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
27370 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
27380 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
27390 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
273a0 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
273b0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
273c0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
273d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
273e0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
273f0 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
27400 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
27410 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27420 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
27430 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
27440 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
27450 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
27460 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
27470 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
274a0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
274b0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
274c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
274d0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
274e0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
274f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27500 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
27510 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
27520 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
27530 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
27540 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
27550 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
27560 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
27570 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
27580 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
27590 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
275a0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
275b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
275c0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
275d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
275e0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
275f0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
27600 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
27610 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
27620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27630 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
27640 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
27650 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
27660 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
27670 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
27680 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
27690 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
276a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
276b0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
276c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
276d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
276e0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
276f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
27700 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
27710 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
27720 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
27730 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
27740 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
27750 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
27760 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
27770 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
27780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27790 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
277a0 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
277b0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
277c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
277d0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
277e0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
27810 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
27820 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
27850 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27870 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
27880 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
278a0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
278b0 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
278c0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
278d0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
278e0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
278f0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
27900 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
27910 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
27920 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
27930 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
27940 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
27950 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
27960 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
27970 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
27980 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
27990 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
279a0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
279b0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
279c0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
279d0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
279e0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
279f0 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
27a00 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
27a10 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
27a20 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
27a30 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
27a40 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
27a50 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
27a60 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
27a70 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
27a80 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
27a90 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
27aa0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
27ab0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
27ac0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
27ad0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
27ae0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
27af0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
27b00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
27b10 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
27b20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
27b30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
27b40 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
27b50 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
27b60 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
27b70 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
27b80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
27b90 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
27ba0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
27bb0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
27bc0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
27bd0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
27be0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
27bf0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
27c00 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
27c10 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
27c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
27c30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27c40 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
27c50 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
27c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
27c70 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
27c80 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
27c90 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
27ca0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
27cb0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
27cc0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
27cd0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
27ce0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
27cf0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
27d00 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
27d10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
27d20 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
27d30 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
27d40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
27d50 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
27d60 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
27d70 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
27d80 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
27d90 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
27da0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
27db0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
27dc0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
27dd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
27de0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
27df0 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e10 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
27e20 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
27e30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
27e40 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
27e50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27e60 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
27e90 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
27ea0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
27eb0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
27ec0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
27ed0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
27ee0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
27ef0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
27f00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
27f10 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
27f20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
27f30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
27f40 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
27f50 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
27f60 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
27f70 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
27f80 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
27f90 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
27fa0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
27fb0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
27fc0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
27fd0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
27fe0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
27ff0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
28000 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
28010 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28020 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
28030 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
28040 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
28050 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
28060 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
28070 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
28080 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
28090 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
280a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
280b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
280c0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
280d0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
280e0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
280f0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
28100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28110 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
28120 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
28130 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
28140 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
28150 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
28160 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
28170 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
28180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
28190 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
281a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
281b0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
281c0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
281d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
281e0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
281f0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
28200 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
28210 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
28220 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
28230 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
28240 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
28250 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
28260 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
28270 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
28280 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
28290 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
282a0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
282b0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
282c0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
282d0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
282e0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
282f0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
28300 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
28310 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
28320 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
28330 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
28340 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
28350 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
28360 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
28370 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
28380 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
28390 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
283a0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
283b0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
283c0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
283d0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
283e0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
283f0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
28400 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
28410 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
28420 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
28430 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
28440 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
28450 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
28460 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
28470 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
28480 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
28490 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
284a0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
284b0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
284c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
284d0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
284e0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
284f0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
28500 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
28510 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
28520 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
28530 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
28540 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
28550 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
28560 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
28570 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
28580 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
28590 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
285a0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
285b0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
285c0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
285d0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
285e0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
285f0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
28600 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
28610 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
28620 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
28630 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
28640 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
28650 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28660 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
28670 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
28680 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
28690 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
286a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
286b0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
286c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
286d0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
286e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
286f0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
28700 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
28710 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
28720 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
28730 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
28740 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
28750 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
28760 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
28770 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
28780 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
28790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
287a0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
287b0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
287c0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
287d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
287e0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
287f0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
28800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28810 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
28820 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
28830 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
28840 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
28850 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
28860 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
28870 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
28880 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
28890 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
288a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
288b0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
288c0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
288d0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
288e0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
288f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28900 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
28910 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
28920 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
28930 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
28940 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
28950 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
28960 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
28970 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
28980 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
28990 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
289a0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
289b0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
289c0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
289d0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
289e0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
289f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
28a00 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
28a10 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
28a20 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
28a30 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
28a40 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
28a50 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
28a60 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
28a70 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
28a80 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
28a90 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
28aa0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
28ab0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
28ac0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
28ad0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
28ae0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
28af0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
28b00 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
28b10 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
28b20 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
28b30 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
28b40 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
28b50 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
28b60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28b70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
28b80 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
28b90 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
28ba0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
28bb0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
28bc0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
28bd0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
28be0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28bf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
28c00 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
28c10 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
28c20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
28c30 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
28c40 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
28c50 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
28c60 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
28c70 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
28c80 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
28c90 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
28ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ce0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
28cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
28d10 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
28d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d30 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
28d40 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
28d50 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
28d60 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
28d70 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
28d80 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
28d90 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
28da0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
28db0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
28dc0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
28dd0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
28de0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
28df0 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
28e00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28e10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28e20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
28e30 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
28e40 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
28e50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28e60 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
28e70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
28e80 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
28e90 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
28ea0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
28eb0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
28ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
28ed0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
28ee0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
28ef0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
28f00 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
28f10 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
28f20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
28f30 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
28f40 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28f50 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
28f60 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
28f70 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
28f80 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
28f90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28fa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
28fb0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
28fc0 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
28fd0 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
28fe0 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
28ff0 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
29000 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
29010 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
29020 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
29030 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
29040 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
29050 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
29060 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
29070 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
29080 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
29090 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
290a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
290b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
290c0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
290d0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
290e0 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
290f0 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
29100 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
29110 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
29120 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
29130 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
29140 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
29150 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
29160 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
29170 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
29180 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
29190 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
291a0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
291b0 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
291c0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
291d0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
291e0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
291f0 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
29200 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
29210 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
29220 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
29230 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
29240 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
29250 61 67 73 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ags;.  if( sqlit
29260 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
29270 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
29280 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
29290 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
292c0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
292d0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
292e0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
292f0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
29300 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
29310 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
29320 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
29330 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
29340 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
29350 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
29360 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
29370 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
29380 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
29390 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
293a0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
293b0 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
293c0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
293d0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
293e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
293f0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
29400 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
29410 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
29420 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
29430 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
29440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
29450 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
29460 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
29470 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
29480 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
29490 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
294a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
294b0 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
294c0 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
294d0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
294e0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
294f0 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
29500 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
29510 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
29520 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
29530 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
29540 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
29550 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
29560 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
29570 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
29580 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
29590 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
295a0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
295b0 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
295c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
295d0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
295e0 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
295f0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29600 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29610 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29620 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
29630 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
29640 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
29650 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
29660 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
29670 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
29680 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
29690 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
296a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
296b0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
296c0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
296d0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
296e0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
296f0 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
29700 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
29710 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
29720 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
29730 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
29740 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
29750 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
29760 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
29770 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
29780 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
29790 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
297a0 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
297b0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
297c0 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
297d0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
297e0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
297f0 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
29800 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
29810 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
29820 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
29830 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
29840 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
29850 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
29860 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
29870 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
29880 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
29890 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
298a0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
298b0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
298c0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
298d0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
298e0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
298f0 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
29900 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
29910 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
29920 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
29930 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
29940 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
29950 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
29960 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
29970 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
29980 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
29990 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
299a0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
299b0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
299c0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
299d0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
299e0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
299f0 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
29a00 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
29a10 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
29a20 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
29a30 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
29a40 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
29a50 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
29a60 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
29a70 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
29a80 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
29a90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29aa0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
29ab0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
29ac0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
29ad0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
29ae0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
29af0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
29b00 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
29b10 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
29b20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
29b30 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
29b40 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
29b50 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
29b60 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
29b70 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
29b80 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
29b90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
29ba0 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
29bb0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
29bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
29bd0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29bf0 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
29c00 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
29c10 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
29c20 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
29c30 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
29c40 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
29c50 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
29c60 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
29c70 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
29c80 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
29c90 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
29ca0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
29cb0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
29cc0 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
29cd0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
29ce0 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
29cf0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
29d00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
29d10 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
29d20 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
29d30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29d50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29d60 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
29d70 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
29d80 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
29d90 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
29da0 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
29db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29dc0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
29dd0 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
29de0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
29df0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
29e00 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
29e10 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
29e20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
29e30 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
29e40 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
29e50 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
29e60 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
29e70 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
29e80 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
29e90 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
29ea0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
29eb0 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
29ec0 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
29ed0 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
29ee0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
29ef0 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
29f00 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
29f10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
29f20 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
29f30 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
29f40 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
29f50 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
29f60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29f70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29f80 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
29f90 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
29fa0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
29fb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
29fc0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
29fd0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
29fe0 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
29ff0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2a000 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2a010 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2a020 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2a030 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2a040 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2a050 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2a060 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2a070 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2a080 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2a090 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2a0a0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2a0b0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2a0c0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2a0d0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2a0e0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2a0f0 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2a100 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2a110 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2a120 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2a130 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2a140 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2a150 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2a160 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2a170 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2a180 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2a1b0 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2a1c0 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2a1d0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2a1e0 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2a1f0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2a200 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2a210 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2a220 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2a230 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2a240 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2a250 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2a260 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2a270 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2a280 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2a290 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2a2a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2a2b0 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
2a2c0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
2a2d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2a2e0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2a2f0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e  }.#endif.  .  pN
2a300 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ew->lastErrno = 
2a310 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  0;.#if OS_VXWORK
2a320 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2a330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2a340 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2a350 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2a360 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2a370 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2a380 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2a390 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
2a3a0 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65    }.  if( isDele
2a3b0 74 65 20 29 20 70 4e 65 77 2d 3e 63 74 72 6c 46  te ) pNew->ctrlF
2a3c0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2a3d0 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
2a3e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a3f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2a400 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2a410 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2a420 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
2a430 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
2a440 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
2a450 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
2a460 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  er(+1);.  }.  re
2a470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a480 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
2a490 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
2a4a0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
2a4b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2a4c0 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
2a4d0 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
2a4e0 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
2a4f0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
2a500 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2a510 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
2a520 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
2a530 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
2a540 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
2a550 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
2a560 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
2a570 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
2a580 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
2a590 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
2a5a0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
2a5b0 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
2a5c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
2a5d0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
2a5e0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
2a5f0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
2a600 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
2a610 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2a620 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
2a630 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
2a640 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
2a650 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
2a660 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
2a670 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
2a680 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
2a690 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
2a6a0 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
2a6b0 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
2a6c0 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
2a6d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a6e0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
2a6f0 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
2a700 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
2a710 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
2a720 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
2a730 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2a740 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
2a750 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
2a760 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
2a770 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
2a780 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
2a790 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
2a7a0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
2a7b0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
2a7c0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
2a7d0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
2a7e0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
2a7f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2a800 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
2a810 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2a820 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2a830 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
2a840 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
2a850 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
2a860 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
2a870 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
2a880 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
2a890 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
2a8a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
2a8b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2a8c0 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
2a8d0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
2a8e0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
2a8f0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
2a900 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
2a910 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
2a920 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
2a930 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
2a940 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
2a950 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
2a960 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
2a970 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2a980 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2a990 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
2a9a0 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
2a9b0 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
2a9c0 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
2a9d0 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
2a9e0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
2a9f0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
2aa00 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
2aa10 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
2aa20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
2aa30 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
2aa40 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
2aa50 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
2aa60 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
2aa70 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2aa80 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
2aa90 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
2aaa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2aab0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
2aac0 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
2aad0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38  snprintf(nBuf-18
2aae0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
2aaf0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
2ab00 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
2ab10 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
2ab20 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
2ab30 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
2ab40 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
2ab50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
2ab60 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
2ab70 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
2ab80 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
2ab90 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
2aba0 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
2abb0 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
2abc0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
2abd0 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20      zBuf[j+1] = 
2abe0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
2abf0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2ac00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2ac10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2ac20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ac30 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2ac40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ac50 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2ac60 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2ac70 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2ac80 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2ac90 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2aca0 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2acb0 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2acc0 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2acd0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2ace0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2acf0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2ad00 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2ad10 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2ad20 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2ad30 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2ad40 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2ad50 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2ad60 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2ad70 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2ad80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2ad90 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2ada0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2adb0 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2adc0 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2add0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2ade0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2adf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2ae00 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2ae10 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2ae20 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2ae30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2ae40 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2ae50 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2ae60 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2ae70 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2ae80 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2ae90 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2aea0 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2aeb0 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2aec0 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2aed0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2aee0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2aef0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2af00 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2af10 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2af20 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2af30 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2af40 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2af50 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2af60 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2af70 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2af80 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2af90 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2afa0 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2afb0 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2afc0 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2afd0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2afe0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2aff0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2b000 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2b010 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2b020 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2b030 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2b040 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2b050 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2b060 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2b070 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2b080 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2b090 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2b0a0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2b0b0 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2b0c0 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2b0d0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2b0e0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2b0f0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2b100 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2b110 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2b120 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2b130 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2b140 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2b150 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2b160 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2b170 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2b180 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2b190 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2b1a0 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2b1b0 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2b1c0 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2b1d0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2b1e0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2b1f0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2b200 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2b210 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2b220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2b230 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2b240 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
2b250 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2b260 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2b270 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2b280 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2b290 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2b2a0 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2b2b0 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2b2c0 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2b2d0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2b2e0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2b2f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2b300 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2b310 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2b320 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2b330 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2b340 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2b350 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2b360 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2b370 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2b380 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2b390 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2b3a0 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2b3b0 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2b3c0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2b3d0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2b3e0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2b3f0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2b400 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2b410 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
2b420 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2b430 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
2b440 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2b450 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2b460 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2b470 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2b480 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2b490 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
2b4a0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
2b4b0 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
2b4c0 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
2b4d0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
2b4e0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
2b4f0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
2b500 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
2b510 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2b520 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2b530 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2b540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2b550 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2b560 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2b570 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2b580 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2b590 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2b5a0 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2b5b0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2b5c0 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2b5d0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2b5e0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2b5f0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2b600 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2b610 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2b620 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2b630 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2b640 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2b650 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2b660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2b670 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2b680 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2b690 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2b6a0 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
2b6b0 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
2b6c0 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
2b6d0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2b6e0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2b6f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
2b700 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
2b710 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
2b720 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
2b730 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
2b740 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
2b750 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
2b760 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b770 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
2b780 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
2b790 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2b7a0 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
2b7b0 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
2b7c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20  ..**.** In most 
2b7d0 63 61 73 65 73 20 63 61 73 65 73 2c 20 74 68 69  cases cases, thi
2b7e0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a  s routine sets *
2b7f0 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63  pMode to 0, whic
2b800 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a  h will become.**
2b810 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
2b820 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20  o robust_open() 
2b830 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69  to create the fi
2b840 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49  le using.** SQLI
2b850 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2b860 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75  PERMISSIONS adju
2b870 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  sted by the umas
2b880 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  k..** But if the
2b890 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2b8a0 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72  ed is a WAL or r
2b8b0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2b8c0 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ile, then .** th
2b8d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  is function quer
2b8e0 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ies the file-sys
2b8f0 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d  tem for the perm
2b900 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a  issions on the .
2b910 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2b920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2b930 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  nd sets *pMode t
2b940 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  o this value. Wh
2b950 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69  enever .** possi
2b960 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75  ble, WAL and jou
2b970 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63  rnal files are c
2b980 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
2b990 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
2b9a0 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73  s .** as the ass
2b9b0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2b9c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2b9d0 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2b9e0 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69  E_8_3_NAMES opti
2b9f0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2ba00 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  hen the.** origi
2ba10 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
2ba20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  unavailable.  Bu
2ba30 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f  t 8_3_NAMES is o
2ba40 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
2ba50 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20  FAT filesystems 
2ba60 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  and permissions 
2ba70 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68  do not matter th
2ba80 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65  ere, so just use
2ba90 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
2baa0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  permissions..*/.
2bab0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
2bac0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
2bad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2bae0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
2baf0 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
2bb00 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
2bb10 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
2bb20 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb40 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
2bb50 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
2bb60 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
2bb70 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb90 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
2bba0 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
2bbb0 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20  with */.  uid_t 
2bbc0 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2bbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2bbe0 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : uid to set on 
2bbf0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69  the file */.  gi
2bc00 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc20 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74   OUT: gid to set
2bc30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2bc40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2bc50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2bc60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2bc70 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20  ode */.  *pMode 
2bc80 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30  = 0;.  *pUid = 0
2bc90 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20  ;.  *pGid = 0;. 
2bca0 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
2bcb0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2bcc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2bcd0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
2bce0 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
2bcf0 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
2bd00 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
2bd10 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
2bd20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2bd30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bd40 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
2bd50 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
2bd60 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2bd70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bd80 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
2bd90 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
2bda0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
2bdb0 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
2bdc0 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
2bdd0 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
2bde0 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
2bdf0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
2be00 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
2be10 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2be20 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
2be30 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
2be40 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
2be50 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
2be60 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
2be70 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
2be80 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2be90 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2bea0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
2beb0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2bec0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
2bed0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2bee0 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
2bef0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
2bf00 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61  e NN is a decima
2bf10 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
2bf20 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
2bf30 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
2bf40 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
2bf50 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
2bf60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
2bf70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2bf80 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23  0(zPath) - 1; .#
2bf90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2bfa0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20  BLE_8_3_NAMES.  
2bfb0 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26    while( nDb>0 &
2bfc0 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d  & sqlite3Isalnum
2bfd0 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e  (zPath[nDb]) ) n
2bfe0 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44  Db--;.    if( nD
2bff0 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44  b==0 || zPath[nD
2c000 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e  b]!='-' ) return
2c010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
2c020 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61  e.    while( zPa
2c030 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a  th[nDb]!='-' ){.
2c040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44        assert( nD
2c050 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  b>0 );.      ass
2c060 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ert( zPath[nDb]!
2c070 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e  ='\n' );.      n
2c080 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Db--;.    }.#end
2c090 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  if.    memcpy(zD
2c0a0 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a  b, zPath, nDb);.
2c0b0 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27      zDb[nDb] = '
2c0c0 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d  \0';..    if( 0=
2c0d0 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53  =osStat(zDb, &sS
2c0e0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
2c0f0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
2c100 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
2c110 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74     *pUid = sStat
2c120 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a  .st_uid;.      *
2c130 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pGid = sStat.st_
2c140 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gid;.    }else{.
2c150 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c160 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
2c170 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2c180 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2c190 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2c1a0 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
2c1b0 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72   = 0600;.  }.  r
2c1c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c1d0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
2c1e0 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
2c1f0 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
2c200 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
2c210 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
2c220 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
2c230 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
2c240 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2c250 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
2c260 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2c270 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
2c280 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2c290 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2c2a0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
2c2b0 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
2c2c0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2c2d0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
2c2e0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
2c2f0 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
2c300 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
2c310 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
2c320 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
2c330 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
2c340 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
2c350 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
2c360 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
2c370 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
2c380 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
2c390 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
2c3a0 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
2c3b0 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
2c3c0 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
2c3d0 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
2c3e0 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
2c3f0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2c400 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
2c410 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
2c420 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
2c430 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
2c440 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
2c450 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
2c460 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
2c470 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
2c480 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
2c490 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
2c4a0 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
2c4b0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
2c4c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2c4d0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
2c4e0 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
2c4f0 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
2c500 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
2c510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2c520 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
2c530 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
2c540 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
2c550 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2c560 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
2c570 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
2c580 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
2c590 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
2c5a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2c5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
2c5c0 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
2c5d0 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
2c5e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
2c5f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
2c600 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
2c610 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
2c620 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
2c630 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
2c640 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
2c650 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
2c660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c670 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2c680 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
2c690 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
2c6a0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
2c6b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c6c0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
2c6d0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
2c6e0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
2c6f0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
2c700 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
2c710 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
2c720 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
2c730 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c740 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
2c750 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
2c760 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c770 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2c780 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
2c790 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2c7a0 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20   ctrlFlags = 0; 
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2c7c0 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
2c7d0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
2c7e0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
2c7f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
2c800 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
2c810 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
2c820 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2c830 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2c840 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
2c850 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2c860 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
2c870 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
2c880 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
2c890 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2c8a0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
2c8b0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
2c8c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2c8d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
2c8e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2c8f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c900 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
2c910 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
2c920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2c930 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23  PROXY);.#endif.#
2c940 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2c950 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2c960 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c970 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
2c980 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e  atfs fsInfo;.#en
2c990 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
2c9a0 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
2c9b0 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
2c9c0 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
2c9d0 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
2c9e0 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
2c9f0 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
2ca00 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
2ca10 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
2ca20 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
2ca30 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
2ca40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ca50 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
2ca60 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
2ca70 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  .  */.  int sync
2ca80 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20  Dir = (isCreate 
2ca90 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
2caa0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2cab0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
2cac0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2cad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2cae0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2caf0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2cb00 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20  PEN_WAL.  ));.. 
2cb10 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
2cb20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
2cb30 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2cb40 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
2cb50 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
2cb60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2cb70 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
2cb80 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
2cb90 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
2cba0 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
2cbb0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
2cbc0 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
2cbd0 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
2cbe0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
2cbf0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
2cc00 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
2cc10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
2cc20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
2cc30 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
2cc40 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
2cc50 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
2cc60 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
2cc70 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
2cc80 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
2cc90 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
2cca0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
2ccb0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
2ccc0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2ccd0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2cce0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
2ccf0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
2cd00 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
2cd10 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2cd20 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
2cd30 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
2cd40 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
2cd50 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
2cd60 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
2cd70 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
2cd80 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
2cd90 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
2cda0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
2cdb0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2cdc0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
2cdd0 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
2cde0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
2cdf0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
2ce00 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
2ce10 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
2ce20 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
2ce30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
2ce40 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
2ce50 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
2ce60 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
2ce70 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2ce80 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ce90 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2cea0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
2ceb0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2cec0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ced0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2cee0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2cef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2cf00 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2cf10 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2cf20 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2cf30 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
2cf40 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2cf50 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2cf60 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2cf70 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
2cf80 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
2cf90 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
2cfa0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
2cfb0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
2cfc0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
2cfd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2cfe0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
2cff0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2d000 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
2d010 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2d020 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d030 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
2d040 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2d050 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
2d060 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2d070 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2d080 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2d090 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2d0a0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
2d0b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2d0c0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
2d0d0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
2d0e0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
2d0f0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
2d100 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
2d110 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
2d120 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2d130 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
2d140 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2d150 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
2d160 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
2d170 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
2d180 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
2d190 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
2d1a0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
2d1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
2d1c0 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
2d1d0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
2d1e0 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
2d1f0 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
2d200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d210 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2d220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
2d230 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
2d240 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61  ed;..    /* Data
2d250 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
2d260 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
2d270 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
2d280 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a  y are not.    **
2d290 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
2d2a0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
2d2b0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
2d2c0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
2d2d0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
2d2e0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2d2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
2d300 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2d310 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b  N_URI) || zName[
2d320 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
2d330 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20  ==0 );..  }else 
2d340 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
2d350 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
2d360 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
2d370 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
2d380 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
2d390 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2d3a0 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
2d3b0 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
2d3c0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
2d3d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20  MAX_PATHNAME+2, 
2d3e0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
2d3f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d400 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d410 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
2d420 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
2d430 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2d440 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2d450 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
2d460 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
2d470 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
2d480 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
2d490 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2d4a0 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2d4b0 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
2d4c0 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
2d4d0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
2d4e0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
2d4f0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2d500 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
2d510 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
2d520 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
2d530 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
2d540 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
2d550 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2d560 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
2d570 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2d580 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
2d590 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
2d5a0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
2d5b0 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
2d5c0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
2d5d0 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
2d5e0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
2d5f0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2d600 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
2d610 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
2d620 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
2d630 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
2d640 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2d650 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
2d660 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
2d670 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
2d680 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
2d690 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
2d6a0 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
2d6b0 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
2d6c0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
2d6d0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
2d6e0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
2d6f0 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
2d700 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
2d710 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d730 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
2d740 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
2d750 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
2d760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
2d770 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
2d780 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
2d790 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2d7a0 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
2d7b0 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
2d7c0 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
2d7d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d7e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2d7f0 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
2d800 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2d810 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2d820 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2d830 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2d840 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
2d850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d860 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2d870 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2d880 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2d890 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
2d8a0 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
2d8b0 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
2d8c0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
2d8d0 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2d8e0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
2d8f0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
2d900 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
2d910 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
2d920 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
2d930 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d940 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
2d950 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
2d960 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
2d970 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2d980 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2d990 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
2d9a0 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
2d9b0 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
2d9c0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
2d9d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2d9e0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2d9f0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2da00 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
2da10 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
2da20 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2da30 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2da40 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
2da50 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2da60 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2da70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2da80 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
2da90 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
2daa0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2dab0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
2dac0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
2dad0 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
2dae0 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
2daf0 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
2db00 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2db10 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
2db20 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
2db30 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
2db40 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
2db50 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
2db60 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
2db70 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
2db80 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
2db90 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2dba0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2dbb0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2dbc0 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64       osFchown(fd
2dbd0 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20  , uid, gid);.   
2dbe0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2dbf0 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
2dc00 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
2dc10 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
2dc20 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
2dc30 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  p->pUnused ){.  
2dc40 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64    p->pUnused->fd
2dc50 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55   = fd;.    p->pU
2dc60 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66  nused->flags = f
2dc70 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
2dc80 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
2dc90 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2dca0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
2dcb0 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  else.    osUnlin
2dcc0 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
2dcd0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2dce0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2dcf0 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
2dd00 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20   p->openFlags = 
2dd10 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
2dd20 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
2dd30 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
2dd40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
2dd50 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
2dd60 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2dd70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2dd80 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
2dd90 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
2dda0 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2ddb0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2ddc0 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  e)->lastErrno = 
2ddd0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73  errno;.    robus
2dde0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2ddf0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
2de00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2de10 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
2de20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
2de30 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
2de40 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
2de50 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
2de60 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
2de70 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
2de80 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
2de90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2dea0 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72  * Set up appropr
2deb0 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a  iate ctrlFlags *
2dec0 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  /.  if( isDelete
2ded0 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2dee0 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2def0 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
2df00 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
2df10 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2df20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2df30 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  XFILE_RDONLY;.  
2df40 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20  if( noLock )    
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2df60 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2df70 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66  ILE_NOLOCK;.  if
2df80 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20 20  ( syncDir )     
2df90 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2dfa0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2dfb0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28  E_DIRSYNC;.  if(
2dfc0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2dfd0 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46  OPEN_URI ) ctrlF
2dfe0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2dff0 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54  _URI;..#if SQLIT
2e000 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2e010 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54  _STYLE.#if SQLIT
2e020 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2e030 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50  OCKING.  isAutoP
2e040 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  roxy = 1;.#endif
2e050 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f  .  if( isAutoPro
2e060 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55  xy && (zPath!=NU
2e070 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29  LL) && (!noLock)
2e080 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20   && pVfs->xOpen 
2e090 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76  ){.    char *env
2e0a0 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22  force = getenv("
2e0b0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2e0c0 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20  XY_LOCKING");.  
2e0d0 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d    int useProxy =
2e0e0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49   0;..    /* SQLI
2e0f0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2e100 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20  OCKING==1 means 
2e110 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65  force always use
2e120 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20   proxy, 0 means 
2e130 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73  .    ** never us
2e140 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65  e proxy, NULL me
2e150 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f  ans use proxy fo
2e160 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  r non-local file
2e170 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  s only.  */.    
2e180 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
2e190 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
2e1a0 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
2e1b0 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
2e1c0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  se{.      if( st
2e1d0 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
2e1e0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2e1f0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
2e200 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
2e210 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
2e220 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
2e230 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
2e240 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
2e250 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2e260 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
2e270 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
2e280 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
2e290 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
2e2a0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
2e2b0 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
2e2c0 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
2e2d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
2e2e0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
2e2f0 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
2e300 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
2e310 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
2e320 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
2e330 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
2e340 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
2e350 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
2e360 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
2e370 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
2e380 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2e390 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
2e3a0 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
2e3b0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
2e3c0 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
2e3d0 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
2e3e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2e3f0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  rno;.        rob
2e400 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2e410 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2e420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e430 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
2e440 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2e450 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
2e460 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
2e470 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
2e480 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
2e490 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
2e4a0 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
2e4b0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
2e4c0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
2e4d0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
2e4e0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
2e4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e500 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e510 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2e520 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
2e530 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
2e540 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
2e550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e560 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
2e570 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
2e580 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
2e590 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
2e5a0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
2e5b0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2e5c0 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
2e5d0 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
2e5e0 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
2e5f0 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
2e600 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
2e610 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
2e620 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
2e630 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
2e640 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
2e650 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
2e660 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
2e670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e690 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
2e6a0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2e6b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2e6c0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
2e6d0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2e6e0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2e6f0 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e  trlFlags);..open
2e700 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
2e710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2e730 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
2e740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e750 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
2e760 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
2e770 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
2e780 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
2e790 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
2e7a0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
2e7b0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
2e7c0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
2e7d0 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
2e7e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2e7f0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
2e800 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
2e810 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
2e820 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
2e830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2e840 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
2e850 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2e860 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
2e870 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
2e880 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2e890 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
2e8a0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
2e8b0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
2e8c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e8d0 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
2e8e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2e8f0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2e900 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
2e910 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
2e920 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
2e930 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a  zPath)==(-1) ){.
2e940 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
2e950 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72  NOENT ){.      r
2e960 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2e970 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20  _DELETE_NOENT;. 
2e980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e990 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2e9a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2e9b0 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
2e9c0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
2e9d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e9e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2e9f0 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2ea00 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20  .  if( (dirSync 
2ea10 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  & 1)!=0 ){.    i
2ea20 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
2ea30 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
2ea40 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
2ea50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ea60 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
2ea70 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
2ea80 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
2ea90 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
2eaa0 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
2eab0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
2eac0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2ead0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2eae0 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79  _DIR_FSYNC, "fsy
2eaf0 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nc", zPath);.   
2eb00 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73     }.      robus
2eb10 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
2eb20 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65  _LINE__);.    }e
2eb30 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2eb40 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
2eb50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2eb60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
2eb70 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
2eb80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
2eb90 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
2eba0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
2ebb0 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
2ebc0 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
2ebd0 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
2ebe0 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
2ebf0 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
2ec00 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2ec10 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
2ec20 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
2ec30 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
2ec40 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2ec50 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
2ec60 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
2ec70 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
2ec80 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
2ec90 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
2eca0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
2ecb0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
2ecc0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
2ecd0 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
2ece0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2ecf0 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
2ed00 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2ed10 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
2ed20 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
2ed30 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
2ed40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2ed50 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
2ed60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
2ed70 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
2ed80 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2ed90 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
2eda0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
2edb0 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
2edc0 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
2edd0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
2ede0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
2edf0 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
2ee00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
2ee10 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
2ee20 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2ee30 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2ee40 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2ee50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
2ee60 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
2ee70 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
2ee80 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2ee90 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
2eea0 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
2eeb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2eec0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2eed0 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
2eee0 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
2eef0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
2ef00 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2ef10 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
2ef20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
2ef30 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2ef40 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2ef50 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
2ef60 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
2ef70 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
2ef80 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73  esOut = (osAcces
2ef90 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
2efa0 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  =0);.  if( flags
2efb0 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
2efc0 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f  EXISTS && *pResO
2efd0 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ut ){.    struct
2efe0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69   stat buf;.    i
2eff0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
2f000 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
2f010 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  .st_size==0 ){. 
2f020 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20       *pResOut = 
2f030 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2f040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f050 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
2f060 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2f070 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
2f080 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65  pathname. The re
2f090 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69  lative path.** i
2f0a0 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75  s stored as a nu
2f0b0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
2f0c0 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65  ing in the buffe
2f0d0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
2f0e0 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a  ** zPath. .**.**
2f0f0 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20   zOut points to 
2f100 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
2f110 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  east sqlite3_vfs
2f120 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  .mxPathname byte
2f130 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63  s .** (in this c
2f140 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d  ase, MAX_PATHNAM
2f150 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75  E bytes). The fu
2f160 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74  ll-path is writt
2f170 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75  en to.** this bu
2f180 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
2f190 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
2f1a0 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74   int unixFullPat
2f1b0 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
2f1c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2f1d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2f1e0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2f1f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2f200 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2f210 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
2f220 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
2f230 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  th */.  int nOut
2f240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f250 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2f260 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2f270 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
2f280 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20  r *zOut         
2f290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2f2a0 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
2f2b0 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  {..  /* It's odd
2f2c0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2f2d0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2f2e0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2f2f0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2f300 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2f310 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2f320 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2f330 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2f340 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2f350 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
2f360 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
2f370 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
2f380 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
2f390 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
2f3a0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
2f3b0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
2f3c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2f3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2f3e0 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
2f3f0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2f400 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
2f410 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2f420 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a  ETER(pVfs);..  z
2f430 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c  Out[nOut-1] = '\
2f440 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  0';.  if( zPath[
2f450 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
2f460 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2f470 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
2f480 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  , zPath);.  }els
2f490 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b  e{.    int nCwd;
2f4a0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77  .    if( osGetcw
2f4b0 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d  d(zOut, nOut-1)=
2f4c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2f4d0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
2f4e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2f4f0 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20  BKPT, "getcwd", 
2f500 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
2f510 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74    nCwd = (int)st
2f520 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20  rlen(zOut);.    
2f530 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f540 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75  (nOut-nCwd, &zOu
2f550 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20  t[nCwd], "/%s", 
2f560 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65  zPath);.  }.  re
2f570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f580 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2f590 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2f5a0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2f5b0 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2f5c0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2f5d0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2f5e0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2f5f0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2f600 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2f610 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2f620 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
2f630 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
2f640 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
2f650 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2f660 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
2f670 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2f680 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
2f690 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2f6a0 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
2f6b0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
2f6c0 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
2f6d0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
2f6e0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2f6f0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
2f700 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
2f710 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
2f720 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
2f730 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
2f740 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
2f750 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
2f760 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
2f770 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
2f780 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
2f790 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
2f7a0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
2f7b0 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
2f7c0 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
2f7d0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
2f7e0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
2f7f0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
2f800 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
2f810 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2f820 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
2f830 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2f840 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2f850 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
2f860 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
2f870 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2f880 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
2f890 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
2f8a0 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
2f8b0 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
2f8c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f8d0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
2f8e0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
2f8f0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
2f900 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
2f910 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
2f920 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
2f930 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
2f940 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
2f950 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
2f960 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
2f970 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
2f980 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
2f990 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
2f9a0 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
2f9b0 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
2f9c0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2f9d0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
2f9e0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
2f9f0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
2fa00 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
2fa10 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
2fa20 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2fa30 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
2fa40 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
2fa50 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
2fa60 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
2fa70 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
2fa80 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
2fa90 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
2faa0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
2fab0 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
2fac0 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
2fad0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
2fae0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
2faf0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2fb00 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
2fb10 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
2fb20 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
2fb30 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
2fb40 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
2fb50 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
2fb60 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
2fb70 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
2fb80 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
2fb90 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
2fba0 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
2fbb0 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
2fbc0 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
2fbd0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
2fbe0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
2fbf0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
2fc00 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
2fc10 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
2fc20 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
2fc30 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
2fc40 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
2fc50 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
2fc60 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
2fc70 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
2fc80 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
2fc90 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
2fca0 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
2fcb0 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
2fcc0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
2fcd0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
2fce0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2fcf0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
2fd00 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
2fd10 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
2fd20 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
2fd30 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
2fd40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
2fd50 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
2fd60 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2fd70 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2fd80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2fd90 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
2fda0 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
2fdb0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
2fdc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2fdd0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
2fde0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
2fdf0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
2fe00 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2fe10 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2fe20 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
2fe30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
2fe40 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
2fe50 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
2fe60 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
2fe70 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
2fe80 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
2fe90 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
2fea0 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
2feb0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2fec0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
2fed0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2fee0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2fef0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
2ff00 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
2ff10 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
2ff20 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
2ff30 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
2ff40 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
2ff50 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
2ff60 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
2ff70 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
2ff80 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
2ff90 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
2ffa0 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
2ffb0 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
2ffc0 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
2ffd0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
2ffe0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
2fff0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
30000 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
30010 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
30020 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
30030 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
30040 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
30050 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
30060 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
30070 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
30080 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
30090 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
300a0 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
300b0 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
300c0 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
300d0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
300e0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
300f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
30100 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
30110 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
30120 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
30130 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
30140 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
30150 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
30160 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
30170 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
30180 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
30190 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
301a0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
301b0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
301c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
301d0 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
301e0 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b  nt pid, fd, got;
301f0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
30200 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
30210 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
30220 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
30230 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
30240 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
30250 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
30260 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
30270 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
30280 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
30290 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
302a0 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
302b0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
302c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
302d0 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
302e0 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
302f0 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
30300 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
30310 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
30320 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
30330 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c  got = osRead(fd,
30340 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77   zBuf, nBuf); }w
30350 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
30360 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
30370 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
30380 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
30390 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
303a0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
303b0 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
303c0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
303d0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
303e0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
303f0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
30400 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
30410 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
30420 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
30430 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
30440 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
30450 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
30460 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
30470 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
30480 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
30490 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
304a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
304b0 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
304c0 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
304d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
304e0 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
304f0 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
30500 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
30510 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
30520 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
30530 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
30540 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
30550 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
30560 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
30570 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
30580 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
30590 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
305a0 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
305b0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
305c0 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
305d0 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
305e0 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
305f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
30600 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
30610 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
30620 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
30630 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
30640 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
30650 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
30660 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30670 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
30680 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
30690 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
306a0 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
306b0 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
306c0 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
306d0 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
306e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
306f0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
30700 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
30710 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
30720 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30730 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
30740 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
30750 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
30760 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
30770 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
30780 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
30790 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
307a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
307b0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
307c0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
307d0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
307e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
307f0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
30800 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
30810 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
30820 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
30830 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
30840 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
30850 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
30860 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
30870 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
30880 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
30890 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
308a0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
308b0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
308c0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
308d0 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
308e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
308f0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
30900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
30910 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
30920 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
30930 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
30940 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
30950 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
30960 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
30970 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
30980 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
30990 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
309a0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
309b0 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
309c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
309d0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
309e0 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
309f0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
30a00 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
30a10 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
30a20 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30a30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
30a40 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
30a50 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
30a60 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
30a70 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
30a80 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
30a90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30aa0 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  TE_OK;.#if defin
30ab0 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
30ac0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
30ad0 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
30ae0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
30af0 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
30b00 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
30b10 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
30b20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
30b30 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
30b40 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
30b50 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
30b60 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
30b70 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
30b80 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
30b90 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
30ba0 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
30bb0 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
30bc0 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65  w;.  if( gettime
30bd0 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d  ofday(&sNow, 0)=
30be0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  =0 ){.    *piNow
30bf0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
30c00 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
30c10 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
30c20 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
30c30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
30c40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
30c50 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OR;.  }.#endif..
30c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
30c70 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
30c80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
30c90 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
30ca0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
30cb0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
30cc0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
30cd0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
30ce0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30cf0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
30d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30d10 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
30d20 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
30d30 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
30d40 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
30d50 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
30d60 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
30d70 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
30d80 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
30d90 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
30da0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
30db0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
30dc0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
30dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30de0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
30df0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30e00 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
30e10 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
30e20 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
30e30 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
30e40 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
30e50 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
30e60 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
30e70 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
30e80 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
30e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30ea0 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74  /*.** We added t
30eb0 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
30ec0 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74  () method with t
30ed0 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20  he intention of 
30ee0 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74  providing.** bet
30ef0 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72  ter low-level er
30f00 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65  ror messages whe
30f10 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
30f20 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
30f30 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
30f40 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
30f50 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e   But so far, non
30f60 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65  e of that has be
30f70 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  en implemented.*
30f80 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20  * in the core.  
30f90 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  So this routine 
30fa0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
30fb0 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73    For now, it is
30fc0 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61   merely.** a pla
30fd0 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74  ce-holder..*/.st
30fe0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
30ff0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
31000 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31010 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
31020 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
31030 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31040 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
31050 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31060 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
31070 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31080 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
31090 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a   0;.}.../*.*****
310a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310b0 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
310c0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
310d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
310f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
31140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
31190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
311a0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
311b0 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
311c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
311d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
311e0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
311f0 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
31200 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
31210 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
31220 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
31230 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
31240 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
31250 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
31260 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
31270 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
31280 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
31290 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
312a0 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
312b0 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
312c0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
312d0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
312e0 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
312f0 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
31300 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
31310 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
31320 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
31330 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
31340 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
31350 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
31360 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
31370 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
31380 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
31390 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
313a0 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
313b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
313c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
313d0 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
313e0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
313f0 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
31400 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
31410 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
31420 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
31430 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
31440 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
31450 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
31460 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
31470 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
31480 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
31490 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
314a0 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
314b0 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
314c0 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
314d0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
314e0 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
314f0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
31500 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
31510 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
31520 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
31530 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
31540 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
31550 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
31560 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
31570 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
31580 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
31590 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
315a0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
315b0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
315c0 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
315d0 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
315e0 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
315f0 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
31600 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
31610 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
31620 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
31630 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
31640 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
31650 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
31660 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
31670 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
31680 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
31690 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
316a0 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
316b0 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
316c0 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
316d0 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
316e0 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
316f0 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
31700 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
31710 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
31720 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
31730 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
31740 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
31750 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
31760 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
31770 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
31780 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
31790 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
317a0 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
317b0 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
317c0 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
317d0 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
317e0 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
317f0 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
31800 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
31810 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
31820 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
31830 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
31840 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
31850 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
31860 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
31870 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
31880 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
31890 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
318a0 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
318b0 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
318c0 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
318d0 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
318e0 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
318f0 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
31900 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
31910 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
31920 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
31930 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
31940 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
31950 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
31960 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
31970 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
31980 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
31990 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
319a0 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
319b0 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
319c0 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
319d0 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
319e0 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
319f0 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
31a00 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
31a10 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
31a20 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
31a30 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
31a40 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
31a50 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
31a60 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
31a70 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
31a80 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
31a90 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
31aa0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
31ab0 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
31ac0 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
31ad0 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
31ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
31af0 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
31b00 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
31b10 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
31b20 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
31b30 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
31b60 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
31b70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
31b80 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
31b90 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
31ba0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
31bb0 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
31bc0 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
31bd0 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
31be0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
31bf0 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
31c00 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
31c10 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
31c20 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
31c30 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
31c40 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
31c50 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
31c60 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
31c70 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
31c80 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
31c90 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
31ca0 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
31cb0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
31cc0 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
31cd0 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
31ce0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
31cf0 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
31d00 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
31d10 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
31d20 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
31d30 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
31d40 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
31d50 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
31d60 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
31d70 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
31d80 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
31d90 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
31da0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
31db0 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
31dc0 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
31dd0 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
31de0 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
31df0 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
31e00 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
31e10 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
31e20 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
31e30 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
31e40 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
31e50 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
31e60 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
31e70 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
31e80 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
31e90 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
31ea0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
31eb0 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
31ec0 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
31ed0 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
31ee0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
31ef0 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
31f00 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
31f10 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
31f20 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
31f30 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
31f40 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
31f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
31f60 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
31f70 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
31f80 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
31f90 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
31fa0 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
31fb0 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
31fc0 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
31fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
31fe0 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
31ff0 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
32000 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
32010 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
32020 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
32030 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
32040 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
32050 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
32060 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
32070 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
32080 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
32090 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
320a0 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
320b0 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
320c0 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
320d0 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
320e0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
320f0 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
32100 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
32110 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
32120 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
32130 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
32140 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
32150 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
32160 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
32170 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
32180 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
32190 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
321a0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
321b0 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
321c0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
321d0 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
321e0 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
321f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
32200 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
32210 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
32220 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
32230 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
32240 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
32250 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
32260 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
32270 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
32280 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
32290 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
322a0 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
322b0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
322c0 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
322d0 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
322e0 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
322f0 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
32300 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
32310 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
32320 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
32330 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
32340 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
32350 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
32360 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
32370 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
32380 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
32390 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
323a0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
323b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
323c0 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
323d0 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
323e0 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
323f0 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
32400 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
32410 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32420 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
32430 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
32440 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
32450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
32460 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
32470 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
32480 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
32490 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
324a0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
324b0 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
324c0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
324d0 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
324e0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
324f0 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
32500 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
32510 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
32520 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
32530 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
32540 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
32550 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
32560 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
32570 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
32580 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
32590 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
325a0 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
325b0 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
325c0 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
325d0 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
325e0 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
325f0 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
32600 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
32610 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
32620 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
32630 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
32640 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
32650 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
32660 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
32670 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
32680 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
32690 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
326a0 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
326b0 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
326c0 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
326d0 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
326e0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
326f0 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
32700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32710 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
32720 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
32730 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
32740 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
32750 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
32760 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
32770 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
32780 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
32790 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
327a0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
327b0 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
327c0 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
327d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
327e0 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
327f0 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
32800 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
32810 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
32820 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
32830 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
32840 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
32850 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
32860 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
32870 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
32880 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
32890 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
328a0 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
328b0 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
328c0 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
328d0 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
328e0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
328f0 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
32900 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
32910 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
32920 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
32930 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
32940 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
32950 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
32960 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
32970 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
32980 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
32990 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
329a0 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
329b0 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
329c0 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
329d0 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
329e0 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
329f0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
32a00 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
32a10 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
32a20 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
32a30 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
32a40 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
32a50 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
32a60 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
32a70 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
32a80 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
32a90 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
32aa0 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
32ab0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
32ac0 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
32ad0 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
32ae0 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
32af0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
32b00 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
32b10 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
32b20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
32b30 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
32b40 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
32b50 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
32b60 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
32b70 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
32b80 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
32b90 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
32ba0 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
32bb0 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
32bc0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
32bd0 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
32be0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
32bf0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
32c00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32c10 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
32c20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
32c30 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
32c40 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
32c50 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
32c60 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
32c70 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
32c80 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
32c90 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
32ca0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
32cb0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
32cc0 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
32cd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
32ce0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
32cf0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
32d00 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
32d10 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
32d20 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
32d30 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
32d40 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
32d50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
32d60 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
32d70 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
32d80 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
32d90 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
32da0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
32db0 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
32dc0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
32dd0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
32de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
32df0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
32e00 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
32e10 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
32e20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
32e30 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
32e40 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
32e50 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
32e60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
32e70 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
32e80 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
32e90 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
32ea0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
32eb0 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
32ec0 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
32ed0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
32ee0 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
32ef0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
32f00 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
32f10 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
32f20 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
32f30 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
32f40 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
32f50 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
32f60 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
32f70 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
32f80 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
32f90 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
32fa0 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
32fb0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
32fc0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
32fd0 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
32fe0 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
32ff0 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
33000 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
33010 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
33020 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
33030 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
33040 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
33050 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
33060 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
33070 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
33080 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
33090 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
330a0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
330b0 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
330c0 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
330d0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
330e0 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
330f0 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
33100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33110 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
33120 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
33130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
33140 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
33150 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
33160 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
33170 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
33180 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
33190 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
331a0 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
331b0 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
331c0 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
331d0 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
331e0 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
331f0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
33200 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
33210 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
33220 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
33230 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
33240 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
33250 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
33260 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
33270 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
33280 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
33290 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
332a0 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
332b0 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
332c0 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
332d0 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
332e0 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
332f0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
33300 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
33310 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
33320 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
33330 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
33340 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
33350 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
33360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33370 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
33380 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
33390 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
333a0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
333b0 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
333c0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
333d0 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
333e0 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
333f0 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
33400 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
33410 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
33420 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
33430 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
33440 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
33450 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
33460 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
33470 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
33480 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
33490 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
334a0 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
334b0 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
334c0 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
334d0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
334e0 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
334f0 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
33500 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
33510 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
33520 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
33530 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
33540 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
33550 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
33560 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
33570 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
33580 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
33590 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
335a0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
335b0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
335c0 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
335d0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
335e0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
335f0 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53  ( osMkdir(buf, S
33600 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
33610 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
33620 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
33630 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
33640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
33650 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
33660 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
33670 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
33680 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
33690 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
336b0 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
336c0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
336d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
336e0 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
336f0 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
33700 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
33710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
33720 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
33730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
33750 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
33760 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
33770 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
33780 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
33790 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
337a0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
337b0 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c  %d\n", lockPath,
337c0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
337d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
337e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
337f0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
33800 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
33810 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
33820 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
33830 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
33840 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
33850 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
33860 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
33870 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
33880 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
33890 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
338a0 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
338b0 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
338c0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
338d0 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
338e0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
338f0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
33900 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
33910 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
33920 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33930 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
33940 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
33950 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
33960 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
33970 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
33980 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
33990 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
339a0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
339b0 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
339c0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
339d0 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
339e0 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
339f0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
33a00 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
33a10 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
33a20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
33a30 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
33a40 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
33a50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
33a60 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
33a70 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
33a80 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
33a90 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
33aa0 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
33ab0 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
33ac0 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
33ad0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
33ae0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
33af0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
33b00 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
33b10 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
33b20 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
33b30 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
33b40 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
33b50 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
33b60 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
33b70 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
33b80 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
33b90 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
33ba0 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
33bb0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
33bc0 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
33bd0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
33be0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
33bf0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
33c00 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
33c10 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
33c20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
33c30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
33c40 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
33c50 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
33c60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
33c70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
33c80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
33c90 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
33ca0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
33cb0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
33cc0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
33cd0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
33ce0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
33cf0 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
33d00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
33d10 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
33d20 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
33d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33d40 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
33d50 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
33d60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
33d70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
33d80 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c  <0 ){.    openFl
33d90 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
33da0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
33db0 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
33dc0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
33dd0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
33de0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
33df0 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69      if( islockfi
33e00 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  le ){.      retu
33e10 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
33e20 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
33e30 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20   (terrno) {.    
33e40 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20    case EACCES:. 
33e50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
33e60 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
33e70 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20   case EIO: .    
33e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33e90 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a  E_IOERR_LOCK; /*
33ea0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
33eb0 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a  is the conch */.
33ec0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
33ed0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
33ee0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33ef0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
33f00 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  .  pNew = (unixF
33f10 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ile *)sqlite3_ma
33f20 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65  lloc(sizeof(*pNe
33f30 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  w));.  if( pNew=
33f40 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
33f50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
33f60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65      goto end_cre
33f70 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20  ate_proxy;.  }. 
33f80 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
33f90 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
33fa0 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e  ));.  pNew->open
33fb0 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
33fc0 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  s;.  memset(&dum
33fd0 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66  myVfs, 0, sizeof
33fe0 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64  (dummyVfs));.  d
33ff0 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
34000 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
34010 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64  ockIoFinder;.  d
34020 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20  ummyVfs.zName = 
34030 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73  "dummy";.  pUnus
34040 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70  ed->fd = fd;.  p
34050 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
34060 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65  openFlags;.  pNe
34070 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  w->pUnused = pUn
34080 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20  used;.  .  rc = 
34090 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26  fillInUnixFile(&
340a0 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73  dummyVfs, fd, (s
340b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
340c0 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69  w, path, 0);.  i
340d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
340e0 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20   ){.    *ppFile 
340f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75  = pNew;.    retu
34100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34110 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  }.end_create_pro
34120 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74  xy:    .  robust
34130 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c  _close(pNew, fd,
34140 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71   __LINE__);.  sq
34150 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
34160 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
34170 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74  (pUnused);.  ret
34180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
34190 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
341a0 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
341b0 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
341c0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
341d0 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
341e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73  .int sqlite3_hos
341f0 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e  tid_num = 0;.#en
34200 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f  dif..#define PRO
34210 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20  XY_HOSTIDLEN    
34220 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  16  /* conch fil
34230 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68  e host id length
34240 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61   */../* Not alwa
34250 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ys defined in th
34260 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20  e headers as it 
34270 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65  ought to be */.e
34280 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73  xtern int gethos
34290 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c  tuuid(uuid_t id,
342a0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
342b0 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a  mespec *wait);..
342c0 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20  /* get the host 
342d0 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75  ID via gethostuu
342e0 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75  id(), pHostID mu
342f0 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58  st point to PROX
34300 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20  Y_HOSTIDLEN .** 
34310 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c  bytes of writabl
34320 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
34330 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
34340 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20  HostID(unsigned 
34350 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69  char *pHostID, i
34360 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61  nt *pError){.  a
34370 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54  ssert(PROXY_HOST
34380 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28  IDLEN == sizeof(
34390 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73  uuid_t));.  mems
343a0 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50  et(pHostID, 0, P
343b0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
343c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d  .#if defined(__M
343d0 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AX_OS_X_VERSION_
343e0 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20  MIN_REQUIRED)\. 
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
34400 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53   __MAC_OS_X_VERS
34410 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
34420 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74  <1050.  {.    st
34430 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
34440 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f  t timespec timeo
34450 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20  ut = {1, 0}; /* 
34460 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f  1 sec timeout */
34470 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74  .    if( gethost
34480 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
34490 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20  imeout) ){.     
344a0 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
344b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72  ;.      if( pErr
344c0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  or ){.        *p
344d0 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20  Error = err;.   
344e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
344f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
34500 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
34510 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34520 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64  ER(pError);.#end
34530 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
34540 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c  _TEST.  /* simul
34550 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
34560 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
34570 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
34580 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28  e paths */.  if(
34590 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
345a0 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70  num != 0){.    p
345b0 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61  HostID[0] = (cha
345c0 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20  r)(pHostID[0] + 
345d0 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68  (char)(sqlite3_h
345e0 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46  ostid_num & 0xFF
345f0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
34600 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
34610 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  E_OK;.}../* The 
34620 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61  conch file conta
34630 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20  ins the header, 
34640 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b  host id and lock
34650 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23   file path. */.#
34660 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e  define PROXY_CON
34670 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a  CHVERSION 2   /*
34680 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20   1-byte header, 
34690 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c  16-byte host id,
346a0 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65   path */.#define
346b0 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e   PROXY_HEADERLEN
346c0 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68      1   /* conch
346d0 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e   file header len
346e0 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  gth */.#define P
346f0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20  ROXY_PATHINDEX  
34700 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
34710 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
34720 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  EN).#define PROX
34730 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28  Y_MAXCONCHLEN  (
34740 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
34750 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b  PROXY_HOSTIDLEN+
34760 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20  MAXPATHLEN)../* 
34770 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65  .** Takes an ope
34780 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f  n conch file, co
34790 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  pies the content
347a0 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20  s to a new path 
347b0 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a  and then moves .
347c0 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65  ** it back.  The
347d0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66   newly created f
347e0 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72  ile's file descr
347f0 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65  iptor is assigne
34800 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63  d to the.** conc
34810 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  h file structure
34820 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65   and finally the
34830 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20   original conch 
34840 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34850 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20  is .** closed.  
34860 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  Returns zero if 
34870 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73  successful..*/.s
34880 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42  tatic int proxyB
34890 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  reakConchLock(un
348a0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
348b0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b  uid_t myHostID){
348c0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
348d0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
348e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
348f0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
34900 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
34910 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
34920 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
34930 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50  hFile;.  char tP
34940 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
34950 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58  .  char buf[PROX
34960 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
34970 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20    char *cPath = 
34980 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
34990 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65  ath;.  size_t re
349a0 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a  adLen = 0;.  siz
349b0 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b  e_t pathLen = 0;
349c0 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36  .  char errmsg[6
349d0 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66  4] = "";.  int f
349e0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  d = -1;.  int rc
349f0 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f   = -1;.  UNUSED_
34a00 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74  PARAMETER(myHost
34a10 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74  ID);..  /* creat
34a20 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20  e a new path by 
34a30 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69  replace the trai
34a40 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69  ling '-conch' wi
34a50 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20  th '-break' */. 
34a60 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63   pathLen = strlc
34a70 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c  py(tPath, cPath,
34a80 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
34a90 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50  if( pathLen>MAXP
34aa0 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65  ATHLEN || pathLe
34ab0 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74  n<6 || .     (st
34ac0 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74  rlcpy(&tPath[pat
34ad0 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22  hLen-5], "break"
34ae0 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20  , 6) != 5) ){.  
34af0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34b00 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
34b10 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65  ),errmsg,"path e
34b20 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
34b30 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20  int)pathLen);.  
34b40 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
34b50 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72  lock;.  }.  /* r
34b60 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f  ead the conch co
34b70 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c  ntent */.  readL
34b80 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
34b90 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20  chFile->h, buf, 
34ba0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
34bb0 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61  N, 0);.  if( rea
34bc0 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49  dLen<PROXY_PATHI
34bd0 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69  NDEX ){.    sqli
34be0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
34bf0 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
34c00 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28  sg,"read error (
34c10 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65  len %d)",(int)re
34c20 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  adLen);.    goto
34c30 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
34c40 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69    }.  /* write i
34c50 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d  t out to the tem
34c60 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c  porary break fil
34c70 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75  e */.  fd = robu
34c80 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28  st_open(tPath, (
34c90 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
34ca0 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66  _EXCL), 0);.  if
34cb0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
34cc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
34cd0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
34ce0 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
34cf0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
34d00 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
34d10 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
34d20 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
34d30 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
34d40 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
34d50 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
34d60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34d70 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
34d80 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
34d90 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
34da0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
34db0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
34dc0 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
34dd0 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
34de0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
34df0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
34e00 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
34e10 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
34e20 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
34e30 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
34e40 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
34e50 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
34e60 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
34e70 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
34e80 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
34e90 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
34ea0 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
34eb0 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
34ec0 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
34ed0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
34ee0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
34ef0 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
34f00 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
34f10 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
34f20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
34f30 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
34f40 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
34f50 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
34f60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
34f70 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
34f80 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
34f90 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
34fa0 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
34fb0 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
34fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
34fd0 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
34fe0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
34ff0 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
35000 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
35010 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
35020 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
35030 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
35040 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
35050 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
35060 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
35070 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
35080 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35090 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
350a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
350b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
350c0 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
350d0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
350e0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
350f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35100 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
35110 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
35120 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
35130 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73  dTime;.  .  mems
35140 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  et(&conchModTime
35150 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63  , 0, sizeof(conc
35160 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f  hModTime));.  do
35170 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63   {.    rc = conc
35180 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
35190 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
351a0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
351b0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e  lockType);.    n
351c0 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66  Tries ++;.    if
351d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
351e0 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y ){.      /* If
351f0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64   the lock failed
35200 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20   (busy):.       
35210 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74  * 1st try: get t
35220 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74  he mod time of t
35230 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30  he conch, wait 0
35240 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  .5s and try agai
35250 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64  n. .       * 2nd
35260 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68   try: fail if th
35270 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67  e mod time chang
35280 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73  ed or host id is
35290 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74   different, wait
352a0 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20   .       *      
352b0 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20       10 sec and 
352c0 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20  try again.      
352d0 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61   * 3rd try: brea
352e0 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73  k the lock unles
352f0 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68  s the mod time h
35300 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  as changed..    
35310 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
35320 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
35330 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63     if( osFstat(c
35340 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75  onchFile->h, &bu
35350 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  f) ){.        pF
35360 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
35370 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
35380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
35390 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
353a0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
353b0 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a  f( nTries==1 ){.
353c0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
353d0 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74  Time = buf.st_mt
353e0 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20  imespec;.       
353f0 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b   usleep(500000);
35400 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63   /* wait 0.5 sec
35410 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
35420 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20  k again*/.      
35430 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
35440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
35450 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b  ert( nTries>1 );
35460 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68  .      if( conch
35470 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21  ModTime.tv_sec !
35480 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
35490 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20  ec.tv_sec || .  
354a0 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
354b0 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62  ime.tv_nsec != b
354c0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
354d0 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20  tv_nsec ){.     
354e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
354f0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _BUSY;.      }. 
35500 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
35510 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20  nTries==2 ){  . 
35520 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66         char tBuf
35530 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
35540 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
35550 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63   len = osPread(c
35560 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75  onchFile->h, tBu
35570 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
35580 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
35590 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20    if( len<0 ){. 
355a0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
355b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
355c0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  o;.          ret
355d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
355e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  _LOCK;.        }
355f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
35600 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  >PROXY_PATHINDEX
35610 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68   && tBuf[0]==(ch
35620 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
35630 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20  RSION){.        
35640 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
35650 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65   the lock if the
35660 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74   host id doesn't
35670 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
35680 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d      if( 0!=memcm
35690 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45  p(&tBuf[PROXY_HE
356a0 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
356b0 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
356c0 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  LEN) ){.        
356d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
356e0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
356f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
35700 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
35710 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
35720 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65  lock on short re
35730 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20  ad or a version 
35740 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  mismatch */.    
35750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35760 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
35770 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65    }.        usle
35780 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a  ep(10000000); /*
35790 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64   wait 10 sec and
357a0 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
357b0 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ain */.        c
357c0 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20  ontinue; .      
357d0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61  }.      .      a
357e0 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33  ssert( nTries==3
357f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   );.      if( 0=
35800 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68  =proxyBreakConch
35810 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
35820 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20  stID) ){.       
35830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35840 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63  .        if( loc
35850 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  kType==EXCLUSIVE
35860 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
35870 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
35880 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
35890 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
358a0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
358b0 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20  ED_LOCK);       
358c0 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
358d0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
358e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
358f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
35900 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
35910 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
35920 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
35930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35940 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65  .    }.  } while
35950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
35960 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b  Y && nTries<3 );
35970 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
35980 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65  .}../* Takes the
35990 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67   conch by taking
359a0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
359b0 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  nd read the cont
359c0 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a  ents conch, if .
359d0 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e  ** lockPath is n
359e0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73  on-NULL, the hos
359f0 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t ID and lock fi
35a00 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74  le path must mat
35a10 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20  ch.  A NULL .** 
35a20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74  lockPath means t
35a30 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68  hat the lockPath
35a40 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
35a50 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
35a60 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
35a70 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20  IDs match, or a 
35a80 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  new lock path wi
35a90 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
35aa0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
35ab0 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f  * and written to
35ac0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e   the conch file.
35ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35ae0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e  roxyTakeConch(un
35af0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
35b00 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35b10 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
35b20 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35b30 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
35b40 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a  ingContext; .  .
35b50 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
35b60 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20  hHeld!=0 ){.    
35b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
35b90 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
35ba0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
35bb0 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74  File;.    uuid_t
35bc0 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69   myHostID;.    i
35bd0 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20  nt pError = 0;. 
35be0 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b     char readBuf[
35bf0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
35c00 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63  N];.    char loc
35c10 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  kPath[MAXPATHLEN
35c20 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d  ];.    char *tem
35c30 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c  pLockPath = NULL
35c40 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
35c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
35c60 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20  t createConch = 
35c70 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49  0;.    int hostI
35c80 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  dMatch = 0;.    
35c90 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  int readLen = 0;
35ca0 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c  .    int tryOldL
35cb0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
35cc0 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63   int forceNewLoc
35cd0 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a  kPath = 0;.    .
35ce0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
35cf0 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  KECONCH  %d for 
35d00 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
35d10 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
35d20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
35d30 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
35d40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35d50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
35d60 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
35d70 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48    rc = proxyGetH
35d80 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20  ostID(myHostID, 
35d90 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66  &pError);.    if
35da0 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
35db0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
35dc0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
35dd0 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  rno = pError;.  
35de0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
35df0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
35e00 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
35e10 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
35e20 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f  ostID, SHARED_LO
35e30 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
35e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35e50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
35e60 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20  econch;.    }.  
35e70 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78    /* read the ex
35e80 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c  isting conch fil
35e90 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e  e */.    readLen
35ea0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
35eb0 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46  unixFile*)conchF
35ec0 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c  ile, 0, readBuf,
35ed0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
35ee0 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61  EN);.    if( rea
35ef0 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  dLen<0 ){.      
35f00 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61  /* I/O error: la
35f10 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
35f20 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
35f30 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
35f40 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65  rrno = conchFile
35f50 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
35f60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
35f70 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20  OERR_READ;.     
35f80 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
35f90 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nch;.    }else i
35fa0 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f  f( readLen<=(PRO
35fb0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
35fc0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c  XY_HOSTIDLEN) ||
35fd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72   .             r
35fe0 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72  eadBuf[0]!=(char
35ff0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
36000 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ION ){.      /* 
36010 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  a short read or 
36020 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d  version format m
36030 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65  ismatch means we
36040 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
36050 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20  a new .      ** 
36060 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20  conch file. .   
36070 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61     */.      crea
36080 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20  teConch = 1;.   
36090 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65   }.    /* if the
360a0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
360b0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61   and the lock pa
360c0 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  th already exist
360d0 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20  s in the conch. 
360e0 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20     ** we'll try 
360f0 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20  to use the path 
36100 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e  there, if we can
36110 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74  't open that pat
36120 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a  h, we'll .    **
36130 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65   retry with a ne
36140 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  w auto-generated
36150 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20   path .    */.  
36160 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73    do { /* in cas
36170 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79  e we need to try
36180 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61   again for an :a
36190 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20  uto: named lock 
361a0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  file */..      i
361b0 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  f( !createConch 
361c0 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  && !forceNewLock
361d0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
361e0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d  hostIdMatch = !m
361f0 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50  emcmp(&readBuf[P
36200 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
36210 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20   myHostID, .    
36220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52                PR
36240 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
36250 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
36260 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61  e conch has data
36270 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   compare the con
36280 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  tents */.       
36290 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
362a0 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
362b0 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75         /* for au
362c0 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c  to-named local l
362d0 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63  ock file, just c
362e0 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44  heck the host ID
362f0 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20   and we'll.     
36300 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
36310 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
36320 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
36330 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20  eady in there.  
36340 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36350 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64        if( hostId
36360 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
36370 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68       size_t path
36380 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d  Len = (readLen -
36390 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
363a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a  );.            .
363b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
363c0 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48  pathLen>=MAXPATH
363d0 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LEN ){.         
363e0 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58       pathLen=MAX
363f0 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20  PATHLEN-1;.     
36400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36410 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b       memcpy(lock
36420 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
36430 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
36440 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20   pathLen);.     
36450 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b         lockPath[
36460 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20  pathLen] = 0;.  
36470 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f            tempLo
36480 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
36490 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  h;.            t
364a0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
364b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;.            /
364c0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
364d0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
364e0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
364f0 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
36500 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
36510 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
36520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
36530 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61  lse if( hostIdMa
36540 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20  tch.            
36550 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70     && !strncmp(p
36560 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36570 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
36580 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20  XY_PATHINDEX],. 
36590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365a0 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65            readLe
365b0 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n-PROXY_PATHINDE
365c0 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  X).        ){.  
365d0 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68          /* conch
365e0 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70   host and lock p
365f0 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  ath match */.   
36600 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36610 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20  takeconch; .    
36620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36630 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66      .      /* if
36640 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
36650 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f   writable and do
36660 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20  esn't match, we 
36670 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f  can't take it */
36680 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63  .      if( (conc
36690 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
366a0 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b  &O_RDWR) == 0 ){
366b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
366c0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
366d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
366e0 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20  conch;.      }. 
366f0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65       .      /* e
36700 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20  ither the conch 
36710 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20  didn't match or 
36720 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
36730 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20  e a new one */. 
36740 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
36750 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
36760 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65  .        proxyGe
36770 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e  tLockPath(pCtx->
36780 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68  dbPath, lockPath
36790 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
367a0 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
367b0 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
367c0 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
367d0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
367e0 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f  lock path _only_
367f0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
36800 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   taken */.      
36810 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
36820 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77  * update conch w
36830 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74  ith host and pat
36840 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69  h (this will fai
36850 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65  l if other proce
36860 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  ss.      ** has 
36870 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
36880 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68  ready), if the h
36890 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20  ost id matches, 
368a0 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20  use the big.    
368b0 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20    ** stick..    
368c0 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d    */.      futim
368d0 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  es(conchFile->h,
368e0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66   NULL);.      if
368f0 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26  ( hostIdMatch &&
36900 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b   !createConch ){
36910 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
36920 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26  chFile->pInode &
36930 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  & conchFile->pIn
36940 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
36950 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
36960 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
36970 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
36980 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
36990 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
369a0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65           ** same
369b0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
369c0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
369d0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
369e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
369f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
36a00 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20  } else {        
36a10 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20    .          rc 
36a20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
36a30 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
36a40 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
36a50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36a70 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
36a80 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
36a90 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36aa0 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55  conchFile, EXCLU
36ab0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
36ac0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
36ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36ae0 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69 74         char writ
36af0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41  eBuffer[PROXY_MA
36b00 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
36b10 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a      int writeSiz
36b20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a  e = 0;.        .
36b30 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75 66          writeBuf
36b40 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50  fer[0] = (char)P
36b50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
36b60 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  N;.        memcp
36b70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
36b80 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
36b90 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59   myHostID, PROXY
36ba0 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
36bb0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
36bc0 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55  ockProxyPath!=NU
36bd0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
36be0 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
36bf0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
36c00 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63  NDEX], pCtx->loc
36c10 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50  kProxyPath, MAXP
36c20 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
36c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36c40 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
36c50 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
36c60 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63  HINDEX], tempLoc
36c70 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
36c80 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  N);.        }.  
36c90 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20        writeSize 
36ca0 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  = PROXY_PATHINDE
36cb0 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74  X + strlen(&writ
36cc0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
36cd0 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20  THINDEX]);.     
36ce0 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63     robust_ftrunc
36cf0 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ate(conchFile->h
36d00 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20  , writeSize);.  
36d10 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57        rc = unixW
36d20 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  rite((sqlite3_fi
36d30 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  le *)conchFile, 
36d40 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69  writeBuffer, wri
36d50 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  teSize, 0);.    
36d60 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46      fsync(conchF
36d70 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20  ile->h);.       
36d80 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65   /* If we create
36d90 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69  d a new conch fi
36da0 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64  le (not just upd
36db0 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  ated the content
36dc0 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20  s of a .        
36dd0 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20   ** valid conch 
36de0 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61  file), try to ma
36df0 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69  tch the permissi
36e00 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ons of the datab
36e10 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f  ase .         */
36e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72  =SQLITE_OK && cr
36e40 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
36e50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74         struct st
36e60 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20  at buf;.        
36e70 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73    int err = osFs
36e80 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
36e90 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  uf);.          i
36ea0 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20  f( err==0 ){.   
36eb0 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20           mode_t 
36ec0 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d  cmode = buf.st_m
36ed0 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49  ode&(S_IRUSR|S_I
36ee0 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53  WUSR | S_IRGRP|S
36ef0 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20  _IWGRP |.       
36f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48   S_IROTH|S_IWOTH
36f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  );.            /
36f40 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  * try to match t
36f50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36f60 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73   R/W permissions
36f70 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
36f80 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
36f90 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
36fa0 20 20 20 20 20 20 20 20 20 20 20 6f 73 46 63 68             osFch
36fb0 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
36fc0 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  , cmode);.#else.
36fd0 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a              do{.
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
36ff0 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63   = osFchmod(conc
37000 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29  hFile->h, cmode)
37010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 77  ;.            }w
37020 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26  hile( rc==(-1) &
37030 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
37040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
37050 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
37060 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
37070 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
37080 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
37090 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64  (stderr, "fchmod
370a0 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20   %o FAILED with 
370b0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72  cmode, code, str
370e0 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20  error(code));.  
370f0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
37100 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
37110 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
37120 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43   "fchmod %o SUCC
37130 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a  EDED\n",cmode);.
37140 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
37150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37160 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
37170 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  ode = errno;.   
37180 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
37190 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46  (stderr, "STAT F
371a0 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25  AILED[%d] with %
371b0 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  d %s\n", .      
371c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
371d0 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  r, code, strerro
371e0 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66  r(code));.#endif
371f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37210 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e       conchFile->
37220 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
37230 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
37240 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
37250 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a  D_LOCK);.      .
37260 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63      end_takeconc
37270 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  h:.      OSTRACE
37280 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43  (("TRANSPROXY: C
37290 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69  LOSE  %d\n", pFi
372a0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69  le->h));.      i
372b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
372c0 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46   && pFile->openF
372d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
372e0 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20 20 20  int fd;.        
372f0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
37300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62  ){.          rob
37310 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
37320 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e   pFile->h, __LIN
37330 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E__);.        }.
37340 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
37350 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 66   = -1;.        f
37360 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
37370 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46  pCtx->dbPath, pF
37380 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20  ile->openFlags, 
37390 30 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  0);.        OSTR
373a0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
373b0 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66  : OPEN  %d\n", f
373c0 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d));.        if(
373d0 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
373e0 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66      pFile->h = f
373f0 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
37400 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53  {.          rc=S
37410 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
37420 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  KPT; /* SQLITE_B
37430 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
37440 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
37450 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63        during loc
37460 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
37470 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
37480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37490 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
374a0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20  Proxy ){.       
374b0 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65   char *path = te
374c0 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d  mpLockPath ? tem
374d0 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78  pLockPath : pCtx
374e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
374f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
37500 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
37510 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c  e(path, &pCtx->l
37520 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20  ockProxy, 1);.  
37530 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37540 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
37550 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74  QLITE_NOMEM && t
37560 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b  ryOldLockPath ){
37570 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65  .          /* we
37580 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65   couldn't create
37590 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
375a0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c  file with the ol
375b0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
375c0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
375d0 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20  o try again via 
375e0 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20  auto-naming .   
375f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37600 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63       forceNewLoc
37610 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
37620 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
37630 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
37640 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
37650 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  go back to the d
37660 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74  o {} while start
37670 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69   point, try agai
37680 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
37690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
376a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
376b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
376c0 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
376d0 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65   of path if we e
376e0 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c  xtracted the val
376f0 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  ue.         ** f
37700 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69  rom the conch fi
37710 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77  le or the path w
37720 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  as allocated on 
37730 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20  the stack.      
37740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
37750 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29  ( tempLockPath )
37760 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
37770 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
37780 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
37790 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  p(0, tempLockPat
377a0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  h);.          if
377b0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
377c0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
377d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
377e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
377f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
37800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37820 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
37830 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20  conchHeld = 1;. 
37840 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
37850 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
37860 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  oxy->pMethod == 
37870 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
37880 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f  .          afpLo
37890 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66  ckingContext *af
378a0 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pCtx;.          
378b0 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63  afpCtx = (afpLoc
378c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
378d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
378e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
378f0 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d           afpCtx-
37900 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  >dbPath = pCtx->
37910 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
37920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37930 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
37940 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
37950 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
37960 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37970 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
37980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
37990 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43  TRACE(("TAKECONC
379a0 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
379b0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
379c0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
379d0 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61  LITE_OK?"ok":"fa
379e0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72  iled"));.      r
379f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20  eturn rc;.    } 
37a00 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e  while (1); /* in
37a10 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
37a20 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f   retry the :auto
37a30 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20  : lock file - . 
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a50 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76  ** we should nev
37a60 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65  er get here exce
37a70 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74  pt via the 'cont
37a80 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20  inue' call. */. 
37a90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
37aa0 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63  File holds a loc
37ab0 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c  k on a conch fil
37ac0 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  e, then release 
37ad0 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  that lock..*/.st
37ae0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65  atic int proxyRe
37af0 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46  leaseConch(unixF
37b00 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
37b10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37b20 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
37b30 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
37b40 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  code */.  proxyL
37b50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
37b60 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63  Ctx;  /* The loc
37b70 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  king context for
37b80 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
37b90 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  */.  unixFile *c
37ba0 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
37bb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
37bc0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20  conch file */.. 
37bd0 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f   pCtx = (proxyLo
37be0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37bf0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37c00 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  text;.  conchFil
37c10 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37c20 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ile;.  OSTRACE((
37c30 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
37c40 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
37c50 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
37c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43  ,.           (pC
37c70 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
37c80 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
37c90 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
37ca0 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  :"), .          
37cb0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69   getpid()));.  i
37cc0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
37cd0 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ld>0 ){.    rc =
37ce0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
37cf0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
37d00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
37d10 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
37d20 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e  .  }.  pCtx->con
37d30 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53  chHeld = 0;.  OS
37d40 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
37d50 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
37d60 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
37d70 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
37d80 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
37d90 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
37da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37db0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
37dc0 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
37dd0 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
37de0 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
37df0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
37e00 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
37e10 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
37e20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
37e30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
37e40 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
37e50 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
37e60 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
37e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
37e80 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
37e90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
37ea0 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
37eb0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
37ec0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
37ed0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
37ee0 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
37ef0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
37f00 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
37f10 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
37f20 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
37f30 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
37f40 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
37f50 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
37f60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37f70 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
37f80 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
37f90 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
37fa0 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
37fb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
37fd0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
37fe0 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29   int len = (int)
37ff0 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20  strlen(dbPath); 
38000 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74  /* Length of dat
38010 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d  abase filename -
38020 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61   dbPath */.  cha
38030 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20  r *conchPath;   
38040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75             /* bu
38050 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
38060 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68   construct conch
38070 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   name */..  /* A
38080 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
38090 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
380a0 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  name and initial
380b0 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a  ize the name to.
380c0 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
380d0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
380e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20  tabase file. */ 
380f0 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20   .  *pConchPath 
38100 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63  = conchPath = (c
38110 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
38120 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
38130 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
38140 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
38150 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
38160 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68  }.  memcpy(conch
38170 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65  Path, dbPath, le
38180 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  n+1);.  .  /* no
38190 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62  w insert a "." b
381a0 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f  efore the last /
381b0 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
381c0 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20  for( i=(len-1); 
381d0 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20  i>=0; i-- ){.   
381e0 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69   if( conchPath[i
381f0 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
38200 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i++;.      break
38210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
38220 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a  nchPath[i]='.';.
38230 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20    while ( i<len 
38240 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68  ){.    conchPath
38250 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b  [i+1]=dbPath[i];
38260 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
38270 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22   /* append the "
38280 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74  -conch" suffix t
38290 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
382a0 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74  memcpy(&conchPat
382b0 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22  h[i+1], "-conch"
382c0 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 7);.  assert( 
382d0 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63  (int)strlen(conc
382e0 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20  hPath) == len+7 
382f0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
38300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54  ITE_OK;.}.../* T
38310 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e  akes a fully con
38320 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f  figured proxy lo
38330 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78  cking-style unix
38340 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68   file and switch
38350 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  es.** the local 
38360 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a  lock file path .
38370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77  */.static int sw
38380 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
38390 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
383a0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
383b0 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
383c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
383d0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
383e0 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
383f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
38400 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74  ;.  char *oldPat
38410 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
38420 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72  oxyPath;.  int r
38430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
38440 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
38450 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
38460 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
38470 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20  LITE_BUSY;.  }  
38480 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74  ..  /* nothing t
38490 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68  o do if the path
384a0 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a   is NULL, :auto:
384b0 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20   or matches the 
384c0 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f  existing path */
384d0 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
384e0 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
384f0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
38500 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20  :auto:") ||.    
38510 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72  (oldPath && !str
38520 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61  ncmp(oldPath, pa
38530 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
38540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
38550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
38560 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
38570 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
38580 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
38590 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockPro