/ Hex Artifact Content
Login

Artifact bdb0b66407141b7cd3520e92c685ea097b191c0e:


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 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  tems..**.** $Id:
01c0: 20 6f 73 5f 75 6e 69 78 2e 63 2c 76 20 31 2e 32   os_unix.c,v 1.2
01d0: 31 37 20 32 30 30 38 2f 31 31 2f 32 31 20 30 30  17 2008/11/21 00
01e0: 3a 31 30 3a 33 35 20 61 73 77 69 66 74 20 45 78  :10:35 aswift Ex
01f0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0200: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0210: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
0220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0230: 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 75 73   This file is us
0240: 65 64 20 6f 6e 20 75 6e 69 78 20 6f 6e 6c 79 20  ed on unix only 
0250: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  */../*.** If SQL
0260: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0270: 4e 47 5f 53 54 59 4c 45 20 69 73 20 64 65 66 69  NG_STYLE is defi
0280: 6e 65 64 20 61 6e 64 20 69 73 20 6e 6f 6e 2d 7a  ned and is non-z
0290: 65 72 6f 2c 20 74 68 65 6e 20 73 65 76 65 72 61  ero, then severa
02a0: 6c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  l.** alternative
02b0: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
02c0: 6e 74 61 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  ntations are pro
02d0: 76 69 64 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  vided:.**.**   *
02e0: 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28   POSIX locking (
02f0: 74 68 65 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a  the default),.**
0300: 20 20 20 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c     * No locking,
0310: 0a 2a 2a 20 20 20 2a 20 44 6f 74 2d 66 69 6c 65  .**   * Dot-file
0320: 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a   locking,.**   *
0330: 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
0340: 2c 0a 2a 2a 20 20 20 2a 20 41 46 50 20 6c 6f 63  ,.**   * AFP loc
0350: 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c  king (OSX only),
0360: 0a 2a 2a 20 20 20 2a 20 4e 61 6d 65 64 20 50 4f  .**   * Named PO
0370: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28  SIX semaphores (
0380: 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a  VXWorks only),.*
0390: 2a 20 20 20 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  *   * proxy lock
03a0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ing..**.** SQLIT
03b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
03c0: 5f 53 54 59 4c 45 20 6f 6e 6c 79 20 77 6f 72 6b  _STYLE only work
03d0: 73 20 6f 6e 20 61 20 4d 61 63 2e 20 49 74 20 69  s on a Mac. It i
03e0: 73 20 74 75 72 6e 65 64 20 6f 6e 20 62 79 0a 2a  s turned on by.*
03f0: 2a 20 64 65 66 61 75 6c 74 20 6f 6e 20 61 20 4d  * default on a M
0400: 61 63 20 61 6e 64 20 64 69 73 61 62 6c 65 64 20  ac and disabled 
0410: 6f 6e 20 61 6c 6c 20 6f 74 68 65 72 20 70 6f 73  on all other pos
0420: 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2f  ix platforms..*/
0430: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0450: 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66  ING_STYLE).#  if
0460: 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49   defined(__DARWI
0470: 4e 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65  N__).#    define
0480: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0490: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23  OCKING_STYLE 1.#
04a0: 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
04b0: 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
04c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30  _LOCKING_STYLE 0
04d0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
04e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74  ../*.** Define t
04f0: 68 65 20 49 53 5f 56 58 57 4f 52 4b 53 20 70 72  he IS_VXWORKS pr
0500: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
0510: 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64 69  o to 1 if buildi
0520: 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b  ng on .** vxwork
0530: 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  s, or 0 otherwis
0540: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
0550: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0560: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0570: 4c 29 0a 23 20 20 64 65 66 69 6e 65 20 49 53 5f  L).#  define IS_
0580: 56 58 57 4f 52 4b 53 20 31 0a 23 65 6c 73 65 0a  VXWORKS 1.#else.
0590: 23 20 20 64 65 66 69 6e 65 20 49 53 5f 56 58 57  #  define IS_VXW
05a0: 4f 52 4b 53 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  ORKS 0.#endif../
05b0: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
05c0: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
05d0: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
05e0: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
05f0: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0600: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0610: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0620: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
0630: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
0640: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
0650: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
0660: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
0670: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
0680: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0690: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
06a0: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
06b0: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
06c0: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
06d0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
06e0: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
06f0: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0700: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0710: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0720: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
0730: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
0740: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
0750: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
0760: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
0770: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
0780: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0790: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
07a0: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
07b0: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
07c0: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
07d0: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
07e0: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
07f0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0800: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0810: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0820: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
0830: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
0840: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
0850: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
0860: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
0870: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
0880: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0890: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
08a0: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
08b0: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
08c0: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
08d0: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
08e0: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
08f0: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
0900: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0910: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0920: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
0930: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0940: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0950: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
0960: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0970: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
0980: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0990: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
09a0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69  # include <sys/i
09c0: 6f 63 74 6c 2e 68 3e 0a 23 20 69 66 20 49 53 5f  octl.h>.# if IS_
09d0: 56 58 57 4f 52 4b 53 0a 23 20 20 64 65 66 69 6e  VXWORKS.#  defin
09e0: 65 20 6c 73 74 61 74 20 73 74 61 74 0a 23 20 20  e lstat stat.#  
09f0: 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f  include <semapho
0a00: 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  re.h>.#  include
0a10: 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c   <limits.h>.# el
0a20: 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  se.#  include <s
0a30: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 20 69  ys/param.h>.#  i
0a40: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e  nclude <sys/moun
0a50: 74 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e  t.h>.# endif.#en
0a60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
0a70: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0a80: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
0a90: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
0aa0: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
0ab0: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
0ac0: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
0ad0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
0ae0: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
0af0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
0b00: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
0b10: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
0b20: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0b30: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
0b40: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
0b50: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
0b60: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
0b70: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
0b80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
0b90: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0ba0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
0bb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0bc0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
0bd0: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
0be0: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
0bf0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
0c00: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
0c10: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
0c20: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0c30: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
0c40: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
0c50: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
0c60: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
0c70: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
0c80: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
0c90: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
0ca0: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
0cb0: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
0cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
0cd0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
0ce0: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
0cf0: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
0d00: 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78  fic for the unix
0d10: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
0d20: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0d30: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
0d40: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
0d50: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
0d60: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0d70: 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f  ds const *pMetho
0d80: 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68  d;  /* Always th
0d90: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f  e first entry */
0da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0db0: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
0dc0: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
0dd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
0de0: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
0df0: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
0e00: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
0e10: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
0e20: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
0e30: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
0e40: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
0e50: 32 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72  2];.#endif.  str
0e60: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
0e70: 65 6e 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61  en;    /* Info a
0e80: 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64  bout all open fd
0e90: 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  's on this inode
0ea0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
0eb0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20  kInfo *pLock;   
0ec0: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
0ed0: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
0ee0: 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  e */.#if SQLITE_
0ef0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0f00: 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  TYLE.  void *loc
0f10: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
0f20: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
0f30: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
0f40: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
0f50: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
0f60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
0f70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
0f80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
0f90: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20   locktype;   /* 
0fa0: 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b  The type of lock
0fb0: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64   held on this fd
0fc0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
0ff0: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
1000: 74 6f 72 79 20 2a 2f 0a 23 69 66 20 53 51 4c 49  tory */.#if SQLI
1010: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
1020: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
1030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1040: 20 74 68 72 65 61 64 20 74 68 61 74 20 22 6f 77   thread that "ow
1050: 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ns" this unixFil
1060: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  e */.#endif.  in
1070: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
1080: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1090: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  nix errno from t
10a0: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
10b0: 72 20 2a 2f 0a 23 69 66 20 49 53 5f 56 58 57 4f  r */.#if IS_VXWO
10c0: 52 4b 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  RKS.  int isDele
10d0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
10e0: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
10f0: 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  se if true */.  
1100: 63 68 61 72 20 2a 7a 52 65 61 6c 70 61 74 68 3b  char *zRealpath;
1110: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1120: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1130: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 66  G_STYLE.  int of
1140: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1150: 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73      /* The flags
1160: 20 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70   specified at op
1170: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  en */.#endif.};.
1180: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
1190: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
11a0: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
11b0: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
11c0: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
11d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
11e0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
11f0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
1200: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
1210: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
1220: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
1230: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
1240: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1250: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1260: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
1270: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
1280: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
1290: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
12a0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
12b0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
12c0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
12d0: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
12e0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
12f0: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
1300: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
1310: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
1320: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
1330: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
1340: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
1350: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
1360: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
1370: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
1380: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
1390: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
13a0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
13b0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
13c0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
13d0: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
13e0: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
13f0: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
1400: 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66  GPP__.# define f
1410: 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65  cntl(A,B,C) 0.#e
1420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1430: 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72  threadid macro r
1440: 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74  esolves to the t
1450: 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30  hread-id or to 0
1460: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74  .  Used for.** t
1470: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
1480: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
1490: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
14a0: 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65  AFE.#define thre
14b0: 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c  adid pthread_sel
14c0: 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  f().#else.#defin
14d0: 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e  e threadid 0.#en
14e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  dif../*.** Set o
14f0: 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69 78  r check the unix
1500: 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20  File.tid field. 
1510: 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73   This field is s
1520: 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69 78 46  et when an unixF
1530: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
1540: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
1550: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1560: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76 65 72  the unixFile ver
1570: 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ify that the.** 
1580: 73 61 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f  same thread is o
1590: 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20  perating on the 
15a0: 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d 65 20  unixFile.  Some 
15b0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
15c0: 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f  s do.** not allo
15d0: 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76  w locks to be ov
15e0: 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68 65  erridden by othe
15f0: 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 74 68  r threads and th
1600: 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  at restriction.*
1610: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71 6c  * means that sql
1620: 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 68  ite3* database h
1630: 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65  andles cannot be
1640: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20   moved from one 
1650: 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f  thread.** to ano
1660: 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f 67 69  ther.  This logi
1670: 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61 20 75  c makes sure a u
1680: 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74 72 79  ser does not try
1690: 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a 20 62   to do that.** b
16a0: 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a  y mistake..**.**
16b0: 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28   Version 3.3.1 (
16c0: 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 75 6e  2006-01-15):  un
16d0: 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20 6d 6f  ixFile can be mo
16e0: 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72  ved from one thr
16f0: 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  ead to.** anothe
1700: 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  r as long as we 
1710: 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61  are running on a
1720: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 70   system that sup
1730: 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a 2a  ports threads.**
1740: 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63 68   overriding each
1750: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 77   others locks (w
1760: 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d 6f 73  hich now the mos
1770: 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f  t common behavio
1780: 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c  r).** or if no l
1790: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20  ocks are held.  
17a0: 42 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65  But the unixFile
17b0: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
17c0: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
17d0: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
17e0: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
17f0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
1800: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
1810: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
1820: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
1830: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1840: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
1850: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
1860: 46 45 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f  FE.# define SET_
1870: 54 48 52 45 41 44 49 44 28 58 29 20 20 20 28 58  THREADID(X)   (X
1880: 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65 61 64  )->tid = pthread
1890: 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69 6e 65  _self().# define
18a0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
18b0: 58 29 20 28 74 68 72 65 61 64 73 4f 76 65 72 72  X) (threadsOverr
18c0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
18d0: 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20 20 20  ks==0 && \.     
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 21 70 74 68 72 65 61 64 5f         !pthread_
1900: 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20  equal((X)->tid, 
1910: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
1920: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1930: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 0a  SET_THREADID(X).
1940: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
1950: 48 52 45 41 44 49 44 28 58 29 20 30 0a 23 65 6e  HREADID(X) 0.#en
1960: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  dif../*.** Here 
1970: 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50  is the dirt on P
1980: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
1990: 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31  cks:  ANSI STD 1
19a0: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
19b0: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
19c0: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
19d0: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
19e0: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
19f0: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
1a00: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
1a10: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
1a20: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
1a30: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
1a40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
1a50: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
1a60: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
1a70: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
1a80: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
1a90: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
1aa0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
1ab0: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
1ac0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
1ad0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
1ae0: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
1af0: 61 73 65 3a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ase:.**       in
1b00: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
1b10: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
1b20: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
1b30: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
1b40: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
1b50: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
1b60: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
1b70: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
1b80: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
1b90: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
1ba0: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
1bb0: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
1bc0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
1bd0: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
1be0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1bf0: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
1c00: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
1c10: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
1c20: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
1c30: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
1c40: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
1c50: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
1c60: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
1c70: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
1c80: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
1c90: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
1ca0: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
1cb0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
1cc0: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
1cd0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
1ce0: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
1cf0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
1d00: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
1d10: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
1d20: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d  names..**.** Bum
1d30: 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73 6b  mer.  If you ask
1d40: 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72 6f   me, this is bro
1d50: 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b  ken.  Badly brok
1d60: 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a  en.  It means.**
1d70: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
1d80: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
1d90: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
1da0: 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e 67  ile access among
1db0: 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  .** competing th
1dc0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
1dd0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
1de0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
1df0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
1e00: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
1e10: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
1e20: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
1e30: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
1e40: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
1e50: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
1e60: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
1e70: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
1e80: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
1e90: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
1ea0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
1eb0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
1ec0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
1ed0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
1ee0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
1ef0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
1f00: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
1f10: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
1f20: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
1f30: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
1f40: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
1f50: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
1f60: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
1f70: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
1f80: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
1f90: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
1fa0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
1fb0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
1fc0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
1fd0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
1fe0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
1ff0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
2000: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
2010: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
2020: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
2030: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
2040: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
2050: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
2060: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  node..**.** The 
2070: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
2080: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
2090: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
20a0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
20b0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
20c0: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
20d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
20e0: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
20f0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
2100: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
2110: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
2120: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
2130: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
2140: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
2150: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
2160: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
2170: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
2180: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
2190: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
21a0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
21b0: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
21c0: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
21d0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
21e0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
21f0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
2200: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
2210: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
2220: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
2230: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
2240: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
2250: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
2260: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
2270: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
2280: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
2290: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
22a0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
22b0: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
22c0: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
22d0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
22e0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
22f0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
2300: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
2310: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
2320: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
2330: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
2340: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
2350: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
2360: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
2370: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2380: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
2390: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
23a0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
23b0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
23c0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
23d0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
23e0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
23f0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
2400: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
2410: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
2420: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
2430: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
2440: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
2450: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
2460: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
2470: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
2480: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2490: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
24a0: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
24b0: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
24c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
24d0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
24e0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
24f0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
2500: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
2510: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
2520: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
2530: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2540: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2550: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2560: 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  m, each unixFile
2570: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
2580: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
2590: 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73   to an openCnt s
25a0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
25b0: 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20   is one openCnt 
25c0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
25d0: 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69   open inode, whi
25e0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75  ch means that mu
25f0: 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20  ltiple unixFile 
2600: 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  can point to a s
2610: 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74  ingle.** openCnt
2620: 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  .  When an attem
2630: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
2640: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
2650: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
2660: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
2670: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2680: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
2690: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
26a0: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
26b0: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
26c0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
26d0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
26e0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
26f0: 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43  ar..** The openC
2700: 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  nt structure kee
2710: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
2720: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
2730: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
2740: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
2750: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
2760: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
2770: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
2780: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
2790: 2a 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c  * First, under L
27a0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65  inux threads, be
27b0: 63 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61  cause each threa
27c0: 64 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65  d has a separate
27d0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20  .** process ID, 
27e0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  lock operations 
27f0: 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f  in one thread do
2800: 20 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f   not override lo
2810: 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61  cks.** to the sa
2820: 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72  me file in other
2830: 20 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78   threads.  Linux
2840: 20 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20   threads behave 
2850: 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65  like.** separate
2860: 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68   processes in th
2870: 69 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74  is respect.  But
2880: 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  , if you close a
2890: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
28a0: 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72  tor in linux thr
28b0: 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20  eads, all locks 
28c0: 61 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65  are cleared, eve
28d0: 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74  n locks.** on ot
28e0: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
28f0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
2900: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61  other threads ha
2910: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
2920: 70 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69  process IDs.  Li
2930: 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69  nux threads is i
2940: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74  nconsistent in t
2950: 68 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20  his respect..** 
2960: 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74  (I'm beginning t
2970: 6f 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e  o think that lin
2980: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e  ux threads is an
2990: 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f   abomination too
29a0: 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71  .).** The conseq
29b0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c  uence of this al
29c0: 6c 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61  l is that the ha
29d0: 73 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  sh table for the
29e0: 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72   lockInfo.** str
29f0: 75 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e  ucture has to in
2a00: 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73  clude the proces
2a10: 73 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20  s id as part of 
2a20: 69 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a  its key because.
2a30: 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66  ** locks in diff
2a40: 65 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72  erent threads ar
2a50: 65 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73  e treated as dis
2a60: 74 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20  tinct.  But the 
2a70: 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  .** openCnt stru
2a80: 63 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74  cture should not
2a90: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
2aa0: 63 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a  cess id in its.*
2ab0: 2a 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c  * key because cl
2ac0: 6f 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63  ose() clears loc
2ad0: 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  k on all threads
2ae0: 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63  , not just the c
2af0: 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  urrent.** thread
2b00: 2e 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66  .  Were it not f
2b10: 6f 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73  or this goofines
2b20: 73 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61  s in linux threa
2b30: 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20  ds, we could.** 
2b40: 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b  combine the lock
2b50: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
2b60: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f   structures into
2b70: 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74   a single struct
2b80: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ure..**.** 2004-
2b90: 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73 6f  Jun-28:.** On so
2ba0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  me versions of l
2bb0: 69 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63 61  inux, threads ca
2bc0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
2bd0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
2be0: 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e 20   On others not. 
2bf0: 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20 63   Sometimes you c
2c00: 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62 65  an change the be
2c10: 68 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73 61  havior on the sa
2c20: 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79 20  me.** system by 
2c30: 73 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f 41  setting the LD_A
2c40: 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e 76  SSUME_KERNEL env
2c50: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
2c60: 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49 58  e.  The.** POSIX
2c70: 20 73 74 61 6e 64 61 72 64 20 69 73 20 73 69 6c   standard is sil
2c80: 65 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 20  ent as to which 
2c90: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
2ca0: 65 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20 61  ect, as far.** a
2cb0: 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73 6f  s I can tell, so
2cc0: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20   other versions 
2cd0: 6f 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73 68  of unix might sh
2ce0: 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 69  ow the same.** i
2cf0: 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54  nconsistency.  T
2d00: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74 6c  here is no littl
2d10: 65 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d 69  e doubt in my mi
2d20: 6e 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a 2a  nd that posix.**
2d30: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2d40: 61 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61 64  and linux thread
2d50: 73 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c 79  s are profoundly
2d60: 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54   broken..**.** T
2d70: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
2d80: 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  e inconsistencie
2d90: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74 65  s, we have to te
2da0: 73 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a 2a  st at runtime .*
2db0: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
2dc0: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
2dd0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2de0: 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20 74  s locks.  This t
2df0: 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f 6e  est.** is run on
2e00: 63 65 2c 20 74 68 65 20 66 69 72 73 74 20 74 69  ce, the first ti
2e10: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
2e20: 74 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74 61  ttempted.  A sta
2e30: 74 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tic .** variable
2e40: 20 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f 72   is set to recor
2e50: 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
2e60: 20 74 68 69 73 20 74 65 73 74 20 66 6f 72 20 66   this test for f
2e70: 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  uture.** use..*/
2e80: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2e90: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2ea0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
2eb0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
2ec0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
2ed0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
2ee0: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
2ef0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
2f00: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72  de..**.** If thr
2f10: 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72  eads cannot over
2f20: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2f30: 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65 20   locks, then we 
2f40: 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 4b  set the.** lockK
2f50: 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20  ey.tid field to 
2f60: 74 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20  the thread ID.  
2f70: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  If threads can o
2f80: 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20  verride.** each 
2f90: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
2fa0: 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20  n tid is always 
2fb0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74 69  set to zero.  ti
2fc0: 64 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20  d is omitted.** 
2fd0: 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69  if we compile wi
2fe0: 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67 20  thout threading 
2ff0: 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74 72 75  support..*/.stru
3000: 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20 20 64  ct lockKey {.  d
3010: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
3020: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
3030: 20 2a 2f 0a 23 69 66 20 49 53 5f 56 58 57 4f 52   */.#if IS_VXWOR
3040: 4b 53 0a 20 20 76 6f 69 64 20 2a 72 6e 61 6d 3b  KS.  void *rnam;
3050: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 6e 61 6d        /* Realnam
3060: 65 20 73 69 6e 63 65 20 69 6e 6f 64 65 20 75 6e  e since inode un
3070: 75 73 61 62 6c 65 20 2a 2f 0a 23 65 6c 73 65 0a  usable */.#else.
3080: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
3090: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
30a0: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  er */.#endif.#if
30b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
30c0: 46 45 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  FE.  pthread_t t
30d0: 69 64 3b 20 20 20 2f 2a 20 54 68 72 65 61 64 20  id;   /* Thread 
30e0: 49 44 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68  ID or zero if th
30f0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3100: 64 65 20 65 61 63 68 20 6f 74 68 65 72 20 2a 2f  de each other */
3110: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
3120: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
3130: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3140: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
3150: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
3160: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20  pen.** inode on 
3170: 65 61 63 68 20 74 68 72 65 61 64 20 77 69 74 68  each thread with
3180: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
3190: 63 65 73 73 20 49 44 2e 20 20 28 54 68 72 65 61  cess ID.  (Threa
31a0: 64 73 20 68 61 76 65 0a 2a 2a 20 64 69 66 66 65  ds have.** diffe
31b0: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 73  rent process IDs
31c0: 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e   on linux, but n
31d0: 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72  ot on most other
31e0: 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20   unixes.).**.** 
31f0: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
3200: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
3210: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3220: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
3230: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
3240: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
3250: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
3260: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
3270: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
3280: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
3290: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
32a0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
32b0: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
32c0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
32d0: 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b  {.  struct lockK
32e0: 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65 20  ey key;  /* The 
32f0: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
3300: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
3310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3320: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
3330: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  eld */.  int loc
3340: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a  ktype;        /*
3350: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
3360: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
3370: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
3380: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
3390: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33a0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
33b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73  structure */.  s
33c0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
33d0: 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20  pNext, *pPrev;  
33e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
33f0: 6c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  lockInfo objects
3400: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
3410: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3420: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3430: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
3440: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
3450: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
3460: 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73 74  cular openCnt st
3470: 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74  ructure given it
3480: 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a  s inode.  This.*
3490: 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
34a0: 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63   the lockKey exc
34b0: 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72  ept that the thr
34c0: 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65  ead ID is omitte
34d0: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65  d..*/.struct ope
34e0: 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  nKey {.  dev_t d
34f0: 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20  ev;   /* Device 
3500: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 49 53  number */.#if IS
3510: 5f 56 58 57 4f 52 4b 53 0a 20 20 76 6f 69 64 20  _VXWORKS.  void 
3520: 2a 72 6e 61 6d 3b 20 20 2f 2a 20 52 65 61 6c 6e  *rnam;  /* Realn
3530: 61 6d 65 20 73 69 6e 63 65 20 69 6e 6f 64 65 20  ame since inode 
3540: 75 6e 75 73 61 62 6c 65 20 2a 2f 0a 23 65 6c 73  unusable */.#els
3550: 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  e.  ino_t ino;  
3560: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
3570: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
3580: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
3590: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
35a0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
35b0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
35c0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
35d0: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
35e0: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
35f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
3600: 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  cks on that.** i
3610: 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f 73  node.  If a clos
3620: 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  e is attempted a
3630: 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20  gainst an inode 
3640: 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a  that is holding.
3650: 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c  ** locks, the cl
3660: 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ose is deferred 
3670: 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20  until all locks 
3680: 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67 20  clear by adding 
3690: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
36a0: 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f  riptor to be clo
36b0: 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64 69  sed to the pendi
36c0: 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ng list..*/.stru
36d0: 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73  ct openCnt {.  s
36e0: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
36f0: 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  y;   /* The look
3700: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
3710: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3720: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3730: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
3740: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3750: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
3760: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3770: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
3780: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
3790: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  nding;         /
37a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  * Number of pend
37b0: 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72  ing close() oper
37c0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
37d0: 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20  *aPending;      
37e0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70    /* Malloced sp
37f0: 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73  ace holding fd's
3800: 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73   awaiting a clos
3810: 65 28 29 20 2a 2f 0a 23 69 66 20 49 53 5f 56 58  e() */.#if IS_VX
3820: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
3830: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Sem;          /*
3840: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
3850: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
3860: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
3870: 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20  THNAME+1];   /* 
3880: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
3890: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
38a0: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  .  struct openCn
38b0: 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  t *pNext, *pPrev
38c0: 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61  ;   /* List of a
38d0: 6c 6c 20 6f 70 65 6e 43 6e 74 20 6f 62 6a 65 63  ll openCnt objec
38e0: 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
38f0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6c 6f 63 6b  List of all lock
3900: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
3910: 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 20   objects.  This 
3920: 75 73 65 64 20 74 6f 20 62 65 20 61 20 68 61 73  used to be a has
3930: 68 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 42 75 74  h.** table.  But
3940: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
3950: 62 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79  bjects is rarely
3960: 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a   more than a doz
3970: 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20  en and.** never 
3980: 65 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68  exceeds a few th
3990: 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f  ousand.  And loo
39a0: 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20  kup is not on a 
39b0: 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68  critical.** path
39c0: 20 6f 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e   oo a simple lin
39d0: 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75  ked list will su
39e0: 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ffice..*/.static
39f0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
3a00: 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a   *lockList = 0;.
3a10: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 6f 70  static struct op
3a20: 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20  enCnt *openList 
3a30: 3d 20 30 3b 0a 0a 23 69 66 20 49 53 5f 56 58 57  = 0;..#if IS_VXW
3a40: 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ORKS./*.** This 
3a50: 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 75 73  hash table is us
3a60: 65 64 20 74 6f 20 62 69 6e 64 20 74 68 65 20 63  ed to bind the c
3a70: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 20 6e 61  anonical file na
3a80: 6d 65 20 74 6f 20 61 0a 2a 2a 20 75 6e 69 78 46  me to a.** unixF
3a90: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
3aa0: 64 20 75 73 65 20 74 68 65 20 68 61 73 68 20 6b  d use the hash k
3ab0: 65 79 20 28 3d 20 63 61 6e 6f 6e 69 63 61 6c 20  ey (= canonical 
3ac0: 6e 61 6d 65 29 0a 2a 2a 20 69 6e 73 74 65 61 64  name).** instead
3ad0: 20 6f 66 20 74 68 65 20 49 6e 6f 64 65 20 6e 75   of the Inode nu
3ae0: 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 6c 65  mber of the file
3af0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 74   to find the mat
3b00: 63 68 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 49 6e 66  ching.** lockInf
3b10: 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74  o and openCnt st
3b20: 72 75 63 74 75 72 65 73 2e 20 49 74 20 61 6c 73  ructures. It als
3b30: 6f 20 68 65 6c 70 73 20 74 6f 20 6d 61 6b 65 20  o helps to make 
3b40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
3b50: 68 65 20 73 65 6d 61 70 68 6f 72 65 20 77 68 65  he semaphore whe
3b60: 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  n LOCKING_STYLE_
3b70: 4e 41 4d 45 44 53 45 4d 20 69 73 20 75 73 65 64  NAMEDSEM is used
3b80: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 6c 65  .** for the file
3b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68  ..*/.static Hash
3ba0: 20 6e 61 6d 65 48 61 73 68 3b 0a 23 65 6e 64 69   nameHash;.#endi
3bb0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63  f../*.** The loc
3bc0: 6b 69 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20  king styles are 
3bd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3be0: 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 66 69  the different fi
3bf0: 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61  le locking.** ca
3c00: 70 61 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f  pabilities suppo
3c10: 72 74 65 64 20 62 79 20 64 69 66 66 65 72 65 6e  rted by differen
3c20: 74 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  t file systems. 
3c30: 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f   .**.** POSIX lo
3c40: 63 6b 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c  cking style full
3c50: 79 20 73 75 70 70 6f 72 74 73 20 73 68 61 72 65  y supports share
3c60: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20  d and exclusive 
3c70: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
3c80: 20 0a 2a 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67   .** AFP locking
3c90: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65   only supports e
3ca0: 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
3cb0: 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f  nge locks.** FLO
3cc0: 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  CK only supports
3cd0: 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67   a single file-g
3ce0: 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20  lobal exclusive 
3cf0: 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20  lock.** DOTLOCK 
3d00: 69 73 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63  isn't a true loc
3d10: 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72  king style, it r
3d20: 65 66 65 72 73 20 74 6f 20 74 68 65 20 75 73 65  efers to the use
3d30: 20 6f 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a   of a special.**
3d40: 20 20 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68     file named th
3d50: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64 61  e same as the da
3d60: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
3d70: 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e   a '.lock' exten
3d80: 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20  sion, this.**   
3d90: 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66  can be used on f
3da0: 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61 74  ile systems that
3db0: 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e   do not offer an
3dc0: 79 20 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20  y reliable file 
3dd0: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 4e 45 20  locking.** NONE 
3de0: 6c 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74 68  locking means th
3df0: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3e00: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3e10: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
3e20: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61 64  ed for.**   read
3e30: 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65  -only file syste
3e40: 6d 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ms currently.** 
3e50: 4e 41 4d 45 44 53 45 4d 20 69 73 20 73 69 6d 69  NAMEDSEM is simi
3e60: 6c 61 72 20 74 6f 20 44 4f 54 4c 4f 43 4b 20 62  lar to DOTLOCK b
3e70: 75 74 20 75 73 65 73 20 61 20 6e 61 6d 65 64 20  ut uses a named 
3e80: 73 65 6d 61 70 68 6f 72 65 20 69 6e 73 74 65 61  semaphore instea
3e90: 64 20 6f 66 20 61 6e 0a 2a 2a 20 20 20 69 6e 64  d of an.**   ind
3ea0: 69 63 61 74 6f 72 20 66 69 6c 65 2e 0a 2a 2a 20  icator file..** 
3eb0: 50 52 4f 58 59 20 75 73 65 73 20 61 20 73 65 63  PROXY uses a sec
3ec0: 6f 6e 64 20 66 69 6c 65 20 74 6f 20 72 65 70 72  ond file to repr
3ed0: 65 73 65 6e 74 20 74 68 65 20 6c 6f 63 6b 20 73  esent the lock s
3ee0: 74 61 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  tate of the data
3ef0: 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 20 20 77  base file.**   w
3f00: 68 69 63 68 20 69 73 20 6e 65 76 65 72 20 61 63  hich is never ac
3f10: 74 75 61 6c 6c 79 20 6c 6f 63 6b 65 64 2c 20 61  tually locked, a
3f20: 20 74 68 69 72 64 20 66 69 6c 65 20 63 6f 6e 74   third file cont
3f30: 72 6f 6c 73 20 61 63 63 65 73 73 20 74 6f 20 74  rols access to t
3f40: 68 65 20 70 72 6f 78 79 0a 2a 2a 20 55 4e 53 55  he proxy.** UNSU
3f50: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3f60: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3f70: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3f80: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
3f90: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
3fa0: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
3fb0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
3fc0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 23 64 65  supported.*/.#de
3fd0: 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  fine LOCKING_STY
3fe0: 4c 45 5f 50 4f 53 49 58 20 20 20 20 20 20 20 20  LE_POSIX        
3ff0: 31 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e  1.#define LOCKIN
4000: 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20 20 20 20  G_STYLE_NONE    
4010: 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4c       2.#define L
4020: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54  OCKING_STYLE_DOT
4030: 46 49 4c 45 20 20 20 20 20 20 33 0a 23 64 65 66  FILE      3.#def
4040: 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ine LOCKING_STYL
4050: 45 5f 46 4c 4f 43 4b 20 20 20 20 20 20 20 20 34  E_FLOCK        4
4060: 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47  .#define LOCKING
4070: 5f 53 54 59 4c 45 5f 41 46 50 20 20 20 20 20 20  _STYLE_AFP      
4080: 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4c 4f      5.#define LO
4090: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45  CKING_STYLE_NAME
40a0: 44 53 45 4d 20 20 20 20 20 36 0a 23 64 65 66 69  DSEM     6.#defi
40b0: 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ne LOCKING_STYLE
40c0: 5f 50 52 4f 58 59 20 20 20 20 20 20 20 20 37 0a  _PROXY        7.
40d0: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
40e0: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
40f0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
4100: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
4110: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
4120: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
4130: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
4140: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
4150: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
4160: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
4170: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
4180: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
4190: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 0a  LITE_BUSY))../*.
41a0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
41b0: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
41c0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
41d0: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a 2a   global mutex..*
41e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e  /.static void en
41f0: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
4200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4210: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
4220: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4230: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4240: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
4250: 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28 76  oid leaveMutex(v
4260: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4270: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
4280: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4290: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
42a0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23  C_MASTER));.}..#
42b0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
42c0: 53 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  SAFE./*.** This 
42d0: 76 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73  variable records
42e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
42f0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
4300: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
4310: 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  .** locks..**.**
4320: 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72      0:  No.  Thr
4330: 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72  eads cannot over
4340: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
4350: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a   locks..**    1:
4360: 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20    Yes.  Threads 
4370: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
4380: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
4390: 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e  **   -1:  We don
43a0: 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a  't know yet..**.
43b0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
43c0: 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63  ms, we know at c
43d0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74  ompile-time if t
43e0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
43f0: 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65  ide each.** othe
4400: 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68  rs locks.  On th
4410: 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ose systems, the
4420: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
4430: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63  VERRIDE_LOCK mac
4440: 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65  ro.** will be se
4450: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  t appropriately.
4460: 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65    On other syste
4470: 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63  ms, we have to c
4480: 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69  heck at.** runti
4490: 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61  me.  On these la
44a0: 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51  tter systems, SQ
44b0: 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LTIE_THREAD_OVER
44c0: 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20  RIDE_LOCK is.** 
44d0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
44e0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e   This variable n
44f0: 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65  ormally has file
4500: 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75   scope only.  Bu
4510: 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  t during testing
4520: 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  , we make.** it 
4530: 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74  a global so that
4540: 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 63   the test code c
4550: 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76 61  an change its va
4560: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
4570: 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74  verify.** that t
4580: 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20 68  he right stuff h
4590: 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72  appens in either
45a0: 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   case..*/.#ifnde
45b0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  f SQLITE_THREAD_
45c0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20  OVERRIDE_LOCK.# 
45d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48  define SQLITE_TH
45e0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
45f0: 43 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66  CK -1.#endif.#if
4600: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4610: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
4620: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
4630: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
4640: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
4650: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
4660: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
4670: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
4680: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
4690: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
46a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
46b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
46c0: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
46d0: 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69  passed into indi
46e0: 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74  vidual test.** t
46f0: 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65  hreads by the te
4700: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
4710: 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e  ehavior() routin
4720: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72  e..*/.struct thr
4730: 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20  eadTestData {.  
4740: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
4750: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
4760: 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
4770: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
4780: 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ck;     /* The l
4790: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
47a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
47b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
47c0: 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f  Result of the lo
47d0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
47e0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
47f0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
4800: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
4810: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4820: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
4830: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
4840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4850: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
4860: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
4870: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
4880: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
4890: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
48a0: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
48b0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
48c0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
48d0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
48e0: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
48f0: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
4900: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
4910: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
4920: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
4930: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
4940: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
4950: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
4960: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
4970: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
4980: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
4990: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
49a0: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
49b0: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
49c0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
49d0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
49e0: 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  e{.    s = fcntl
49f0: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
4a00: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4a10: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
4a20: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
4a30: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
4a40: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
4a50: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
4a60: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
4a70: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
4a80: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
4a90: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
4aa0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
4ab0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
4ac0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
4ad0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
4ae0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
4af0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4b00: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
4b10: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
4b20: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
4b30: 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70  s = fcntl(fd, op
4b40: 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72  , p);.  savedErr
4b50: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71  no = errno;.  sq
4b60: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4b70: 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73  ("fcntl %d %d %s
4b80: 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c   %s %d %d %d %d\
4b90: 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69  n",.     threadi
4ba0: 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20  d, fd, zOpName, 
4bb0: 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c  zType, (int)p->l
4bc0: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e  _start, (int)p->
4bd0: 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74  l_len,.     (int
4be0: 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20  )p->l_pid, s);. 
4bf0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20   if( s==(-1) && 
4c00: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28  op==F_SETLK && (
4c10: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
4c20: 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d  CK || p->l_type=
4c30: 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20  =F_WRLCK) ){.   
4c40: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32   struct flock l2
4c50: 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20  ;.    l2 = *p;. 
4c60: 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47     fcntl(fd, F_G
4c70: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
4c80: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
4c90: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
4ca0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
4cb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
4cc0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
4cd0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4ce0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
4cf0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
4d00: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
4d10: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
4d20: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
4d30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4d40: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
4d50: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4d60: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
4d70: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
4d80: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
4d90: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
4da0: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
4db0: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
4dc0: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
4dd0: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
4de0: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
4df0: 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63  define fcntl loc
4e00: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
4e10: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
4e20: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f  CE */..#ifdef __
4e30: 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 54 68  linux__./*.** Th
4e40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
4e50: 73 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e 20  sed as the main 
4e60: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 74 68  routine for a th
4e70: 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20 62 79  read launched by
4e80: 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64 4c 6f  .** testThreadLo
4e90: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 2e  ckingBehavior().
4ea0: 20 49 74 20 74 65 73 74 73 20 77 68 65 74 68 65   It tests whethe
4eb0: 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  r the shared-loc
4ec0: 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 62 79  k obtained.** by
4ed0: 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
4ee0: 20 69 6e 20 74 65 73 74 54 68 72 65 61 64 4c 6f   in testThreadLo
4ef0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
4f00: 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 61  conflicts with a
4f10: 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63 61 6c  .** hypothetical
4f20: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62 74 61   write-lock obta
4f30: 69 6e 65 64 20 62 79 20 74 68 69 73 20 74 68 72  ined by this thr
4f40: 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ead on the same 
4f50: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
4f60: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
4f70: 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71 75 69  t actually acqui
4f80: 72 65 64 2c 20 61 73 20 74 68 69 73 20 69 73 20  red, as this is 
4f90: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66 20  not possible if 
4fa0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20  .** the file is 
4fb0: 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f 6e 6c  open in read-onl
4fc0: 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69 63 6b  y mode (see tick
4fd0: 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20 0a 73  et #3472)..*/ .s
4fe0: 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65  tatic void *thre
4ff0: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f  adLockingTest(vo
5000: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72  id *pArg){.  str
5010: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
5020: 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72  ta *pData = (str
5030: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
5040: 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74  ta*)pArg;.  pDat
5050: 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74  a->result = fcnt
5060: 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 47  l(pData->fd, F_G
5070: 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f  ETLK, &pData->lo
5080: 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  ck);.  return pA
5090: 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
50a0: 73 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65  s procedure atte
50b0: 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
50c0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
50d0: 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20   threads.** can 
50e0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
50f0: 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20  hers locks then 
5100: 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72  sets the .** thr
5110: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
5120: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69  OthersLocks vari
5130: 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65  able appropriate
5140: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
5150: 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  id testThreadLoc
5160: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74  kingBehavior(int
5170: 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74   fd_orig){.  int
5180: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   fd;.  int rc;. 
5190: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
51a0: 73 74 44 61 74 61 20 64 3b 0a 20 20 73 74 72 75  stData d;.  stru
51b0: 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70 74  ct flock l;.  pt
51c0: 68 72 65 61 64 5f 74 20 74 3b 0a 0a 20 20 66 64  hread_t t;..  fd
51d0: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
51e0: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
51f0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
5200: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 29 29  l, 0, sizeof(l))
5210: 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65 20 3d 20 46  ;.  l.l_type = F
5220: 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65  _RDLCK;.  l.l_le
5230: 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74 61  n = 1;.  l.l_sta
5240: 72 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77 68  rt = 0;.  l.l_wh
5250: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
5260: 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64  .  rc = fcntl(fd
5270: 5f 6f 72 69 67 2c 20 46 5f 53 45 54 4c 4b 2c 20  _orig, F_SETLK, 
5280: 26 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  &l);.  if( rc!=0
5290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
52a0: 73 65 74 28 26 64 2c 20 30 2c 20 73 69 7a 65 6f  set(&d, 0, sizeo
52b0: 66 28 64 29 29 3b 0a 20 20 64 2e 66 64 20 3d 20  f(d));.  d.fd = 
52c0: 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20 6c  fd;.  d.lock = l
52d0: 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.  d.lock.l_typ
52e0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
52f0: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
5300: 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69  , 0, threadLocki
5310: 6e 67 54 65 73 74 2c 20 26 64 29 3b 0a 20 20 70  ngTest, &d);.  p
5320: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20 30  thread_join(t, 0
5330: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
5340: 20 20 69 66 28 20 64 2e 72 65 73 75 6c 74 21 3d    if( d.result!=
5350: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 74 68  0 ) return;.  th
5360: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
5370: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 28  hOthersLocks = (
5380: 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  d.lock.l_type==F
5390: 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6c 73 65  _UNLCK);.}.#else
53a0: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 61 6e 79 74 68 69  ./*.** On anythi
53b0: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69  ng other than li
53c0: 6e 75 78 2c 20 61 73 73 75 6d 65 20 74 68 72 65  nux, assume thre
53d0: 61 64 73 20 6f 76 65 72 72 69 64 65 20 65 61 63  ads override eac
53e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
53f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5400: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
5410: 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f  Behavior(int fd_
5420: 6f 72 69 67 29 7b 0a 20 20 74 68 72 65 61 64 73  orig){.  threads
5430: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5440: 72 73 4c 6f 63 6b 73 20 3d 20 31 3b 0a 7d 0a 23  rsLocks = 1;.}.#
5450: 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78  endif /* __linux
5460: 5f 5f 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  __ */..#endif /*
5470: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
5480: 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  FE */../*.** Rel
5490: 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20  ease a lockInfo 
54a0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
54b0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
54c0: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
54d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
54e0: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
54f0: 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  (struct lockInfo
5500: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20   *pLock){.  if( 
5510: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
5520: 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ck->nRef--;.    
5530: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
5540: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
5550: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a  pLock->pPrev ){.
5560: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5570: 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e  pLock->pPrev->pN
5580: 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20  ext==pLock );.  
5590: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72        pLock->pPr
55a0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63  ev->pNext = pLoc
55b0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
55c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
55d0: 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d  ssert( lockList=
55e0: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
55f0: 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f    lockList = pLo
5600: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
5610: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
5620: 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ck->pNext ){.   
5630: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
5640: 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ck->pNext->pPrev
5650: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
5660: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d     pLock->pNext-
5670: 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e  >pPrev = pLock->
5680: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
5690: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
56a0: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  e(pLock);.    }.
56b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
56c0: 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73  ease a openCnt s
56d0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
56e0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
56f0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
5700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5710: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
5720: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
5730: 4f 70 65 6e 29 7b 0a 20 20 69 66 28 20 70 4f 70  Open){.  if( pOp
5740: 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d  en ){.    pOpen-
5750: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
5760: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
5770: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
5780: 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  en->pPrev ){.   
5790: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
57a0: 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  en->pPrev->pNext
57b0: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
57c0: 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d     pOpen->pPrev-
57d0: 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e  >pNext = pOpen->
57e0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
57f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
5800: 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f  rt( openList==pO
5810: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  pen );.        o
5820: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d  penList = pOpen-
5830: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
5840: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
5850: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
5860: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
5870: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
5880: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
5890: 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50  pOpen->pNext->pP
58a0: 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72  rev = pOpen->pPr
58b0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
58c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
58d0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
58e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
58f0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
5900: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 49 53 5f  }.  }.}..#if IS_
5910: 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 49 6d  VXWORKS./*.** Im
5920: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5930: 61 20 72 65 61 6c 70 61 74 68 28 29 20 6c 69 6b  a realpath() lik
5940: 65 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 76  e function for v
5950: 78 57 6f 72 6b 73 0a 2a 2a 20 74 6f 20 64 65 74  xWorks.** to det
5960: 65 72 6d 69 6e 65 20 63 61 6e 6f 6e 69 63 61 6c  ermine canonical
5970: 20 70 61 74 68 20 6e 61 6d 65 20 66 72 6f 6d 20   path name from 
5980: 67 69 76 65 6e 20 6e 61 6d 65 2e 20 49 74 20 64  given name. It d
5990: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 73 75 70 70 6f  oes.** not suppo
59a0: 72 74 20 73 79 6d 6c 69 6e 6b 73 2e 20 4e 65 69  rt symlinks. Nei
59b0: 74 68 65 72 20 64 6f 65 73 20 69 74 20 68 61 6e  ther does it han
59c0: 64 6c 65 20 76 6f 6c 75 6d 65 20 70 72 65 66 69  dle volume prefi
59d0: 78 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 0a 76  xes..*/.char *.v
59e0: 78 72 65 61 6c 70 61 74 68 28 63 6f 6e 73 74 20  xrealpath(const 
59f0: 63 68 61 72 20 2a 70 61 74 68 6e 61 6d 65 2c 20  char *pathname, 
5a00: 69 6e 74 20 64 6f 73 74 61 74 29 0a 7b 0a 20 20  int dostat).{.  
5a10: 73 74 72 75 63 74 20 73 74 61 74 20 73 62 75 66  struct stat sbuf
5a20: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ;.  int len;.  c
5a30: 68 61 72 20 2a 77 68 65 72 65 2c 20 2a 70 74 72  har *where, *ptr
5a40: 2c 20 2a 6c 61 73 74 3b 0a 20 20 63 68 61 72 20  , *last;.  char 
5a50: 2a 72 65 73 75 6c 74 2c 20 2a 63 75 72 70 61 74  *result, *curpat
5a60: 68 2c 20 2a 77 6f 72 6b 70 61 74 68 2c 20 2a 6e  h, *workpath, *n
5a70: 61 6d 65 62 75 66 3b 0a 0a 20 20 6c 65 6e 20 3d  amebuf;..  len =
5a80: 20 70 61 74 68 63 6f 6e 66 28 70 61 74 68 6e 61   pathconf(pathna
5a90: 6d 65 2c 20 5f 50 43 5f 50 41 54 48 5f 4d 41 58  me, _PC_PATH_MAX
5aa0: 29 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 30 20 29  );.  if( len<0 )
5ab0: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 50 41 54 48  {.    len = PATH
5ac0: 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 73 75  _MAX;.  }.  resu
5ad0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  lt = sqlite3_mal
5ae0: 6c 6f 63 28 6c 65 6e 20 2a 20 34 29 3b 0a 20 20  loc(len * 4);.  
5af0: 69 66 28 20 21 72 65 73 75 6c 74 20 29 7b 0a 20  if( !result ){. 
5b00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5b10: 0a 20 20 63 75 72 70 61 74 68 20 3d 20 72 65 73  .  curpath = res
5b20: 75 6c 74 20 2b 20 6c 65 6e 3b 0a 20 20 77 6f 72  ult + len;.  wor
5b30: 6b 70 61 74 68 20 3d 20 63 75 72 70 61 74 68 20  kpath = curpath 
5b40: 2b 20 6c 65 6e 3b 0a 20 20 6e 61 6d 65 62 75 66  + len;.  namebuf
5b50: 20 3d 20 77 6f 72 6b 70 61 74 68 20 2b 20 6c 65   = workpath + le
5b60: 6e 3b 0a 20 20 73 74 72 63 70 79 28 63 75 72 70  n;.  strcpy(curp
5b70: 61 74 68 2c 20 70 61 74 68 6e 61 6d 65 29 3b 0a  ath, pathname);.
5b80: 20 20 69 66 28 20 2a 70 61 74 68 6e 61 6d 65 21    if( *pathname!
5b90: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='/' ){.    if( 
5ba0: 21 67 65 74 63 77 64 28 77 6f 72 6b 70 61 74 68  !getcwd(workpath
5bb0: 2c 20 6c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  , len) ){.      
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 72 65 73  sqlite3_free(res
5bd0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ult);.      retu
5be0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 0;.    }.  }e
5bf0: 6c 73 65 7b 0a 20 20 20 20 2a 77 6f 72 6b 70 61  lse{.    *workpa
5c00: 74 68 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  th = '\0';.  }. 
5c10: 20 77 68 65 72 65 20 3d 20 63 75 72 70 61 74 68   where = curpath
5c20: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 77 68 65 72  ;.  while( *wher
5c30: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 74  e ){.    if( !st
5c40: 72 63 6d 70 28 77 68 65 72 65 2c 20 22 2e 22 29  rcmp(where, ".")
5c50: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 2b   ){.      where+
5c60: 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
5c70: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
5c80: 20 21 73 74 72 6e 63 6d 70 28 77 68 65 72 65 2c   !strncmp(where,
5c90: 20 22 2e 2f 22 2c 20 32 29 20 29 7b 0a 20 20 20   "./", 2) ){.   
5ca0: 20 20 20 77 68 65 72 65 20 2b 3d 20 32 3b 0a 20     where += 2;. 
5cb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5cc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 74     }.    if( !st
5cd0: 72 6e 63 6d 70 28 77 68 65 72 65 2c 20 22 2e 2e  rncmp(where, "..
5ce0: 2f 22 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20  /", 3) ){.      
5cf0: 77 68 65 72 65 20 2b 3d 20 33 3b 0a 20 20 20 20  where += 3;.    
5d00: 20 20 70 74 72 20 3d 20 6c 61 73 74 20 3d 20 77    ptr = last = w
5d10: 6f 72 6b 70 61 74 68 3b 0a 20 20 20 20 20 20 77  orkpath;.      w
5d20: 68 69 6c 65 28 20 2a 70 74 72 20 29 7b 0a 20 20  hile( *ptr ){.  
5d30: 20 20 20 20 20 20 69 66 28 20 2a 70 74 72 3d 3d        if( *ptr==
5d40: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
5d50: 20 6c 61 73 74 20 3d 20 70 74 72 3b 0a 20 20 20   last = ptr;.   
5d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
5d70: 74 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tr++;.      }.  
5d80: 20 20 20 20 2a 6c 61 73 74 20 3d 20 27 5c 30 27      *last = '\0'
5d90: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
5da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20  ;.    }.    ptr 
5db0: 3d 20 73 74 72 63 68 72 28 77 68 65 72 65 2c 20  = strchr(where, 
5dc0: 27 2f 27 29 3b 0a 20 20 20 20 69 66 28 20 21 70  '/');.    if( !p
5dd0: 74 72 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  tr ){.      ptr 
5de0: 3d 20 77 68 65 72 65 20 2b 20 73 74 72 6c 65 6e  = where + strlen
5df0: 28 77 68 65 72 65 29 20 2d 20 31 3b 0a 20 20 20  (where) - 1;.   
5e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
5e10: 74 72 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d  tr = '\0';.    }
5e20: 0a 20 20 20 20 73 74 72 63 70 79 28 6e 61 6d 65  .    strcpy(name
5e30: 62 75 66 2c 20 77 6f 72 6b 70 61 74 68 29 3b 0a  buf, workpath);.
5e40: 20 20 20 20 66 6f 72 28 20 6c 61 73 74 20 3d 20      for( last = 
5e50: 6e 61 6d 65 62 75 66 3b 20 2a 6c 61 73 74 3b 20  namebuf; *last; 
5e60: 6c 61 73 74 2b 2b 20 29 7b 0a 20 20 20 20 20 20  last++ ){.      
5e70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
5e80: 20 20 20 20 69 66 28 20 2a 2d 2d 6c 61 73 74 21      if( *--last!
5e90: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 73 74  ='/' ){.      st
5ea0: 72 63 61 74 28 6e 61 6d 65 62 75 66 2c 20 22 2f  rcat(namebuf, "/
5eb0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ");.    }.    st
5ec0: 72 63 61 74 28 6e 61 6d 65 62 75 66 2c 20 77 68  rcat(namebuf, wh
5ed0: 65 72 65 29 3b 0a 20 20 20 20 77 68 65 72 65 20  ere);.    where 
5ee0: 3d 20 2b 2b 70 74 72 3b 0a 20 20 20 20 69 66 28  = ++ptr;.    if(
5ef0: 20 64 6f 73 74 61 74 20 29 7b 0a 20 20 20 20 20   dostat ){.     
5f00: 20 69 66 28 20 73 74 61 74 28 6e 61 6d 65 62 75   if( stat(namebu
5f10: 66 2c 20 26 73 62 75 66 29 3d 3d 2d 31 20 29 7b  f, &sbuf)==-1 ){
5f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f30: 5f 66 72 65 65 28 72 65 73 75 6c 74 29 3b 0a 20  _free(result);. 
5f40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
5f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5f60: 66 28 20 28 73 62 75 66 2e 73 74 5f 6d 6f 64 65  f( (sbuf.st_mode
5f70: 20 26 20 53 5f 49 46 44 49 52 29 3d 3d 53 5f 49   & S_IFDIR)==S_I
5f80: 46 44 49 52 20 29 7b 0a 20 20 20 20 20 20 20 20  FDIR ){.        
5f90: 73 74 72 63 70 79 28 77 6f 72 6b 70 61 74 68 2c  strcpy(workpath,
5fa0: 20 6e 61 6d 65 62 75 66 29 3b 0a 20 20 20 20 20   namebuf);.     
5fb0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5fc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a     }.      if( *
5fd0: 77 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20  where ){.       
5fe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 72 65   sqlite3_free(re
5ff0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72  sult);.        r
6000: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
6010: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70  .    }.    strcp
6020: 79 28 77 6f 72 6b 70 61 74 68 2c 20 6e 61 6d 65  y(workpath, name
6030: 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  buf);.  }.  strc
6040: 70 79 28 72 65 73 75 6c 74 2c 20 77 6f 72 6b 70  py(result, workp
6050: 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ath);.  return r
6060: 65 73 75 6c 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a  esult;.}.#endif.
6070: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
6080: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
6090: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
60a0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
60b0: 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
60c0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
60d0: 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
60e0: 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
60f0: 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
6100: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
6110: 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
6120: 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
6130: 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
6140: 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
6150: 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
6160: 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  e *conchFile;.  
6170: 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50  char *conchFileP
6180: 61 74 68 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ath;.  unixFile 
6190: 2a 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 63 68  *lockProxy;.  ch
61a0: 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
61b0: 68 3b 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  h;.  char *dbPat
61c0: 68 3b 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  h;.  int conchHe
61d0: 6c 64 3b 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c  ld;.  void *oldL
61e0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 2f  ockingContext; /
61f0: 2a 20 70 72 65 73 65 72 76 65 20 74 68 65 20 6f  * preserve the o
6200: 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
6210: 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6c 6f 73  context for clos
6220: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
6230: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
6240: 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 2f 2a 20  *pOldMethod; /* 
6250: 64 69 74 74 6f 20 70 4d 65 74 68 6f 64 20 2a 2f  ditto pMethod */
6260: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .};..static int 
6270: 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  getDbPathForUnix
6280: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
6290: 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
62a0: 74 68 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  th);.static int 
62b0: 67 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  getLockPath(cons
62c0: 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
62d0: 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
62e0: 65 5f 74 20 6d 61 78 4c 65 6e 29 3b 0a 73 74 61  e_t maxLen);.sta
62f0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  tic sqlite3_io_m
6300: 65 74 68 6f 64 73 20 2a 69 6f 4d 65 74 68 6f 64  ethods *ioMethod
6310: 46 6f 72 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  ForLockingStyle(
6320: 69 6e 74 20 73 74 79 6c 65 29 3b 0a 73 74 61 74  int style);.stat
6330: 69 63 20 69 6e 74 20 63 72 65 61 74 65 50 72 6f  ic int createPro
6340: 78 79 55 6e 69 78 46 69 6c 65 28 63 6f 6e 73 74  xyUnixFile(const
6350: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75 6e 69   char *path, uni
6360: 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 29 3b  xFile **ppFile);
6370: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
6380: 49 6e 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  InUnixFile(sqlit
6390: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
63a0: 74 20 68 2c 20 69 6e 74 20 64 69 72 66 64 2c 20  t h, int dirfd, 
63b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
63c0: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
63d0: 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6e 6f  Filename, int no
63e0: 4c 6f 63 6b 2c 20 69 6e 74 20 69 73 44 65 6c 65  Lock, int isDele
63f0: 74 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  te);.static int 
6400: 74 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  takeConch(unixFi
6410: 6c 65 20 2a 70 46 69 6c 65 29 3b 0a 73 74 61 74  le *pFile);.stat
6420: 69 63 20 69 6e 74 20 72 65 6c 65 61 73 65 43 6f  ic int releaseCo
6430: 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
6440: 69 6c 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ile);.static int
6450: 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
6460: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
6470: 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
6480: 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
6490: 20 54 65 73 74 73 20 61 20 62 79 74 65 2d 72 61   Tests a byte-ra
64a0: 6e 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72  nge locking quer
64b0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 79 74 65  y to see if byte
64c0: 20 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65   range locks are
64d0: 20 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20   .** supported, 
64e0: 69 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62  if not we fall b
64f0: 61 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f  ack to dotlockLo
6500: 63 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2a 20 4f  ckingStyle..** O
6510: 6e 20 76 78 57 6f 72 6b 73 20 77 65 20 66 61 6c  n vxWorks we fal
6520: 6c 20 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 73  l back to nameds
6530: 65 6d 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2e 0a  emLockingStyle..
6540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
6550: 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 69  stLockingStyle(i
6560: 6e 74 20 66 64 29 7b 0a 20 20 73 74 72 75 63 74  nt fd){.  struct
6570: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
6580: 0a 0a 20 20 2f 2a 20 54 65 73 74 20 62 79 74 65  ..  /* Test byte
6590: 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
65a0: 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
65b0: 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
65c0: 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
65d0: 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
65e0: 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
65f0: 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
6600: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
6610: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
6620: 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
6630: 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
6640: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
6650: 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
6660: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
6670: 20 20 69 66 28 20 66 63 6e 74 6c 28 66 64 2c 20    if( fcntl(fd, 
6680: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
6690: 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
66a0: 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53  return LOCKING_S
66b0: 54 59 4c 45 5f 50 4f 53 49 58 3b 0a 20 20 7d 0a  TYLE_POSIX;.  }.
66c0: 20 20 0a 20 20 2f 2a 20 54 65 73 74 69 6e 67 20    .  /* Testing 
66d0: 66 6f 72 20 66 6c 6f 63 6b 28 29 20 63 61 6e 20  for flock() can 
66e0: 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73 69 74  give false posit
66f0: 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69 66 20  ives.  So if if 
6700: 74 68 65 20 61 62 6f 76 65 20 0a 20 20 2a 2a 20  the above .  ** 
6710: 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  test fails, then
6720: 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   we fall back to
6730: 20 75 73 69 6e 67 20 64 6f 74 2d 66 69 6c 65 20   using dot-file 
6740: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 6f  style locking (o
6750: 72 0a 20 20 2a 2a 20 6e 61 6d 65 64 2d 73 65 6d  r.  ** named-sem
6760: 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 6f  aphore locking o
6770: 6e 20 76 78 77 6f 72 6b 73 29 2e 0a 20 20 2a 2f  n vxworks)..  */
6780: 0a 20 20 72 65 74 75 72 6e 20 28 49 53 5f 56 58  .  return (IS_VX
6790: 57 4f 52 4b 53 20 3f 20 4c 4f 43 4b 49 4e 47 5f  WORKS ? LOCKING_
67a0: 53 54 59 4c 45 5f 4e 41 4d 45 44 53 45 4d 20 3a  STYLE_NAMEDSEM :
67b0: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44   LOCKING_STYLE_D
67c0: 4f 54 46 49 4c 45 29 3b 0a 7d 0a 23 65 6e 64 69  OTFILE);.}.#endi
67d0: 66 0a 0a 2f 2a 20 0a 2a 2a 20 49 66 20 53 51 4c  f../* .** If SQL
67e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
67f0: 4e 47 5f 53 54 59 4c 45 20 69 73 20 64 65 66 69  NG_STYLE is defi
6800: 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
6810: 6f 6e 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20  on Examines the 
6820: 0a 2a 2a 20 66 5f 66 73 74 79 70 65 6e 61 6d 65  .** f_fstypename
6830: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74   entry in the st
6840: 61 74 66 73 20 73 74 72 75 63 74 75 72 65 20 61  atfs structure a
6850: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 74  s returned by st
6860: 61 74 28 29 20 66 6f 72 20 0a 2a 2a 20 74 68 65  at() for .** the
6870: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73   file system hos
6880: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
6890: 65 20 66 69 6c 65 20 61 6e 64 20 73 65 6c 65 63  e file and selec
68a0: 74 73 20 20 74 68 65 20 61 70 70 72 6f 70 72 69  ts  the appropri
68b0: 61 74 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  ate.** locking s
68c0: 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 69 74  tyle based on it
68d0: 73 20 76 61 6c 75 65 2e 20 20 54 68 65 73 65 20  s value.  These 
68e0: 76 61 6c 75 65 73 20 61 6e 64 20 61 73 73 69 67  values and assig
68f0: 6e 6d 65 6e 74 73 20 61 72 65 20 0a 2a 2a 20 62  nments are .** b
6900: 61 73 65 64 20 6f 6e 20 44 61 72 77 69 6e 2f 4f  ased on Darwin/O
6910: 53 58 20 62 65 68 61 76 69 6f 72 20 61 6e 64 20  SX behavior and 
6920: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 68  have not been th
6930: 6f 72 6f 75 67 68 6c 79 20 74 65 73 74 65 64 20  oroughly tested 
6940: 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73  on .** other sys
6950: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  tems..**.** If S
6960: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
6970: 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 6e 6f  KING_STYLE is no
6980: 74 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20  t defined, this 
6990: 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 0a  function always.
69a0: 2a 2a 20 72 65 74 75 72 6e 73 20 4c 4f 43 4b 49  ** returns LOCKI
69b0: 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 2e 0a  NG_STYLE_POSIX..
69c0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
69d0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
69e0: 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  LE.static int de
69f0: 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  tectLockingStyle
6a00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6a10: 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
6a20: 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a  har *filePath, .
6a30: 20 20 69 6e 74 20 66 64 0a 29 7b 0a 23 69 66 20    int fd.){.#if 
6a40: 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  IS_VXWORKS.  if(
6a50: 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
6a60: 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47    return LOCKING
6a70: 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d  _STYLE_NONE;.  }
6a80: 0a 20 20 69 66 28 20 70 56 66 73 2d 3e 70 41 70  .  if( pVfs->pAp
6a90: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  pData ){.    ret
6aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  urn SQLITE_PTR_T
6ab0: 4f 5f 49 4e 54 28 70 56 66 73 2d 3e 70 41 70 70  O_INT(pVfs->pApp
6ac0: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 20  Data);.  }.  if 
6ad0: 28 61 63 63 65 73 73 28 66 69 6c 65 50 61 74 68  (access(filePath
6ae0: 2c 20 30 29 20 21 3d 20 2d 31 29 7b 0a 20 20 20  , 0) != -1){.   
6af0: 20 72 65 74 75 72 6e 20 74 65 73 74 4c 6f 63 6b   return testLock
6b00: 69 6e 67 53 74 79 6c 65 28 66 64 29 3b 0a 20 20  ingStyle(fd);.  
6b10: 7d 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  }.#else.  struct
6b20: 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
6b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
6b40: 73 79 73 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20  system;.    int 
6b50: 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  eLockingStyle;. 
6b60: 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
6b70: 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 4c 4f    { "hfs",    LO
6b80: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49  CKING_STYLE_POSI
6b90: 58 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  X },.    { "ufs"
6ba0: 2c 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  ,    LOCKING_STY
6bb0: 4c 45 5f 50 4f 53 49 58 20 7d 2c 0a 20 20 20 20  LE_POSIX },.    
6bc0: 7b 20 22 61 66 70 66 73 22 2c 20 20 4c 4f 43 4b  { "afpfs",  LOCK
6bd0: 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 7d 2c  ING_STYLE_AFP },
6be0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6bf0: 4e 41 42 4c 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e  NABLE_AFP_LOCKIN
6c00: 47 5f 53 4d 42 0a 20 20 20 20 7b 20 22 73 6d 62  G_SMB.    { "smb
6c10: 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54  fs",  LOCKING_ST
6c20: 59 4c 45 5f 41 46 50 20 7d 2c 0a 23 65 6c 73 65  YLE_AFP },.#else
6c30: 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
6c40: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46   LOCKING_STYLE_F
6c50: 4c 4f 43 4b 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  LOCK },.#endif. 
6c60: 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 4c     { "webdav", L
6c70: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e  OCKING_STYLE_NON
6c80: 45 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  E },.    { 0, 0 
6c90: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
6ca0: 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
6cb0: 66 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  fsInfo;..  if( !
6cc0: 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
6cd0: 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53  return LOCKING_S
6ce0: 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  TYLE_NONE;.  }. 
6cf0: 20 69 66 28 20 70 56 66 73 20 26 26 20 70 56 66   if( pVfs && pVf
6d00: 73 2d 3e 70 41 70 70 44 61 74 61 20 29 7b 0a 20  s->pAppData ){. 
6d10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6d20: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 66 73  _PTR_TO_INT(pVfs
6d30: 2d 3e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 7d  ->pAppData);.  }
6d40: 0a 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  ..  if( statfs(f
6d50: 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
6d60: 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
6d70: 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
6d80: 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
6d90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c  {.      return L
6da0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e  OCKING_STYLE_NON
6db0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  E;.    }.    for
6dc0: 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
6dd0: 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
6de0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
6df0: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
6e00: 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
6e10: 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
6e20: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6e30: 20 61 4d 61 70 5b 69 5d 2e 65 4c 6f 63 6b 69 6e   aMap[i].eLockin
6e40: 67 53 74 79 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  gStyle;.      }.
6e50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6e60: 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
6e70: 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
6e80: 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 20 2a 2f  thers, "nfs". */
6e90: 0a 20 20 72 65 74 75 72 6e 20 74 65 73 74 4c 6f  .  return testLo
6ea0: 63 6b 69 6e 67 53 74 79 6c 65 28 66 64 29 3b 20  ckingStyle(fd); 
6eb0: 20 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 20 49   .#endif /* if I
6ec0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
6ed0: 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54  eturn LOCKING_ST
6ee0: 59 4c 45 5f 50 4f 53 49 58 3b 0a 7d 0a 23 65 6c  YLE_POSIX;.}.#el
6ef0: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 64 65 74  se.  #define det
6f00: 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  ectLockingStyle(
6f10: 78 2c 79 2c 7a 29 20 4c 4f 43 4b 49 4e 47 5f 53  x,y,z) LOCKING_S
6f20: 54 59 4c 45 5f 50 4f 53 49 58 0a 23 65 6e 64 69  TYLE_POSIX.#endi
6f30: 66 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 45  f /* if SQLITE_E
6f40: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
6f50: 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  YLE */../*.** Gi
6f60: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
6f70: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f  iptor, locate lo
6f80: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
6f90: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68  nt structures th
6fa0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
6fb0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
6fc0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65  ptor.  Create ne
6fd0: 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73  w ones if necess
6fe0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
6ff0: 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74  urn values might
7000: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
7010: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
7020: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  curs..**.** Retu
7030: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
7040: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
7050: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
7060: 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78  LockInfo(.  unix
7070: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
7080: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
7090: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
70a0: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
70b0: 20 6b 65 79 20 2a 2f 0a 23 69 66 20 49 53 5f 56   key */.#if IS_V
70c0: 58 57 4f 52 4b 53 0a 20 20 76 6f 69 64 20 2a 72  XWORKS.  void *r
70d0: 6e 61 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  nam,            
70e0: 20 20 20 20 20 20 2f 2a 20 76 78 57 6f 72 6b 73        /* vxWorks
70f0: 20 72 65 61 6c 6e 61 6d 65 20 2a 2f 0a 23 65 6e   realname */.#en
7100: 64 69 66 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  dif.  struct loc
7110: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
7120: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7130: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
7140: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
7150: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
7160: 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65  pOpen      /* Re
7170: 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74  turn the openCnt
7180: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
7190: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
71a0: 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75    int fd;.  stru
71b0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
71c0: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
71d0: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
71e0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
71f0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
7200: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
7210: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
7220: 3b 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  ;.  fd = pFile->
7230: 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  h;.  rc = fstat(
7240: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
7250: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
7260: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
7270: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
7280: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
7290: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
72a0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
72b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
72c0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
72d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
72e0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _IOERR;.  }..  /
72f0: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
7300: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
7310: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
7320: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
7330: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
7340: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
7350: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
7360: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
7370: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
7380: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
7390: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
73a0: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
73b0: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
73c0: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
73d0: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
73e0: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
73f0: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
7400: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
7410: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
7420: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
7430: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
7440: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
7450: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
7460: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
7470: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
7480: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
7490: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
74a0: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
74b0: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
74c0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
74d0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
74e0: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
74f0: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
7500: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
7510: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
7520: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
7530: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
7540: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
7550: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
7560: 30 20 29 7b 0a 20 20 20 20 77 72 69 74 65 28 66  0 ){.    write(f
7570: 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20  d, "S", 1);.    
7580: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
7590: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
75a0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
75b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
75c0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
75d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
75e0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
75f0: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c  .  memset(&key1,
7600: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29   0, sizeof(key1)
7610: 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20  );.  key1.dev = 
7620: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
7630: 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20  #if IS_VXWORKS. 
7640: 20 6b 65 79 31 2e 72 6e 61 6d 20 3d 20 72 6e 61   key1.rnam = rna
7650: 6d 3b 0a 23 65 6c 73 65 0a 20 20 6b 65 79 31 2e  m;.#else.  key1.
7660: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
7670: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  _ino;.#endif.#if
7680: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
7690: 46 45 0a 20 20 69 66 28 20 74 68 72 65 61 64 73  FE.  if( threads
76a0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
76b0: 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20  rsLocks<0 ){.   
76c0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
76d0: 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a  ngBehavior(fd);.
76e0: 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20 3d    }.  key1.tid =
76f0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
7700: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
7710: 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65  ? 0 : pthread_se
7720: 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6d  lf();.#endif.  m
7730: 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20  emset(&key2, 0, 
7740: 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20  sizeof(key2));. 
7750: 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74   key2.dev = stat
7760: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
7770: 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6b 65 79  IS_VXWORKS.  key
7780: 32 2e 72 6e 61 6d 20 3d 20 72 6e 61 6d 3b 0a 23  2.rnam = rnam;.#
7790: 65 6c 73 65 0a 20 20 6b 65 79 32 2e 69 6e 6f 20  else.  key2.ino 
77a0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
77b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
77c0: 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  pLock!=0 ){.    
77d0: 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74  pLock = lockList
77e0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c 6f  ;.    while( pLo
77f0: 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6b 65  ck && memcmp(&ke
7800: 79 31 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  y1, &pLock->key,
7810: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 20 29   sizeof(key1)) )
7820: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
7830: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
7840: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63    }.    if( pLoc
7850: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  k==0 ){.      pL
7860: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ock = sqlite3_ma
7870: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c  lloc( sizeof(*pL
7880: 6f 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ock) );.      if
7890: 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ( pLock==0 ){.  
78a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
78b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
78c0: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
78d0: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d  ockinfo;.      }
78e0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65  .      pLock->ke
78f0: 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 20 20  y = key1;.      
7900: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b  pLock->nRef = 1;
7910: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
7920: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f  t = 0;.      pLo
7930: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30  ck->locktype = 0
7940: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  ;.      pLock->p
7950: 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b  Next = lockList;
7960: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50  .      pLock->pP
7970: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rev = 0;.      i
7980: 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c 6f  f( lockList ) lo
7990: 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  ckList->pPrev = 
79a0: 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 6c 6f 63  pLock;.      loc
79b0: 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20  kList = pLock;. 
79c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
79d0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pLock->nRef++;. 
79e0: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4c 6f 63 6b     }.    *ppLock
79f0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20   = pLock;.  }.  
7a00: 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b  if( ppOpen!=0 ){
7a10: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70 65  .    pOpen = ope
7a20: 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  nList;.    while
7a30: 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63 6d  ( pOpen && memcm
7a40: 70 28 26 6b 65 79 32 2c 20 26 70 4f 70 65 6e 2d  p(&key2, &pOpen-
7a50: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
7a60: 32 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  2)) ){.      pOp
7a70: 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  en = pOpen->pNex
7a80: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
7a90: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
7aa0: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
7ab0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
7ac0: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
7ad0: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
7ae0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
7af0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
7b00: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
7b10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7b20: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
7b30: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
7b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
7b50: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
7b60: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
7b70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
7b80: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
7b90: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
7ba0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
7bb0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
7bc0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
7bd0: 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73  >pNext = openLis
7be0: 74 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  t;.      pOpen->
7bf0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
7c00: 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20   if( openList ) 
7c10: 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20  openList->pPrev 
7c20: 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f  = pOpen;.      o
7c30: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b  penList = pOpen;
7c40: 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a  .#if IS_VXWORKS.
7c50: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 53 65        pOpen->pSe
7c60: 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  m = NULL;.      
7c70: 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b  pOpen->aSemName[
7c80: 30 5d 20 3d 20 27 5c 30 27 3b 0a 23 65 6e 64 69  0] = '\0';.#endi
7c90: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
7ca0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b     pOpen->nRef++
7cb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f  ;.    }.    *ppO
7cc0: 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d  pen = pOpen;.  }
7cd0: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
7ce0: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
7cf0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
7d00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
7d10: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
7d20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
7d30: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
7d40: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
7d50: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
7d60: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
7d70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
7d80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
7d90: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
7da0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
7db0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7dc0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74  locktypeName(int
7dd0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77   locktype){.  sw
7de0: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
7df0: 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b  {.  case NO_LOCK
7e00: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
7e10: 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c  .  case SHARED_L
7e20: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
7e30: 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53  RED";.  case RES
7e40: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
7e50: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
7e60: 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f   case PENDING_LO
7e70: 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44  CK: return "PEND
7e80: 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43  ING";.  case EXC
7e90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
7ea0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
7eb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
7ec0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
7ed0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
7ee0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20   currently in a 
7ef0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
7f00: 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64   than the thread
7f10: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69   that the.** uni
7f20: 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62  xFile argument b
7f30: 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20  elongs to, then 
7f40: 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  transfer ownersh
7f50: 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ip of the unixFi
7f60: 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68  le.** over to th
7f70: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
7f80: 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69  ..**.** A unixFi
7f90: 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64  le is only owned
7fa0: 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20   by a thread on 
7fb0: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e  systems where on
7fc0: 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75  e thread is.** u
7fd0: 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64  nable to overrid
7fe0: 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  e locks created 
7ff0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
8000: 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20  hread.  RedHat9 
8010: 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65  is.** an example
8020: 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65   of such a syste
8030: 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68  m..**.** Ownersh
8040: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f  ip transfer is o
8050: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74  nly allowed if t
8060: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63  he unixFile is c
8070: 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
8080: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69  d..** If the uni
8090: 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20  xFile is locked 
80a0: 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70  and an ownership
80b0: 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20   is wrong, then 
80c0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
80d0: 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45  _MISUSE.  SQLITE
80e0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
80f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
8100: 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  rks..*/.#if SQLI
8110: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73 74  TE_THREADSAFE.st
8120: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65  atic int transfe
8130: 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46  rOwnership(unixF
8140: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
8150: 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64  nt rc;.  pthread
8160: 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20  _t hSelf;.  if( 
8170: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
8180: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29  achOthersLocks )
8190: 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68  {.    /* Ownersh
81a0: 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74  ip transfers not
81b0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20   needed on this 
81c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65  system */.    re
81d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
81e0: 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74    }.  hSelf = pt
81f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
8200: 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61  if( pthread_equa
8210: 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  l(pFile->tid, hS
8220: 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  elf) ){.    /* W
8230: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
8240: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a  he same thread *
8250: 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22  /.    OSTRACE1("
8260: 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d  No-transfer, sam
8270: 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20  e thread\n");.  
8280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8290: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  OK;.  }.  if( pF
82a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
82b0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
82c0: 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67   We cannot chang
82d0: 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c  e ownership whil
82e0: 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  e we are holding
82f0: 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20   a lock! */.    
8300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8310: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  SUSE;.  }.  OSTR
8320: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
8330: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
8340: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
8350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
8360: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69  le->h, pFile->ti
8370: 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69  d, hSelf);.  pFi
8380: 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b  le->tid = hSelf;
8390: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c  .  if (pFile->pL
83a0: 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ock != NULL) {. 
83b0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
83c0: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
83d0: 3b 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53  ;.#if IS_VXWORKS
83e0: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
83f0: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2c 20 70 46  ckInfo(pFile, pF
8400: 69 6c 65 2d 3e 7a 52 65 61 6c 70 61 74 68 2c 20  ile->zRealpath, 
8410: 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30  &pFile->pLock, 0
8420: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  );.#else.    rc 
8430: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
8440: 46 69 6c 65 2c 20 26 70 46 69 6c 65 2d 3e 70 4c  File, &pFile->pL
8450: 6f 63 6b 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ock, 0);.#endif.
8460: 20 20 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f      OSTRACE5("LO
8470: 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20  CK    %d is now 
8480: 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46  %s(%s,%d)\n", pF
8490: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
84a0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
84b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
84c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
84d0: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
84e0: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
84f0: 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  ), pFile->pLock-
8500: 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72  >cnt);.    retur
8510: 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
8520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8530: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  TE_OK;.  }.}.#el
8540: 73 65 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c  se.  /* On singl
8550: 65 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64  e-threaded build
8560: 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61  s, ownership tra
8570: 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70  nsfer is a no-op
8580: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61   */.# define tra
8590: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58  nsferOwnership(X
85a0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
85b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  if../*.** Seek t
85c0: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
85d0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
85e0: 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
85f0: 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
8600: 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
8610: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8620: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
8630: 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
8640: 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
8650: 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
8660: 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
8670: 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
8680: 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
8690: 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
86a0: 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
86b0: 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
86c0: 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
86d0: 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
86e0: 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
86f0: 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
8700: 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
8710: 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
8720: 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
8730: 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
8740: 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
8750: 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
8760: 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
8770: 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
8780: 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
8790: 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
87a0: 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
87b0: 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
87c0: 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
87d0: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
87e0: 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
87f0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
8800: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
8810: 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
8820: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
8830: 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
8840: 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
8850: 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
8860: 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
8870: 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e  got = pread(id->
8880: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
8890: 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
88a0: 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
88b0: 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
88c0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
88d0: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34  .  got = pread64
88e0: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
88f0: 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
8900: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
8910: 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
8920: 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
8930: 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
8940: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
8950: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
8960: 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
8970: 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
8980: 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
8990: 69 66 28 20 6e 65 77 4f 66 66 65 74 20 3d 3d 20  if( newOffet == 
89a0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
89b0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
89c0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
89d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
89e0: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
89f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
8a00: 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
8a10: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
8a20: 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c  ot = read(id->h,
8a30: 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
8a40: 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
8a50: 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
8a60: 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
8a70: 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
8a80: 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53   errno;.  }.  OS
8a90: 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20 20  TRACE5("READ    
8aa0: 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
8ab0: 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
8ac0: 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
8ad0: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
8ae0: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
8af0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
8b00: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
8b10: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
8b20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
8b30: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
8b40: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
8b50: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
8b60: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
8b70: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
8b80: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
8b90: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
8ba0: 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
8bb0: 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
8bc0: 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
8bd0: 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
8be0: 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
8bf0: 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74 20 3d  t( id );.  got =
8c00: 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
8c10: 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73  ixFile*)id, offs
8c20: 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
8c30: 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
8c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8c50: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
8c60: 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
8c70: 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
8c80: 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
8c90: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
8ca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
8cb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
8cc0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
8cd0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
8ce0: 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
8cf0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55  rror */.    /* U
8d00: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
8d10: 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
8d20: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
8d30: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
8d40: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
8d50: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
8d60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8d70: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
8d80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8d90: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
8da0: 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
8db0: 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
8dc0: 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
8dd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8de0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
8df0: 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
8e00: 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
8e10: 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
8e20: 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
8e30: 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
8e40: 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
8e50: 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
8e60: 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
8e70: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
8e80: 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
8e90: 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
8ea0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
8eb0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
8ec0: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
8ed0: 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f   got;.  i64 newO
8ee0: 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53  ffset;.  TIMER_S
8ef0: 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
8f00: 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
8f10: 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e  ot = pwrite(id->
8f20: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
8f30: 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66  fset);.#elif def
8f40: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
8f50: 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
8f60: 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
8f70: 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65  cnt, offset);.#e
8f80: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
8f90: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
8fa0: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
8fb0: 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
8fc0: 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
8fd0: 20 69 66 28 20 6e 65 77 4f 66 66 65 74 20 3d 3d   if( newOffet ==
8fe0: 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
8ff0: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
9000: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
9010: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9020: 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
9030: 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
9040: 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
9050: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
9060: 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e  got = write(id->
9070: 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
9080: 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
9090: 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
90a0: 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
90b0: 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
90c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
90d0: 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54 45   OSTRACE5("WRITE
90e0: 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
90f0: 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
9100: 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
9110: 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20  IMER_ELAPSED);. 
9120: 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
9130: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
9140: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
9150: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
9160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
9170: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
9180: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
9190: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
91a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91b0: 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
91c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
91d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
91e0: 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
91f0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
9200: 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74  offset .){.  int
9210: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
9220: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
9230: 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
9240: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
9250: 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
9260: 64 57 72 69 74 65 28 28 75 6e 69 78 46 69 6c 65  dWrite((unixFile
9270: 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42  *)id, offset, pB
9280: 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
9290: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
92a0: 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
92b0: 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
92c0: 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
92d0: 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
92e0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
92f0: 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
9300: 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
9310: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
9320: 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
9330: 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  );.  if( amt>0 )
9340: 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
9350: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  0 ){.      /* la
9360: 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
9370: 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
9380: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9390: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
93a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93b0: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
93c0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
93d0: 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
93e0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
93f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
9400: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
9410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9420: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
9430: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
9440: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
9450: 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
9460: 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
9470: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
9480: 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
9490: 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
94a0: 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
94b0: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
94c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
94d0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
94e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
94f0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
9510: 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28  e the fdatasync(
9520: 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68  ) API only if th
9530: 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  e HAVE_FDATASYNC
9540: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
9550: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  d..** Otherwise 
9560: 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69  use fsync() in i
9570: 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66  ts place..*/.#if
9580: 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53  ndef HAVE_FDATAS
9590: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
95a0: 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
95b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
95c0: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
95d0: 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
95e0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
95f0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
9600: 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
9610: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
9620: 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
9630: 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
9640: 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
9650: 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
9660: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
9670: 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
9680: 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
9690: 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
96a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
96b0: 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
96c0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
96d0: 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
96e0: 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
96f0: 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
9700: 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
9710: 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
9720: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
9730: 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
9740: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
9750: 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
9760: 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
9770: 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
9780: 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
9790: 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
97a0: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
97b0: 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
97c0: 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
97d0: 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
97e0: 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
97f0: 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
9800: 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
9810: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
9820: 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
9830: 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
9840: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
9850: 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
9860: 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
9870: 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
9880: 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
9890: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
98a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
98b0: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
98c0: 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
98d0: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
98e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
98f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
9900: 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
9910: 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
9920: 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
9930: 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
9940: 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
9950: 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
9960: 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
9970: 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
9980: 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
9990: 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
99a0: 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
99b0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
99c0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
99d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
99e0: 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
99f0: 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
9a00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
9a10: 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
9a20: 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
9a30: 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
9a40: 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
9a50: 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
9a60: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
9a70: 6c 53 79 6e 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  lSync);.#endif..
9a80: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
9a90: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
9aa0: 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
9ab0: 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
9ac0: 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
9ad0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
9ae0: 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
9af0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
9b00: 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
9b10: 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
9b20: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
9b30: 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
9b40: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
9b50: 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
9b60: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
9b70: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
9b80: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
9b90: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
9ba0: 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
9bb0: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
9bc0: 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
9bd0: 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
9be0: 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
9bf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
9c00: 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
9c10: 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
9c20: 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
9c30: 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
9c40: 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
9c50: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
9c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9c70: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
9c80: 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
9c90: 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
9ca0: 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
9cb0: 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 20   an fsync()..   
9cc0: 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
9cd0: 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
9ce0: 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
9cf0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
9d00: 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20    * file system 
9d10: 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
9d20: 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
9d30: 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
9d40: 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74   * isn't support
9d50: 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
9d60: 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
9d70: 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
9d80: 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77    * and (for now
9d90: 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
9da0: 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
9db0: 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
9dc0: 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20 62  l.  .   * It'd b
9dd0: 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
9de0: 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
9df0: 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
9e00: 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66 63  oid .   * the fc
9e10: 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
9e20: 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
9e30: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  ed..   */.  if( 
9e40: 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
9e50: 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69  fd);..#else .  i
9e60: 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20  f( dataOnly ){. 
9e70: 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e     rc = fdatasyn
9e80: 63 28 66 64 29 3b 0a 20 20 20 20 69 66 28 20 49  c(fd);.    if( I
9e90: 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 3d  S_VXWORKS && rc=
9ea0: 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
9eb0: 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 20 20 72  OTSUP ){.      r
9ec0: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
9ed0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9ee0: 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
9ef0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
9f00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
9f10: 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
9f20: 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
9f30: 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( IS_VXWORKS &&
9f40: 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
9f50: 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
9f60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9f70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
9f80: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
9f90: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
9fa0: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
9fb0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
9fc0: 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
9fd0: 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
9fe0: 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
9ff0: 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
a000: 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
a010: 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
a020: 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
a030: 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
a040: 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
a050: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
a060: 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
a070: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a080: 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
a090: 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
a0a0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
a0b0: 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
a0c0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
a0d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
a0e0: 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
a0f0: 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
a100: 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
a110: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
a120: 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
a130: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
a140: 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
a150: 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
a160: 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
a170: 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
a180: 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
a190: 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
a1a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
a1b0: 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
a1c0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
a1d0: 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
a1e0: 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
a1f0: 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
a200: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
a210: 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
a220: 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
a230: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
a240: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
a250: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
a260: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
a270: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
a280: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
a290: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
a2a0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
a2b0: 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
a2c0: 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
a2d0: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
a2e0: 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
a2f0: 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
a300: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
a310: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
a320: 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
a330: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
a340: 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
a350: 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
a360: 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
a370: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
a380: 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
a390: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
a3a0: 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
a3b0: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
a3c0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
a3d0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
a3e0: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
a3f0: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
a400: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
a410: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
a420: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
a430: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
a440: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
a450: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
a460: 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
a470: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
a480: 53 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20  STRACE2("SYNC   
a490: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
a4a0: 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  >h);.  rc = full
a4b0: 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
a4c0: 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
a4d0: 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
a4e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
a4f0: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
a500: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
a510: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a530: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20  _IOERR_FSYNC;.  
a540: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  }.  if( pFile->d
a550: 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69  irfd>=0 ){.    i
a560: 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52  nt err;.    OSTR
a570: 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d  ACE4("DIRSYNC %-
a580: 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  3d (have_fullfsy
a590: 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
a5a0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69  d)\n", pFile->di
a5b0: 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rfd,.           
a5c0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
a5d0: 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69   isFullsync);.#i
a5e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
a5f0: 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20  ABLE_DIRSYNC.   
a600: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72   /* The director
a610: 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61  y sync is only a
a620: 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c  ttempted if full
a630: 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a  _fsync is.    **
a640: 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75   turned off or u
a650: 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20  navailable.  If 
a660: 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63  a full_fsync occ
a670: 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20  urred above,.   
a680: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72   ** then the dir
a690: 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73  ectory sync is s
a6a0: 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20  uperfluous..    
a6b0: 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56  */.    if( (!HAV
a6c0: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21  E_FULLFSYNC || !
a6d0: 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66  isFullsync) && f
a6e0: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
a6f0: 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20  >dirfd,0,0) ){. 
a700: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
a710: 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69  ** We have recei
a720: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70  ved multiple rep
a730: 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20  orts of fsync() 
a740: 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  returning.      
a750: 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20   ** errors when 
a760: 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63  applied to direc
a770: 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69  tories on certai
a780: 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a  n file systems..
a790: 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c         ** A fail
a7a0: 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  ed directory syn
a7b0: 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64  c is not a big d
a7c0: 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d  eal.  So it seem
a7d0: 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74  s.       ** bett
a7e0: 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
a7f0: 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20   error.  Ticket 
a800: 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a  #1657.       */.
a810: 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d         /* pFile-
a820: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a830: 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a  no; */.       /*
a840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a850: 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23  OERR; */.    }.#
a860: 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20  endif.    err = 
a870: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
a880: 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  fd); /* Only nee
a890: 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
a8a0: 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a  so close the */.
a8b0: 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
a8c0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  {              /
a8d0: 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e  * directory when
a8e0: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a   we are done */.
a8f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72        pFile->dir
a900: 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  fd = -1;.    }el
a910: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
a920: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a930: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
a940: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
a950: 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CLOSE;.    }.  }
a960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a970: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
a980: 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
a990: 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
a9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a9b0: 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
a9c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
a9d0: 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  4 nByte){.  int 
a9e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
a9f0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
aa00: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
aa10: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
aa20: 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  ATE );.  rc = ft
aa30: 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69  runcate(((unixFi
aa40: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66  le*)id)->h, (off
aa50: 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
aa60: 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   rc ){.    ((uni
aa70: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
aa80: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
aa90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aaa0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
aab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
aac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
aad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
aae0: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
aaf0: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
ab00: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
ab10: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
ab20: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
ab30: 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
ab40: 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
ab50: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
ab60: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
ab70: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28  ;.  rc = fstat((
ab80: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
ab90: 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
aba0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
abb0: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
abc0: 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
abd0: 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
abe0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
abf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ac00: 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
ac10: 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
ac20: 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
ac30: 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
ac40: 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
ac50: 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  the findLockInfo
ac60: 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
ac70: 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
ac80: 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
ac90: 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
aca0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
acb0: 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
acc0: 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
acd0: 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
ace0: 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
acf0: 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
ad00: 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
ad10: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
ad20: 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
ad30: 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
ad40: 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
ad50: 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
ad60: 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
ad70: 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
ad80: 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
ad90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ada0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
adb0: 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61  ine translates a
adc0: 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20   standard POSIX 
add0: 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20  errno code into 
ade0: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65  something.** use
adf0: 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ful to the clien
ae00: 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ts of the sqlite
ae10: 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70  3 functions.  Sp
ae20: 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69  ecifically, it i
ae30: 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f  s.** intended to
ae40: 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72   translate a var
ae50: 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61  iety of "try aga
ae60: 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  in" errors into 
ae70: 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61  SQLITE_BUSY.** a
ae80: 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  nd a variety of 
ae90: 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68  "please close th
aea0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
aeb0: 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e  r NOW" errors in
aec0: 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  to .** SQLITE_IO
aed0: 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72  ERR.** .** Error
aee0: 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  s during initial
aef0: 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  ization of locks
af00: 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d  , or file system
af10: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63   support for loc
af20: 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61  ks,.** should ha
af30: 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f  ndle ENOLCK, ENO
af40: 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50  TSUP, EOPNOTSUPP
af50: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
af60: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
af70: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
af80: 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72  rror(int posixEr
af90: 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49  ror, int sqliteI
afa0: 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68  OErr) {.  switch
afb0: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
afc0: 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72    case 0: .    r
afd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
afe0: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 47  .    .  case EAG
aff0: 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d  AIN:.  case ETIM
b000: 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42  EDOUT:.  case EB
b010: 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54  USY:.  case EINT
b020: 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b  R:.  case ENOLCK
b030: 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f  :  .    /* rando
b040: 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f  m NFS retry erro
b050: 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  r, unless during
b060: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
b070: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
b080: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
b090: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
b0a0: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
b0b0: 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ays */.    retur
b0c0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
b0d0: 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45     .  case EACCE
b0e0: 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45  S: .    /* EACCE
b0f0: 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e  S is like EAGAIN
b100: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
b110: 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20  operations, but 
b120: 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69  not any other ti
b130: 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71  me*/.    if( (sq
b140: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
b150: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20  ITE_IOERR_LOCK) 
b160: 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72  || ..(sqliteIOEr
b170: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
b180: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  R_UNLOCK) || ..(
b190: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
b1a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b1b0: 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49  CK) ||..(sqliteI
b1c0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
b1d0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
b1e0: 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  EDLOCK) ){.     
b1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b200: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  USY;.    }.    /
b210: 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f  * else fall thro
b220: 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50  ugh */.  case EP
b230: 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ERM: .    return
b240: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
b250: 20 20 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c    .  case EDEADL
b260: 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K:.    return SQ
b270: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
b280: 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50  ED;.    .#if EOP
b290: 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50  NOTSUPP!=ENOTSUP
b2a0: 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55  .  case EOPNOTSU
b2b0: 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65  PP: .    /* some
b2c0: 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69  thing went terri
b2d0: 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73  bly awry, unless
b2e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
b2f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
b300: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
b310: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
b320: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
b330: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
b340: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54  ndif.#ifdef ENOT
b350: 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53  SUP.  case ENOTS
b360: 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61  UP: .    /* inva
b370: 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64  lid fd, unless d
b380: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
b390: 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73  m support intros
b3a0: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
b3b0: 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74  h .     * it act
b3c0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
b3d0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
b3e0: 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20  if.  case EIO:. 
b3f0: 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63   case EBADF:.  c
b400: 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61  ase EINVAL:.  ca
b410: 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63  se ENOTCONN:.  c
b420: 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61  ase ENODEV:.  ca
b430: 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65  se ENXIO:.  case
b440: 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20   ENOENT:.  case 
b450: 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45  ESTALE:.  case E
b460: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
b470: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
b480: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
b490: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
b4a0: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
b4b0: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
b4c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
b4d0: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eIOErr;.  }.}../
b4e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b4f0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
b500: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
b510: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
b520: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
b530: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
b540: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
b550: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
b560: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
b570: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
b580: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
b590: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
b5a0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
b5b0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
b5c0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
b5d0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
b5e0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
b5f0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
b600: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
b610: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
b620: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
b630: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
b640: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
b650: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b660: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
b670: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
b680: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
b690: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
b6a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
b6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b6c0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b6d0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
b6e0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
b6f0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  enterMutex(); /*
b700: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
b710: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
b720: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
b730: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
b740: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
b750: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
b760: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
b770: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63   if( pFile->pLoc
b780: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  k->locktype>SHAR
b790: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
b7a0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
b7b0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
b7c0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
b7d0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
b7e0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
b7f0: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
b800: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b810: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b820: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b830: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b840: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b850: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b860: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b870: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b880: 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d  K;.    if (-1 ==
b890: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
b8a0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
b8b0: 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ) {.      int tE
b8c0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b8d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b8e0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b8f0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b900: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b910: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
b920: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b930: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
b940: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
b950: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
b960: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
b970: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
b980: 7d 0a 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65  }.  .  leaveMute
b990: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28  x();.  OSTRACE4(
b9a0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
b9b0: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
b9c0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
b9d0: 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
b9e0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
b9f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ba00: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
ba10: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
ba20: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
ba30: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
ba40: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
ba50: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
ba60: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
ba70: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
ba80: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
ba90: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
baa0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
bab0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
bac0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
bad0: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
bae0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
baf0: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
bb00: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
bb10: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
bb20: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
bb30: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
bb40: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
bb50: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
bb60: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
bb70: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
bb80: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
bb90: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
bba0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
bbb0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
bbc0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
bbd0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
bbe0: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
bbf0: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
bc00: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
bc10: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
bc20: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
bc30: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
bc40: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
bc50: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
bc60: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
bc70: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
bc80: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
bc90: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
bca0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
bcb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bcc0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
bcd0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
bce0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
bcf0: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
bd00: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
bd10: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
bd20: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
bd30: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
bd40: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
bd50: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
bd60: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
bd70: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
bd80: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
bd90: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
bda0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
bdb0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
bdc0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
bdd0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
bde0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
bdf0: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
be00: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
be10: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
be20: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
be30: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
be40: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
be50: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
be60: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
be70: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
be80: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
be90: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
bea0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
beb0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
bec0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
bed0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
bee0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
bef0: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
bf00: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
bf10: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
bf20: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
bf30: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
bf40: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
bf50: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
bf60: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
bf70: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
bf80: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
bf90: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
bfa0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
bfb0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
bfc0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
bfd0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
bfe0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
bff0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
c000: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
c010: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
c020: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
c030: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
c040: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
c050: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
c060: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c070: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
c080: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
c090: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
c0a0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
c0b0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
c0c0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c0d0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
c0e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
c0f0: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
c100: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
c110: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
c120: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
c130: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
c140: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
c150: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
c160: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
c170: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
c180: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
c190: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
c1a0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
c1b0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
c1c0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
c1d0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
c1e0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
c1f0: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
c200: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c210: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
c220: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
c230: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
c240: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
c250: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
c260: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
c270: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
c280: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
c290: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
c2a0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
c2b0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
c2c0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
c2d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
c2e0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
c2f0: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
c300: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
c310: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
c320: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
c330: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
c340: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
c350: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
c360: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
c370: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
c380: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
c390: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
c3a0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
c3b0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
c3c0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
c3d0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
c3e0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
c3f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
c400: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
c410: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
c420: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
c430: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
c440: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
c450: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
c460: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
c470: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
c480: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
c490: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
c4a0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
c4b0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
c4c0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
c4d0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
c4e0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
c4f0: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
c500: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
c510: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
c520: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
c530: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
c540: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
c550: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
c560: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
c570: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
c580: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
c590: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c5a0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
c5b0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c5c0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
c5d0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
c5e0: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
c5f0: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
c600: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
c610: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
c620: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
c630: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
c640: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
c650: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
c660: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
c670: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
c680: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
c690: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
c6a0: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
c6b0: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
c6c0: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
c6d0: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
c6e0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
c6f0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
c700: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
c710: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
c720: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
c730: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
c740: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
c750: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
c760: 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72  h, as.  ** enter
c770: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
c780: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
c790: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
c7a0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
c7b0: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
c7c0: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
c7d0: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
c7e0: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
c7f0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
c800: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
c810: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74  ktype));.    ret
c820: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c830: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
c840: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
c850: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
c860: 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
c870: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
c880: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
c890: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
c8a0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
c8b0: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
c8c0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
c8d0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
c8e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c8f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
c900: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c910: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
c920: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
c930: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
c940: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
c950: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
c960: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  enterMutex();.. 
c970: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
c980: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
c990: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
c9a0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
c9b0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
c9c0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
c9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c9e0: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
c9f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ca00: 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69   }.  pLock = pFi
ca10: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  le->pLock;..  /*
ca20: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
ca30: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
ca40: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
ca50: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
ca60: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
ca70: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
ca80: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
ca90: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
caa0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
cab0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f  e->locktype!=pLo
cac0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20  ck->locktype && 
cad0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63  .          (pLoc
cae0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  k->locktype>=PEN
caf0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  DING_LOCK || loc
cb00: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
cb10: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
cb20: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
cb30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
cb40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
cb50: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
cb60: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
cb70: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
cb80: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
cb90: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
cba0: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
cbb0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
cbc0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
cbd0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
cbe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
cbf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
cc00: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
cc10: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f  K && .      (pLo
cc20: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  ck->locktype==SH
cc30: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  ARED_LOCK || pLo
cc40: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  ck->locktype==RE
cc50: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
cc60: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
cc70: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
cc80: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
cc90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
cca0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ccb0: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  t( pLock->cnt>0 
ccc0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
ccd0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
cce0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
ccf0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c  >cnt++;.    pFil
cd00: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
cd10: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
cd20: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63  lock;.  }..  loc
cd30: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20  k.l_len = 1L;.. 
cd40: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
cd50: 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a   SEEK_SET;..  /*
cd60: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
cd70: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
cd80: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
cd90: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
cda0: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
cdb0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
cdc0: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
cdd0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
cde0: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
cdf0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
ce00: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
ce10: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
ce20: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
ce30: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
ce40: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
ce50: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
ce60: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
ce70: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63  ck.l_type = (loc
ce80: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ce90: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
cea0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
ceb0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
cec0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
ced0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
cee0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
cef0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
cf00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
cf10: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
cf20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
cf30: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
cf40: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
cf50: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
cf60: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
cf70: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
cf80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
cf90: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
cfa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
cfb0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
cfc0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
cfd0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
cfe0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
cff0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
d000: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
d010: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
d020: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
d030: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
d040: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
d050: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
d060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   ){.    int tErr
d070: 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  no = 0;.    asse
d080: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  rt( pLock->cnt==
d090: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d0a0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
d0b0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
d0c0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d0d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d0e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d0f0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d100: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d110: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
d120: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
d130: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
d140: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
d150: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d160: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
d170: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
d180: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
d190: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d1a0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
d1b0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
d1c0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
d1d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d1e0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
d1f0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
d200: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
d210: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
d220: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
d230: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
d240: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
d250: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
d260: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d270: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
d280: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d290: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d2a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d2b0: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
d2c0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d2d0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d2e0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d2f0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d310: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
d320: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
d330: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
d340: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d350: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d360: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d370: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
d380: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
d390: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d3a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d3b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d3c0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
d3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d3e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
d3f0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
d400: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65       pFile->pOpe
d410: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
d420: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31    pLock->cnt = 1
d430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
d440: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
d450: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
d460: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a  pLock->cnt>1 ){.
d470: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
d480: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
d490: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
d4a0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
d4b0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
d4c0: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
d4d0: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
d4e0: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
d4f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d500: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
d510: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
d520: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
d530: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
d540: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
d550: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
d560: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
d570: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
d580: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
d590: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
d5a0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
d5b0: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
d5c0: 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ype );.    lock.
d5d0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
d5e0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f  ;.    switch( lo
d5f0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  cktype ){.      
d600: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
d610: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
d620: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
d630: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
d640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d650: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
d660: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
d670: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d680: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
d690: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d6a0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
d6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d6c0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
d6d0: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
d6e0: 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  }.    s = fcntl(
d6f0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
d700: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
d710: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
d720: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
d730: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d740: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d750: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d760: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d770: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
d780: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d790: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d7a0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d7b0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d7c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
d7d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d7e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
d7f0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
d800: 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  ktype;.    pLock
d810: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
d820: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
d830: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
d840: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
d850: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
d860: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
d870: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
d880: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
d890: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
d8a0: 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74  lock:.  leaveMut
d8b0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
d8c0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
d8d0: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
d8e0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
d8f0: 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
d900: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
d910: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
d920: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d930: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
d940: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d950: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d960: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
d970: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
d980: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
d990: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
d9a0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
d9b0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
d9c0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
d9d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
d9e0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
d9f0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
da00: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
da10: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
da20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
da30: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
da40: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
da50: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
da60: 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20 6c  ype){.  struct l
da70: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a  ockInfo *pLock;.
da80: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
da90: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
daa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
dab0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
dac0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
dad0: 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72 74  int h;..  assert
dae0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
daf0: 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE7("UNLOCK  %
db00: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
db10: 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  d) pid=%d\n", pF
db20: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
db30: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ,.      pFile->l
db40: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
db50: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pLock->locktype,
db60: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
db70: 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  nt, getpid());..
db80: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
db90: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
dba0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
dbb0: 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79  locktype<=lockty
dbc0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
dbd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
dbe0: 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45    if( CHECK_THRE
dbf0: 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20  ADID(pFile) ){. 
dc00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc10: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65  _MISUSE;.  }.  e
dc20: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68  nterMutex();.  h
dc30: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70   = pFile->h;.  p
dc40: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
dc50: 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ock;.  assert( p
dc60: 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a  Lock->cnt!=0 );.
dc70: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
dc80: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
dc90: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
dca0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
dcb0: 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ==pFile->locktyp
dcc0: 65 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  e );.    Simulat
dcd0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
dce0: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
dcf0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
dd00: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
dd10: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
dd20: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
dd30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
dd40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
dd50: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
dd60: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
dd70: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
dd80: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dd90: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
dda0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ddb0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
ddc0: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
ddd0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
dde0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
ddf0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
de00: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
de10: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
de20: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
de30: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
de40: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
de50: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
de60: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
de70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
de80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
de90: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 09 09 09  o;.        }....
dea0: 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b  .goto end_unlock
deb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dec0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ded0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
dee0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
def0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
df00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
df10: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
df20: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
df30: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
df40: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
df50: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
df60: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
df70: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20  K, &lock)!=(-1) 
df80: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  ){.      pLock->
df90: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
dfa0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
dfb0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  e{.      int tEr
dfc0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dfd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dfe0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dff0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
e000: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
e010: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e020: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e030: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
e040: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
e050: 3b 0a 20 20 20 20 20 20 7d 0a 09 09 09 67 6f 74  ;.      }....got
e060: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e070: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f    }.  }.  if( lo
e080: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
e090: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  ){.    struct op
e0a0: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
e0b0: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e0c0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e0d0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
e0e0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
e0f0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
e100: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
e110: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
e120: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
e130: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
e140: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
e150: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
e160: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
e170: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
e180: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e190: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
e1a0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e1b0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e1c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e1d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
e1e0: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
e1f0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
e200: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
e210: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
e220: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
e230: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
e240: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
e250: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
e260: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
e270: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
e280: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
e290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e2a0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
e2b0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
e2d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
e2e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
e2f0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
e300: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
e310: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e320: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e330: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e340: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
e350: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e         pLock->cn
e360: 74 20 3d 20 31 3b 0a 09 09 09 09 67 6f 74 6f 20  t = 1;.....goto 
e370: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
e380: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e390: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
e3a0: 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61  count of locks a
e3b0: 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65  gainst this same
e3c0: 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65   file.  When the
e3d0: 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65  .    ** count re
e3e0: 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73  aches zero, clos
e3f0: 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65  e any other file
e400: 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f   descriptors who
e410: 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  se close.    ** 
e420: 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63  was deferred bec
e430: 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64  ause of outstand
e440: 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a  ing locks..    *
e450: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e460: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e470: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
e480: 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70  pOpen;.      pOp
e490: 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  en->nLock--;.   
e4a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
e4b0: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
e4c0: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e      if( pOpen->n
e4d0: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e  Lock==0 && pOpen
e4e0: 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a  ->nPending>0 ){.
e4f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
e500: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e510: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  i<pOpen->nPendin
e520: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e530: 20 20 20 2f 2a 20 63 6c 6f 73 65 20 70 65 6e 64     /* close pend
e540: 69 6e 67 20 66 64 73 2c 20 62 75 74 20 69 66 20  ing fds, but if 
e550: 63 6c 6f 73 69 6e 67 20 66 61 69 6c 73 20 64 6f  closing fails do
e560: 6e 27 74 20 66 72 65 65 20 74 68 65 20 61 72 72  n't free the arr
e570: 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
e580: 61 73 73 69 67 6e 20 2d 31 20 74 6f 20 74 68 65  assign -1 to the
e590: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c   successfully cl
e5a0: 6f 73 65 64 20 64 65 73 63 72 69 70 74 6f 72 73  osed descriptors
e5b0: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a   and record the.
e5c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72            ** err
e5d0: 6f 72 2e 20 20 54 68 65 20 6e 65 78 74 20 61 74  or.  The next at
e5e0: 74 65 6d 70 74 20 74 6f 20 75 6e 6c 6f 63 6b 20  tempt to unlock 
e5f0: 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e 2e 20  will try again. 
e600: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e610: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
e620: 5b 69 5d 20 3c 20 30 20 29 20 63 6f 6e 74 69 6e  [i] < 0 ) contin
e630: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
e640: 28 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61  ( close(pOpen->a
e650: 50 65 6e 64 69 6e 67 5b 69 5d 29 20 29 7b 0a 20  Pending[i]) ){. 
e660: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e670: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
e680: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
e690: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e6a0: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
e6b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6c0: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
e6d0: 65 6e 64 69 6e 67 5b 69 5d 20 3d 20 2d 31 3b 0a  ending[i] = -1;.
e6e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e700: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e720: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d  ite3_free(pOpen-
e730: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
e740: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
e750: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
e760: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
e770: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
e780: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e790: 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f  }.  }...end_unlo
e7a0: 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  ck:.  leaveMutex
e7b0: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
e7c0: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
e7d0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
e7e0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
e7f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
e800: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
e810: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
e820: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
e830: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
e840: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
e850: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
e860: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
e870: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
e880: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
e890: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
e8a0: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
e8b0: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
e8c0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
e8d0: 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
e8e0: 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  nt closeUnixFile
e8f0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e900: 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
e910: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e920: 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69  e*)id;.  if( pFi
e930: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  le ){.    if( pF
e940: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
e950: 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
e960: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
e970: 72 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rfd);.      if( 
e980: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  err ){.        p
e990: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e9a0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
e9b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
e9c0: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a  OERR_DIR_CLOSE;.
e9d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e9e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66       pFile->dirf
e9f0: 64 3d 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d=-1;.      }.  
ea00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c    }.    if( pFil
ea10: 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
ea20: 20 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65   int err = close
ea30: 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  (pFile->h);.    
ea40: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
ea50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ea60: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ea70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ea80: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
ea90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eaa0: 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20  #if IS_VXWORKS. 
eab0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
eac0: 44 65 6c 65 74 65 20 26 26 20 70 46 69 6c 65 2d  Delete && pFile-
ead0: 3e 7a 52 65 61 6c 70 61 74 68 20 29 7b 0a 20 20  >zRealpath ){.  
eae0: 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65      unlink(pFile
eaf0: 2d 3e 7a 52 65 61 6c 70 61 74 68 29 3b 0a 20 20  ->zRealpath);.  
eb00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c    }.    if( pFil
eb10: 65 2d 3e 7a 52 65 61 6c 70 61 74 68 20 29 7b 0a  e->zRealpath ){.
eb20: 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a        HashElem *
eb30: 70 45 6c 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pElem;.      int
eb40: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 46 69 6c   n = strlen(pFil
eb50: 65 2d 3e 7a 52 65 61 6c 70 61 74 68 29 20 2b 20  e->zRealpath) + 
eb60: 31 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d  1;.      pElem =
eb70: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
eb80: 45 6c 65 6d 28 26 6e 61 6d 65 48 61 73 68 2c 20  Elem(&nameHash, 
eb90: 70 46 69 6c 65 2d 3e 7a 52 65 61 6c 70 61 74 68  pFile->zRealpath
eba0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
ebb0: 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  pElem ){.       
ebc0: 20 6c 6f 6e 67 20 63 6e 74 20 3d 20 28 6c 6f 6e   long cnt = (lon
ebd0: 67 29 70 45 6c 65 6d 2d 3e 64 61 74 61 3b 0a 20  g)pElem->data;. 
ebe0: 20 20 20 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20         cnt--;.  
ebf0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
ec00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ec10: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
ec20: 26 6e 61 6d 65 48 61 73 68 2c 20 70 46 69 6c 65  &nameHash, pFile
ec30: 2d 3e 7a 52 65 61 6c 70 61 74 68 2c 20 6e 2c 20  ->zRealpath, n, 
ec40: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
ec50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6c  e{.          pEl
ec60: 65 6d 2d 3e 64 61 74 61 20 3d 20 28 76 6f 69 64  em->data = (void
ec70: 2a 29 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  *)cnt;.        }
ec80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
ec90: 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43  endif.    OSTRAC
eca0: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
ecb0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
ecc0: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
ecd0: 2d 31 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  -1);.    memset(
ece0: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
ecf0: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d  (unixFile));.  }
ed00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ed10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
ed20: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
ed30: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
ed40: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
ed50: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
ed60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ed70: 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
ed80: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ed90: 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
eda0: 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64     unixUnlock(id
edb0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
edc0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
edd0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
ede0: 65 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70  en && pFile->pOp
edf0: 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
ee00: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
ee10: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
ee20: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
ee30: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
ee40: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
ee50: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ee60: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ee70: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ee80: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ee90: 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
eea0: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
eeb0: 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
eec0: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
eed0: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
eee0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
eef0: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
ef00: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
ef10: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
ef20: 20 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e       struct open
ef30: 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69  Cnt *pOpen = pFi
ef40: 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20  le->pOpen;.     
ef50: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
ef60: 72 65 61 6c 6c 6f 63 28 70 4f 70 65 6e 2d 3e 61  realloc(pOpen->a
ef70: 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d  Pending, (pOpen-
ef80: 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a  >nPending+1)*siz
ef90: 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20  eof(int) );.    
efa0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
efb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
efc0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
efd0: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
efe0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
eff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f000: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
f010: 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  ding = aNew;.   
f020: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
f030: 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ding[pOpen->nPen
f040: 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68  ding] = pFile->h
f050: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
f060: 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20  >nPending++;.   
f070: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
f080: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
f090: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  }.    releaseLoc
f0a0: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
f0b0: 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ck);.    release
f0c0: 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70  OpenCnt(pFile->p
f0d0: 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20  Open);.    rc = 
f0e0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
f0f0: 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65  );.    leaveMute
f100: 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
f110: 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 20 53 51  n rc;.}...#if SQ
f120: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f130: 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 21 49  ING_STYLE.#if !I
f140: 53 5f 56 58 57 4f 52 4b 53 0a 23 70 72 61 67 6d  S_VXWORKS.#pragm
f150: 61 20 6d 61 72 6b 20 41 46 50 20 73 75 70 70 6f  a mark AFP suppo
f160: 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61  rt../*. ** The a
f170: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
f180: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
f190: 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
f1a0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
f1b0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
f1c0: 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
f1d0: 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
f1e0: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
f1f0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
f200: 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f   {.  unsigned lo
f210: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
f220: 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
f230: 20 2a 64 62 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74   *dbPath;.};..st
f240: 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
f250: 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
f260: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
f270: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
f280: 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
f290: 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
f2a0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
f2b0: 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
f2c0: 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
f2d0: 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
f2e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
f2f0: 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
f300: 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
f310: 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
f320: 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
f330: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
f340: 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
f350: 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
f360: 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
f370: 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
f380: 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
f390: 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
f3a0: 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
f3b0: 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
f3c0: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3e0: 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
f3f0: 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
f400: 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
f410: 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
f420: 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
f430: 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
f440: 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
f450: 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a  geLockPB2)../* .
f460: 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
f470: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
f480: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
f490: 66 61 69 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74 61  failure.. */.sta
f4a0: 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65  tic int _AFPFSSe
f4b0: 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
f4c0: 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 75 6e  har *path, .  un
f4d0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  ixFile *pFile, .
f4e0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
f4f0: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20  long offset, .  
f500: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
f510: 6e 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e  ng length, .  in
f520: 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b  t setLockFlag.){
f530: 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
f540: 6e 67 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20  ngeLockPB2      
f550: 20 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20   pb;.  int      
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
f570: 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
f580: 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
f590: 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
f5a0: 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
f5b0: 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
f5c0: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
f5d0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
f5e0: 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
f5f0: 65 2d 3e 68 3b 0a 20 20 2f 2f 53 69 6d 75 6c 61  e->h;.  //Simula
f600: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
f610: 31 29 3b 0a 20 20 2f 2f 53 69 6d 75 6c 61 74 65  1);.  //Simulate
f620: 49 4f 45 72 72 6f 72 28 20 70 62 2e 66 64 3d 28  IOError( pb.fd=(
f630: 2d 31 29 20 29 0a 20 20 2f 2f 53 69 6d 75 6c 61  -1) ).  //Simula
f640: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
f650: 30 29 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  0);.  .  OSTRACE
f660: 36 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  6("AFPSETLOCK [%
f670: 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
f680: 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
f690: 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
f6a0: 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
f6b0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
f6c0: 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
f6d0: 2d 31 5d 22 3a 22 22 29 2c 20 6f 66 66 73 65 74  -1]":""), offset
f6e0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72  , length);.  err
f6f0: 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
f700: 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
f710: 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
f720: 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
f730: 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
f740: 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
f750: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
f760: 52 41 43 45 34 28 22 41 46 50 53 45 54 4c 4f 43  RACE4("AFPSETLOC
f770: 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
f780: 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
f790: 22 2c 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c  ", path, tErrno,
f7a0: 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
f7b0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
f7c0: 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
f7d0: 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
f7e0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
f7f0: 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
f800: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f810: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f820: 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
f830: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
f840: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
f850: 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
f860: 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
f870: 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
f880: 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
f890: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
f8a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f8b0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
f8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f8d0: 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
f8e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f8f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
f900: 20 41 46 50 2d 73 74 79 6c 65 20 72 65 73 65 72   AFP-style reser
f910: 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ved lock checkin
f920: 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  g following the 
f930: 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a 20  behavior of .** 
f940: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
f950: 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75  dLock, see the u
f960: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
f970: 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63 6f  Lock function co
f980: 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63  mments */.static
f990: 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
f9a0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
f9b0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f9c0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
f9d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f9e0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
f9f0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
fa00: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fa10: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
fa20: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
fa30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
fa40: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
fa50: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
fa60: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
fa70: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
fa80: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
fa90: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
faa0: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
fab0: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f  gContext;.  .  /
fac0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
fad0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
fae0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
faf0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
fb00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
fb10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fb20: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
fb30: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
fb40: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
fb50: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
fb60: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
fb70: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
fb80: 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
fb90: 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
fba0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
fbb0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
fbc0: 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
fbd0: 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
fbe0: 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
fbf0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
fc00: 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
fc10: 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
fc20: 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
fc30: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
fc40: 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
fc50: 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
fc60: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
fc70: 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 5f  */.      lrc = _
fc80: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
fc90: 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
fca0: 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
fcb0: 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
fcc0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
fcd0: 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
fce0: 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
fcf0: 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
fd00: 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
fd10: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
fd20: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
fd30: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
fd40: 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
fd50: 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
fd60: 20 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54    .  OSTRACE4("T
fd70: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
fd80: 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
fd90: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
fda0: 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
fdb0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
fdc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41  turn rc;.}../* A
fdd0: 46 50 2d 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67  FP-style locking
fde0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62   following the b
fdf0: 65 68 61 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c  ehavior of unixL
fe00: 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69  ock, see the uni
fe10: 78 4c 6f 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69  xLock .** functi
fe20: 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  on comments for 
fe30: 64 65 74 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20  details of lock 
fe40: 6d 61 6e 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73  management. */.s
fe50: 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
fe60: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fe70: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
fe80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fe90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
fea0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
feb0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
fec0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
fed0: 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
fee0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
fef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
ff00: 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
ff10: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
ff20: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
ff30: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70    %d %s was %s p
ff40: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
ff50: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63  >h,.         loc
ff60: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
ff70: 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
ff80: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
ff90: 65 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  e), getpid());..
ffa0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
ffb0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
ffc0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
ffd0: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
ffe0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
fff0: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
10000 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
10010 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
10020 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
10030 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68  * enterMutex() h
10040 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
10050 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
10060 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10070 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
10080 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
10090 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
100a0 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
100b0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
100c0 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
100d0 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
100e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
100f0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
10100 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10110 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
10120 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
10130 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
10140 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
10150 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
10160 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
10170 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
10180 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
10190 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
101a0 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
101b0 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
101c0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
101d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
101e0 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
101f0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
10200 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
10210 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
10220 0a 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74  .  */.  enterMut
10230 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
10240 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
10250 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
10260 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
10270 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
10280 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
10290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
102a0 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d  OK ){.    leaveM
102b0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
102c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 20 20 0a  rn rc;.  }.    .
102d0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
102e0 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
102f0 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
10300 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
10310 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
10320 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
10330 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
10340 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
10350 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
10360 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
10370 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
10380 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
10390 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
103a0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
103b0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
103c0 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
103d0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
103e0 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
103f0 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
10400 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
10410 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
10420 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
10430 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
10440 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
10450 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
10460 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
10470 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
10480 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
10490 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
104a0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
104b0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
104c0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
104d0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
104e0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
104f0 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
10500 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
10510 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10520 20 69 6e 74 20 6c 6b 2c 20 6c 72 63 31 2c 20 6c   int lk, lrc1, l
10530 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  rc2, lrc1Errno;.
10540 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20      .    /* Now 
10550 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
10560 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
10570 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
10580 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
10590 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
105a0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
105b0 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
105c0 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
105d0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
105e0 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
105f0 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
10600 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
10610 20 20 20 6c 72 63 31 20 3d 20 5f 41 46 50 46 53     lrc1 = _AFPFS
10620 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
10630 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
10640 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
10650 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d  D_FIRST+context-
10660 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
10670 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
10680 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
10690 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
106a0 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
106b0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
106c0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
106d0 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
106e0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
106f0 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
10700 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
10710 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
10720 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
10730 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
10740 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
10750 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
10760 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45  astErrno = lrc1E
10770 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
10780 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
10790 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
107a0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
107b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
107c0 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
107d0 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
107e0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
107f0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
10800 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
10810 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
10820 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
10830 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
10840 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
10850 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  D_LOCK;.      pF
10860 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
10870 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  k++;.    }.  }el
10880 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
10890 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
108a0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
108b0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
108c0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
108d0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
108e0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
108f0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
10900 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
10910 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
10920 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
10930 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
10940 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10950 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74  );.    if (lockt
10960 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ype >= RESERVED_
10970 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
10980 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56  ocktype < RESERV
10990 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  ED_LOCK) {.     
109a0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20     /* Acquire a 
109b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
109c0 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
109d0 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
109e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
109f0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
10a00 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
10a10 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
10a20 65 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d  ed && locktype =
10a30 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
10a40 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
10a50 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
10a60 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
10a70 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
10a80 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
10a90 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
10aa0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
10ab0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
10ac0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
10ad0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
10ae0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
10af0 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
10b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10b10 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 5f 41  f( !(failed = _A
10b20 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
10b30 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
10b40 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
10b50 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
10b60 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
10b70 65 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ext->sharedByte,
10b80 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
10b90 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
10ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10bb0 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
10bc0 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
10bd0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
10be0 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
10bf0 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
10c00 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
10c10 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
10c20 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
10c50 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
10c60 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
10c70 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 5f 41  && (failed2 = _A
10c80 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
10c90 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
10ca0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
10cc0 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65  ED_FIRST + conte
10cd0 78 74 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  xt->sharedByte, 
10ce0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
10cf0 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
10d00 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
10d10 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
10d20 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
10d30 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
10d40 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
10d50 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
10d60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
10d70 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
10d80 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
10d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
10da0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
10db0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10dc0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
10dd0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
10de0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
10df0 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
10e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
10e10 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
10e20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
10e30 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
10e40 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
10e50 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
10e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10e70 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10e80 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10e90 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
10ea0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
10eb0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
10ec0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
10ed0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
10ee0 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
10ef0 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
10f00 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b    OSTRACE4("LOCK
10f10 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
10f20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
10f30 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
10f40 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
10f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
10f60 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
10f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10f80 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
10f90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
10fa0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10fb0 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
10fc0 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
10fd0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
10fe0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
10ff0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11000 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11010 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
11020 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
11030 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
11040 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
11050 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
11060 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11070 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11080 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
11090 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
110a0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
110b0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
110c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
110d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
110e0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
110f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
11100 2a 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b  *pCtx = (afpLock
11110 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
11120 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11130 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
11140 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11150 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
11160 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11170 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
11180 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
11190 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
111a0 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  e, getpid());.. 
111b0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
111c0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
111d0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
111e0 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
111f0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11210 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
11220 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
11230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11240 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e  MISUSE;.  }.  en
11250 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
11260 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
11270 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
11280 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
11290 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45  ile->locktype==E
112a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
112b0 0a 20 20 20 20 20 20 72 63 20 3d 20 5f 41 46 50  .      rc = _AFP
112c0 46 53 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e  FSSetLock(pCtx->
112d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
112e0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
112f0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
11300 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11310 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 74 79 70  TE_OK && locktyp
11320 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
11330 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
11340 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
11350 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
11360 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
11370 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
11380 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
11390 45 44 5f 46 49 52 53 54 2b 70 43 74 78 2d 3e 73  ED_FIRST+pCtx->s
113a0 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20  haredByte;.     
113b0 20 20 20 72 63 20 3d 20 5f 41 46 50 46 53 53 65     rc = _AFPFSSe
113c0 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62 50 61  tLock(pCtx->dbPa
113d0 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
113e0 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
113f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11400 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11410 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
11420 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
11430 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
11440 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  rc = _AFPFSSetLo
11450 63 6b 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  ck(pCtx->dbPath,
11460 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
11470 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
11480 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
11490 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
114a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
114b0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
114c0 20 20 20 20 20 72 63 20 3d 20 5f 41 46 50 46 53       rc = _AFPFS
114d0 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64 62  SetLock(pCtx->db
114e0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
114f0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
11500 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
11510 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
11520 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
11530 20 63 6c 65 61 72 20 74 68 65 20 73 68 61 72 65   clear the share
11540 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  d lock */.    in
11550 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
11560 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
11570 70 43 74 78 2d 3e 73 68 61 72 65 64 42 79 74 65  pCtx->sharedByte
11580 3b 0a 20 20 20 20 72 63 20 3d 20 5f 41 46 50 46  ;.    rc = _AFPF
11590 53 53 65 74 4c 6f 63 6b 28 70 43 74 78 2d 3e 64  SSetLock(pCtx->d
115a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
115b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
115c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
115d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
115e0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
115f0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
11600 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
11610 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c  nt *pOpen = pFil
11620 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20  e->pOpen;.      
11630 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  pOpen->nLock--;.
11640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
11650 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
11660 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
11670 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
11680 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
11690 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
116a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
116b0 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
116c0 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
116d0 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
116e0 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 20 3c 20 30  >aPending[i] < 0
116f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11700 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
11710 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
11720 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
11730 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11740 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11760 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
11770 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
11780 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
11790 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
117a0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  i] = -1;.       
117b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
117c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
117d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
117e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
117f0 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
11800 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ng);.          p
11810 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
11820 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   0;.          pO
11830 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
11840 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
11850 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 65     }.    }.  }.e
11860 6e 64 5f 61 66 70 75 6e 6c 6f 63 6b 3a 0a 20 20  nd_afpunlock:.  
11870 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
11880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11890 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  K ) pFile->lockt
118a0 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
118b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
118c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
118d0 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
118e0 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
118f0 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
11900 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
11910 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
11920 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
11930 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
11940 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11950 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
11960 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
11970 29 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65  );.    enterMute
11980 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
11990 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69  le->pOpen && pFi
119a0 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
119b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
119c0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
119d0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
119e0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
119f0 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
11a00 0a 20 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  .       ** yet b
11a10 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
11a20 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
11a30 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
11a40 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
11a50 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
11a60 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64   to pOpen->aPend
11a70 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
11a80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
11a90 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
11aa0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
11ab0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
11ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
11ad0 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  nt *aNew;.      
11ae0 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
11af0 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
11b00 4f 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77  Open;.      aNew
11b10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
11b20 6f 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  oc(pOpen->aPendi
11b30 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
11b40 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
11b50 6e 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nt) );.      if(
11b60 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
11b70 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
11b80 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c  oc fails, just l
11b90 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
11ba0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20  criptor */.     
11bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11bc0 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
11bd0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
11be0 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
11bf0 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
11c00 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
11c10 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
11c20 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ding++;.        
11c30 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
11c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11c50 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
11c60 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
11c70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11c90 6e 74 65 78 74 29 3b 0a 20 20 20 20 63 6c 6f 73  ntext);.    clos
11ca0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
11cb0 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
11cc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72  LITE_OK;.}...#pr
11ce0 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28  agma mark flock(
11cf0 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ) style locking.
11d00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c 6f 63 6b  ./*.** The flock
11d10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  LockingContext i
11d20 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f 0a 74 79  s not used.*/.ty
11d30 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b  pedef void flock
11d40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
11d50 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74 79 6c 65 20  ./* flock-style 
11d60 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68  reserved lock ch
11d70 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ecking following
11d80 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
11d90 20 0a 20 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52   . ** unixCheckR
11da0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65  eservedLock, see
11db0 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65   the unixCheckRe
11dc0 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74  servedLock funct
11dd0 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  ion comments */.
11de0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11df0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11e00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11e10 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11e20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
11e40 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
11e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11e60 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11e70 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
11e80 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
11e90 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
11ea0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
11eb0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
11ec0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
11ed0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
11ee0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
11ef0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
11f00 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
11f10 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
11f20 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
11f30 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
11f40 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
11f50 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
11f60 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
11f70 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
11f80 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
11f90 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
11fa0 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
11fb0 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63    int lrc = floc
11fc0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
11fd0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
11fe0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
11ff0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
12000 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
12010 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12020 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12030 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
12040 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
12050 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12060 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
12070 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
12080 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
12090 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
120a0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
120b0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
120c0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
120d0 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  UNLOCK); .      
120e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
120f0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
12100 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12110 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
12120 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12130 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
12140 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
12150 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
12160 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12170 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12180 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
12190 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
121a0 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
121b0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
121c0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
121d0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
121e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
121f0 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
12200 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
12210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
12220 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12230 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
12240 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12250 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12260 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
12270 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
12280 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
12290 72 65 73 65 72 76 65 64 29 3b 0a 0a 23 69 66 64  reserved);..#ifd
122a0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
122b0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
122c0 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
122d0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
122e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
122f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12300 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
12310 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
12320 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12330 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12340 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
12350 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12360 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
12370 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b  ic int flockLock
12380 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12390 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
123a0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
123b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6c  LITE_OK;.  int l
123c0 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
123d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
123e0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
123f0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12400 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
12410 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
12420 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
12430 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
12440 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
12450 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
12460 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
12470 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
12480 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
12490 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
124a0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
124b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
124c0 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
124d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
124e0 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
124f0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12500 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
12510 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12520 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
12530 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
12540 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
12550 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12560 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12570 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12580 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
12590 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
125a0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
125b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
125c0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
125d0 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
125e0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
125f0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
12600 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
12610 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
12620 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ype;.  }.  OSTRA
12630 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
12640 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
12650 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
12660 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
12670 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
12680 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
12690 66 61 69 6c 65 64 22 29 3b 0a 23 69 66 64 65 66  failed");.#ifdef
126a0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
126b0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
126c0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
126d0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
126e0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
126f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
12700 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
12710 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12720 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12730 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
12740 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
12750 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
12760 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12770 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
12780 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12790 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
127a0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
127b0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
127c0 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
127d0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
127e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
127f0 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
12800 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
12810 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  e, getpid());.  
12820 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
12830 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
12840 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
12850 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
12860 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
12870 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
12880 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12890 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
128a0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
128b0 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
128c0 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
128d0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
128e0 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
128f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
12900 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
12910 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
12920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12930 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
12940 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
12950 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
12960 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
12970 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
12980 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e  if (rc) {.    in
12990 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72  t r, tErrno = er
129a0 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c  rno;.    r = sql
129b0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
129c0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
129d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
129e0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
129f0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b  LOCK_ERROR(r) ){
12a00 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12a10 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12a20 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
12a30 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12a40 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
12a50 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c 49     if( (r & SQLI
12a60 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
12a70 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12a80 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55     r = SQLITE_BU
12a90 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  SY;.    }.#endif
12aa0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
12ab0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12ac0 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  ORS */.    .    
12ad0 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c  return r;.  } el
12ae0 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
12af0 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
12b00 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
12b10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
12b20 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
12b30 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
12b40 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
12b50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
12b60 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
12b70 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
12b80 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
12b90 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
12ba0 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
12bb0 65 6e 64 69 66 20 2f 2a 20 21 49 53 5f 56 58 57  endif /* !IS_VXW
12bc0 4f 52 4b 53 20 2a 2f 0a 0a 23 70 72 61 67 6d 61  ORKS */..#pragma
12bd0 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c   mark Old-School
12be0 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73 65   .lock file base
12bf0 64 20 6c 6f 63 6b 69 6e 67 0a 23 64 65 66 69 6e  d locking.#defin
12c00 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
12c10 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 20 44 6f 74   ".lock"../* Dot
12c20 6c 6f 63 6b 2d 73 74 79 6c 65 20 72 65 73 65 72  lock-style reser
12c30 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ved lock checkin
12c40 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  g following the 
12c50 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a 20  behavior of .** 
12c60 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
12c70 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75  dLock, see the u
12c80 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
12c90 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63 6f  Lock function co
12ca0 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63  mments */.static
12cb0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
12cc0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12cd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12ce0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
12cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d00 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12d10 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12d20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12d30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
12d40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12d60 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12d70 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
12d80 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12d90 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
12da0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
12db0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
12dc0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
12dd0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
12de0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
12df0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12e00 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12e10 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12e20 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12e30 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12e40 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12e50 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  d ){.    char *z
12e60 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
12e70 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
12e80 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74  gContext;.    st
12e90 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
12ea0 66 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  f;.    .    if( 
12eb0 6c 73 74 61 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c  lstat(zLockFile,
12ec0 20 26 73 74 61 74 42 75 66 29 3d 3d 30 20 29 7b   &statBuf)==0 ){
12ed0 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65  .      /* file e
12ee0 78 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65  xists, someone e
12ef0 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
12f00 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
12f10 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
12f20 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65  e{.      /* file
12f30 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
12f40 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12f50 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12f60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  */.      int tEr
12f70 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12f80 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
12f90 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
12fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12fb0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12fc0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12fd0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
12fe0 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
12ff0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13000 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13010 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13020 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
13030 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
13040 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
13050 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
13060 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13070 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13080 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
13090 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
130a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
130b0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
130c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
130d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
130e0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
130f0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13100 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13110 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13120 20 20 69 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f    int rc=SQLITE_
13130 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
13140 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
13150 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
13160 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
13170 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
13180 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
13190 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
131a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
131b0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
131c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
131d0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 23 69 66   = locktype;.#if
131e0 20 21 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !IS_VXWORKS.   
131f0 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
13200 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
13210 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
13220 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  */.    utimes(zL
13230 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
13240 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
13250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
13260 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f  oto dotlock_end_
13270 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
13280 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * check to see i
13290 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  f lock file alre
132a0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
132b0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
132c0 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74  Buf;.  if (lstat
132d0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73 74 61 74  (zLockFile,&stat
132e0 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20  Buf) == 0){.    
132f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13300 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75  ; /* it does, bu
13310 73 79 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 64  sy */.    goto d
13320 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b 3b  otlock_end_lock;
13330 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
13340 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
13350 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  ock */.  fd = op
13360 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52  en(zLockFile,O_R
13370 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
13380 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
13390 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( fd<0 ){.    /*
133a0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
133b0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
133c0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61   someone else ma
133d0 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68  y have stolen th
133e0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
133f0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13400 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
13410 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
13420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13430 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
13440 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13450 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13460 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13480 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
13490 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
134a0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
134b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
134c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
134d0 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 64 6f 74    }.    goto dot
134e0 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  lock_end_lock;. 
134f0 20 7d 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28   } .  if( close(
13500 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  fd) ){.    pFile
13510 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
13520 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
13530 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
13540 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f  ;.  }.  .  /* go
13550 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13560 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13570 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   */.  pFile->loc
13580 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
13590 3b 0a 0a 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f  ;.. dotlock_end_
135a0 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
135b0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
135c0 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73   dotlockUnlock(s
135d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
135e0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
135f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13600 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13610 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
13620 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
13630 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
13640 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
13650 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13660 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
13670 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13680 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
13690 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
136a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
136b0 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
136c0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
136d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
136e0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
136f0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
13700 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13710 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
13720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13730 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13740 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
13750 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
13760 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
13770 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
13780 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if (locktype==SH
13790 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
137a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
137b0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
137c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
137d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
137e0 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
137f0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 75 6e 6c 69  k. */.  if (unli
13800 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 20  nk(zLockFile) ) 
13810 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
13820 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
13830 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
13840 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
13850 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13860 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13870 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13880 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
13890 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
138a0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
138b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
138c0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
138d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
138e0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
138f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
13900 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
13910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13920 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
13930 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
13940 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
13950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13960 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ) {.  int rc;.  
13970 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
13980 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13990 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
139a0 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
139b0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
139c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
139d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
139e0 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66  ntext);.  }.  if
139f0 28 20 49 53 5f 56 58 57 4f 52 4b 53 20 29 20 65  ( IS_VXWORKS ) e
13a00 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
13a10 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13a20 65 28 69 64 29 3b 0a 20 20 69 66 28 20 49 53 5f  e(id);.  if( IS_
13a30 56 58 57 4f 52 4b 53 20 29 20 6c 65 61 76 65 4d  VXWORKS ) leaveM
13a40 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
13a50 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 49 53 5f 56   rc;.}..#if IS_V
13a60 58 57 4f 52 4b 53 0a 0a 23 70 72 61 67 6d 61 20  XWORKS..#pragma 
13a70 6d 61 72 6b 20 50 4f 53 49 58 2f 76 78 57 6f 72  mark POSIX/vxWor
13a80 6b 73 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ks named semapho
13a90 72 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67  re based locking
13aa0 0a 0a 2f 2a 20 4e 61 6d 65 64 73 65 6d 2d 73 74  ../* Namedsem-st
13ab0 79 6c 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  yle reserved loc
13ac0 6b 20 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f  k checking follo
13ad0 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f  wing the behavio
13ae0 72 20 6f 66 20 0a 2a 2a 20 75 6e 69 78 43 68 65  r of .** unixChe
13af0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
13b00 73 65 65 20 74 68 65 20 75 6e 69 78 43 68 65 63  see the unixChec
13b10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75  kReservedLock fu
13b20 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20  nction comments 
13b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61  */.static int na
13b40 6d 65 64 73 65 6d 43 68 65 63 6b 52 65 73 65 72  medsemCheckReser
13b50 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13b60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13b70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
13b80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13b90 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13ba0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13bb0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13bc0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
13bd0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13be0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
13bf0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13c00 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13c10 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13c20 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13c30 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13c40 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13c50 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13c60 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
13c70 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13c80 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
13c90 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
13ca0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
13cb0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
13cc0 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
13cd0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
13ce0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
13cf0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
13d00 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
13d10 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
13d20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
13d30 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
13d40 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
13d50 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
13d60 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
13d70 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
13d80 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13d90 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13da0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13db0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
13dc0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
13dd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13de0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
13df0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13e00 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
13e10 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
13e20 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
13e30 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
13e40 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
13e50 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
13e60 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13e70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13e80 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
13e90 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
13ea0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
13eb0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
13ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13ed0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
13ee0 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
13ef0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
13f00 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
13f10 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
13f20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13f30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  ..static int nam
13f40 65 64 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  edsemLock(sqlite
13f50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13f60 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
13f70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13f80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13f90 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
13fa0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13fb0 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69  pOpen->pSem;.  i
13fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13fd0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
13fe0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
13ff0 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
14000 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
14010 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
14020 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
14030 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
14040 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e  File->locktype >
14050 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
14060 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14070 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
14080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14090 20 20 20 20 67 6f 74 6f 20 6e 61 6d 65 64 73 65      goto namedse
140a0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
140b0 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
140c0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
140d0 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
140e0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
140f0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14100 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14120 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 61  USY;.    goto na
14130 6d 65 64 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  medsem_end_lock;
14140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
14150 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14160 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14170 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
14180 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a  pe = locktype;..
14190 20 6e 61 6d 65 64 73 65 6d 5f 65 6e 64 5f 6c 6f   namedsem_end_lo
141a0 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
141b0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .}..static int n
141c0 61 6d 65 64 73 65 6d 55 6e 6c 6f 63 6b 28 73 71  amedsemUnlock(sq
141d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
141e0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
141f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14200 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14210 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
14220 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
14230 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
14240 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
14250 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
14260 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
14270 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
14280 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
14290 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20  h, locktype,..  
142a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
142b0 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61  , getpid());.  a
142c0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
142d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
142e0 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
142f0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
14300 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
14310 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
14320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14330 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
14340 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
14350 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
14360 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
14370 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
14380 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
14390 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
143a0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
143b0 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
143c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
143d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
143e0 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
143f0 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
14400 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
14410 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
14420 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14430 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14440 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14450 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14460 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
14470 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
14480 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14490 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
144a0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
144b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
144c0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
144d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
144e0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
144f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14500 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
14510 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
14520 74 20 6e 61 6d 65 64 73 65 6d 43 6c 6f 73 65 28  t namedsemClose(
14530 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14540 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
14550 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
14560 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14570 29 69 64 3b 0a 20 20 20 20 6e 61 6d 65 64 73 65  )id;.    namedse
14580 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
14590 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
145a0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 65  ( pFile );.    e
145b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
145c0 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
145d0 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
145e0 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
145f0 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
14600 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
14610 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 6c 65 61  ile(id);.    lea
14620 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
14630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14640 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
14650 49 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 23  IS_VXWORKS */..#
14660 70 72 61 67 6d 61 20 6d 61 72 6b 20 50 72 6f 78  pragma mark Prox
14670 79 20 6c 6f 63 6b 69 6e 67 20 73 75 70 70 6f 72  y locking suppor
14680 74 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  t..static int pr
14690 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
146a0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
146b0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
146c0 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
146d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
146e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
146f0 72 63 20 3d 20 74 61 6b 65 43 6f 6e 63 68 28 70  rc = takeConch(p
14700 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
14710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14720 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
14730 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
14740 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
14750 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
14760 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
14770 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
14780 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
14790 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 72  y;.    return pr
147a0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
147b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
147c0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
147d0 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b  proxy, pResOut);
147e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
147f0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
14800 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
14810 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14820 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
14830 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14840 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14850 20 69 6e 74 20 72 63 20 3d 20 74 61 6b 65 43 6f   int rc = takeCo
14860 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
14870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14880 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
14890 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
148a0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
148b0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
148c0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
148d0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
148e0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
148f0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d  kProxy;.    rc =
14900 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
14910 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
14920 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63  file*)proxy, loc
14930 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c  ktype);.    pFil
14940 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72  e->locktype = pr
14950 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  oxy->locktype;. 
14960 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14970 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  }..static int pr
14980 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
14990 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
149a0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
149b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
149c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
149d0 20 69 6e 74 20 72 63 20 3d 20 74 61 6b 65 43 6f   int rc = takeCo
149e0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
149f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14a00 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
14a10 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
14a20 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
14a30 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
14a40 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
14a50 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
14a60 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
14a70 6b 50 72 6f 78 79 3b 0a 20 20 20 20 72 63 20 3d  kProxy;.    rc =
14a80 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
14a90 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
14aa0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c  3_file*)proxy, l
14ab0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46  ocktype);.    pF
14ac0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
14ad0 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b  proxy->locktype;
14ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14af0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
14b00 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
14b10 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
14b20 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
14b30 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
14b40 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
14b50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14b60 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f  ile*)id;.    pro
14b70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
14b80 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
14b90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
14ba0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
14bb0 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46  ntext;.    unixF
14bc0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
14bd0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
14be0 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
14bf0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
14c00 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
14c10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14c20 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66  _OK;.    .    if
14c30 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ( lockProxy ){. 
14c40 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72       rc = lockPr
14c50 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
14c60 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
14c70 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20  ile*)lockProxy, 
14c80 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
14c90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14ca0 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  rc;.      rc = l
14cb0 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
14cc0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
14cd0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
14ce0 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
14cf0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14d00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14d10 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
14d20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63    }.    if( conc
14d30 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  hFile ){.      i
14d40 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
14d50 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ld ){.        rc
14d60 20 3d 20 72 65 6c 65 61 73 65 43 6f 6e 63 68 28   = releaseConch(
14d70 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
14d80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14d90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14da0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
14db0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
14dc0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
14dd0 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  )conchFile);.   
14de0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
14df0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
14e00 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46  ite3_free(conchF
14e10 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
14e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
14e30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
14e40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14e50 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
14e60 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ilePath);.    sq
14e70 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
14e80 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a  >dbPath);.    /*
14e90 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69   restore the ori
14ea0 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f  ginal locking co
14eb0 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
14ec0 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20  d then close it 
14ed0 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
14ee0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
14ef0 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43  Ctx->oldLockingC
14f00 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c  ontext;.    pFil
14f10 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74  e->pMethod = pCt
14f20 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20  x->pOldMethod;. 
14f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14f40 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
14f50 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  n pFile->pMethod
14f60 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20  ->xClose(id);.  
14f70 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14f80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 48 4f 53 54  E_OK;.}../* HOST
14f90 49 44 4c 45 4e 20 61 6e 64 20 43 4f 4e 43 48 4c  IDLEN and CONCHL
14fa0 45 4e 20 62 6f 74 68 20 69 6e 63 6c 75 64 65 20  EN both include 
14fb0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 73 74  space for the st
14fc0 72 69 6e 67 20 0a 2a 2a 20 74 65 72 6d 69 6e 61  ring .** termina
14fd0 74 69 6e 67 20 6e 75 6c 20 0a 2a 2f 0a 23 64 65  ting nul .*/.#de
14fe0 66 69 6e 65 20 48 4f 53 54 49 44 4c 45 4e 20 20  fine HOSTIDLEN  
14ff0 20 20 20 20 20 20 20 31 32 38 0a 23 64 65 66 69         128.#defi
15000 6e 65 20 43 4f 4e 43 48 4c 45 4e 20 20 20 20 20  ne CONCHLEN     
15010 20 20 20 20 20 28 4d 41 58 50 41 54 48 4c 45 4e       (MAXPATHLEN
15020 2b 48 4f 53 54 49 44 4c 45 4e 2b 31 29 0a 23 69  +HOSTIDLEN+1).#i
15030 66 6e 64 65 66 20 48 4f 53 54 49 44 50 41 54 48  fndef HOSTIDPATH
15040 0a 23 20 64 65 66 69 6e 65 20 48 4f 53 54 49 44  .# define HOSTID
15050 50 41 54 48 20 20 20 20 20 20 20 22 2f 4c 69 62  PATH       "/Lib
15060 72 61 72 79 2f 43 61 63 68 65 73 2f 2e 63 6f 6d  rary/Caches/.com
15070 2e 61 70 70 6c 65 2e 73 71 6c 69 74 65 43 6f 6e  .apple.sqliteCon
15080 63 68 48 6f 73 74 49 64 22 0a 23 65 6e 64 69 66  chHostId".#endif
15090 0a 0a 2f 2a 20 62 61 73 69 63 61 6c 6c 79 20 61  ../* basically a
150a0 20 63 6f 70 79 20 6f 66 20 75 6e 69 78 52 61 6e   copy of unixRan
150b0 64 6f 6d 6e 65 73 73 20 77 69 74 68 20 64 69 66  domness with dif
150c0 66 65 72 65 6e 74 0a 2a 2a 20 74 65 73 74 20 62  ferent.** test b
150d0 65 68 61 76 69 6f 72 20 62 75 69 6c 74 20 69 6e  ehavior built in
150e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67   */.static int g
150f0 65 6e 48 6f 73 74 49 44 28 63 68 61 72 20 2a 70  enHostID(char *p
15100 48 6f 73 74 49 44 29 7b 0a 20 20 69 6e 74 20 70  HostID){.  int p
15110 69 64 2c 20 66 64 2c 20 69 2c 20 6c 65 6e 3b 0a  id, fd, i, len;.
15120 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15130 2a 6b 65 79 20 3d 20 28 75 6e 73 69 67 6e 65 64  *key = (unsigned
15140 20 63 68 61 72 20 2a 29 70 48 6f 73 74 49 44 3b   char *)pHostID;
15150 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 6b 65 79  .  .  memset(key
15160 2c 20 30 2c 20 48 4f 53 54 49 44 4c 45 4e 29 3b  , 0, HOSTIDLEN);
15170 0a 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 66 64  .  len = 0;.  fd
15180 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
15190 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
151a0 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29  );.  if( fd>=0 )
151b0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 72 65 61 64  {.    len = read
151c0 28 66 64 2c 20 6b 65 79 2c 20 48 4f 53 54 49 44  (fd, key, HOSTID
151d0 4c 45 4e 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28  LEN);.    close(
151e0 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79  fd); /* silently
151f0 20 6c 65 61 6b 20 74 68 65 20 66 64 20 69 66 20   leak the fd if 
15200 69 74 20 66 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a  it fails */.  }.
15210 20 20 69 66 28 20 6c 65 6e 20 3c 20 48 4f 53 54    if( len < HOST
15220 49 44 4c 45 4e 20 29 7b 0a 20 20 20 20 74 69 6d  IDLEN ){.    tim
15230 65 5f 74 20 74 3b 0a 20 20 20 20 74 69 6d 65 28  e_t t;.    time(
15240 26 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &t);.    memcpy(
15250 6b 65 79 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  key, &t, sizeof(
15260 74 29 29 3b 0a 20 20 20 20 70 69 64 20 3d 20 67  t));.    pid = g
15270 65 74 70 69 64 28 29 3b 0a 20 20 20 20 6d 65 6d  etpid();.    mem
15280 63 70 79 28 26 6b 65 79 5b 73 69 7a 65 6f 66 28  cpy(&key[sizeof(
15290 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
152a0 66 28 70 69 64 29 29 3b 0a 20 20 7d 0a 20 20 0a  f(pid));.  }.  .
152b0 23 69 66 64 65 66 20 4d 41 4b 45 5f 50 52 45 54  #ifdef MAKE_PRET
152c0 54 59 5f 48 4f 53 54 49 44 0a 20 20 2f 2a 20 66  TY_HOSTID.  /* f
152d0 69 6c 74 65 72 20 74 68 65 20 62 79 74 65 73 20  ilter the bytes 
152e0 69 6e 74 6f 20 70 72 69 6e 74 61 62 6c 65 20 61  into printable a
152f0 73 63 69 69 20 63 68 61 72 61 63 74 65 72 73 20  scii characters 
15300 61 6e 64 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74  and NUL terminat
15310 65 20 2a 2f 0a 20 20 6b 65 79 5b 28 48 4f 53 54  e */.  key[(HOST
15320 49 44 4c 45 4e 2d 31 29 5d 20 3d 20 30 78 30 30  IDLEN-1)] = 0x00
15330 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
15340 28 48 4f 53 54 49 44 4c 45 4e 2d 31 29 3b 20 69  (HOSTIDLEN-1); i
15350 2b 2b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  ++ ){.    unsign
15360 65 64 20 63 68 61 72 20 70 61 20 3d 20 6b 65 79  ed char pa = key
15370 5b 69 5d 26 30 78 37 46 3b 0a 20 20 20 20 69 66  [i]&0x7F;.    if
15380 28 20 70 61 3c 30 78 32 30 20 29 7b 0a 20 20 20  ( pa<0x20 ){.   
15390 20 20 20 6b 65 79 5b 69 5d 20 3d 20 28 6b 65 79     key[i] = (key
153a0 5b 69 5d 26 30 78 38 30 20 3d 3d 20 30 78 38 30  [i]&0x80 == 0x80
153b0 29 20 3f 20 70 61 2b 30 78 34 30 20 3a 20 70 61  ) ? pa+0x40 : pa
153c0 2b 30 78 32 30 3b 0a 20 20 20 20 7d 65 6c 73 65  +0x20;.    }else
153d0 20 69 66 28 20 70 61 3d 3d 30 78 37 46 20 29 7b   if( pa==0x7F ){
153e0 0a 20 20 20 20 20 20 6b 65 79 5b 69 5d 20 3d 20  .      key[i] = 
153f0 28 6b 65 79 5b 69 5d 26 30 78 38 30 20 3d 3d 20  (key[i]&0x80 == 
15400 30 78 38 30 29 20 3f 20 70 61 3d 30 78 32 30 20  0x80) ? pa=0x20 
15410 3a 20 70 61 2b 30 78 37 45 3b 0a 20 20 20 20 7d  : pa+0x7E;.    }
15420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
15430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15440 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15450 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
15460 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
15470 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
15480 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
15490 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
154a0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
154b0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  = 0;.#endif../* 
154c0 77 72 69 74 65 73 20 74 68 65 20 68 6f 73 74 20  writes the host 
154d0 69 64 20 70 61 74 68 20 74 6f 20 70 61 74 68 2c  id path to path,
154e0 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 20   path should be 
154f0 61 6e 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65 64  an pre-allocated
15500 20 62 75 66 66 65 72 0a 2a 2a 20 77 69 74 68 20   buffer.** with 
15510 65 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f 72  enough space for
15520 20 61 20 70 61 74 68 20 2a 2f 0a 73 74 61 74 69   a path */.stati
15530 63 20 69 6e 74 20 67 65 74 48 6f 73 74 49 44 50  c int getHostIDP
15540 61 74 68 28 63 68 61 72 20 2a 70 61 74 68 2c 20  ath(char *path, 
15550 73 69 7a 65 5f 74 20 6c 65 6e 29 7b 0a 20 20 73  size_t len){.  s
15560 74 72 6c 63 70 79 28 70 61 74 68 2c 20 48 4f 53  trlcpy(path, HOS
15570 54 49 44 50 41 54 48 2c 20 6c 65 6e 29 3b 0a 23  TIDPATH, len);.#
15580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15590 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
155a0 68 6f 73 74 69 64 5f 6e 75 6d 3e 30 20 29 7b 0a  hostid_num>0 ){.
155b0 20 20 20 20 63 68 61 72 20 73 75 66 66 69 78 5b      char suffix[
155c0 32 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73 75  2] = "1";.    su
155d0 66 66 69 78 5b 30 5d 20 3d 20 73 75 66 66 69 78  ffix[0] = suffix
155e0 5b 30 5d 20 2b 20 73 71 6c 69 74 65 33 5f 68 6f  [0] + sqlite3_ho
155f0 73 74 69 64 5f 6e 75 6d 3b 0a 20 20 20 20 73 74  stid_num;.    st
15600 72 6c 63 61 74 28 70 61 74 68 2c 20 73 75 66 66  rlcat(path, suff
15610 69 78 2c 20 6c 65 6e 29 3b 0a 20 20 7d 0a 23 65  ix, len);.  }.#e
15620 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33 28  ndif.  OSTRACE3(
15630 22 47 45 54 48 4f 53 54 49 44 50 41 54 48 20 20  "GETHOSTIDPATH  
15640 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 61  %s pid=%d\n", pa
15650 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 7d  th, getpid());.}
15660 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
15670 74 20 49 44 20 66 72 6f 6d 20 61 20 73 71 6c 69  t ID from a sqli
15680 74 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 73  te hostid file s
15690 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a  tored in the .**
156a0 20 75 73 65 72 2d 73 70 65 63 69 66 69 63 20 74   user-specific t
156b0 6d 70 20 64 69 72 65 63 74 6f 72 79 2c 20 63 72  mp directory, cr
156c0 65 61 74 65 20 74 68 65 20 49 44 20 69 66 20 69  eate the ID if i
156d0 74 27 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c  t's not there al
156e0 72 65 61 64 79 20 0a 2a 2f 0a 73 74 61 74 69 63  ready .*/.static
156f0 20 69 6e 74 20 67 65 74 48 6f 73 74 49 44 28 63   int getHostID(c
15700 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
15710 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 69 6e  t *pError){.  in
15720 74 20 66 64 3b 0a 20 20 63 68 61 72 20 70 61 74  t fd;.  char pat
15730 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 20 0a  h[MAXPATHLEN]; .
15740 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 69    size_t len;..i
15750 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 3b  nt rc=SQLITE_OK;
15760 0a 0a 20 20 67 65 74 48 6f 73 74 49 44 50 61 74  ..  getHostIDPat
15770 68 28 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  h(path, MAXPATHL
15780 45 4e 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  EN);.  /* try to
15790 20 63 72 65 61 74 65 20 74 68 65 20 68 6f 73 74   create the host
157a0 20 49 44 20 66 69 6c 65 2c 20 69 66 20 69 74 20   ID file, if it 
157b0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 72  already exists r
157c0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
157d0 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28   */.  fd = open(
157e0 70 61 74 68 2c 20 4f 5f 43 52 45 41 54 7c 4f 5f  path, O_CREAT|O_
157f0 57 52 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 2c 20 30  WRONLY|O_EXCL, 0
15800 36 34 34 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  644);.  if( fd<0
15810 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 3d   ){.    int err=
15820 65 72 72 6e 6f 3b 0a 09 09 0a 20 20 20 20 69 66  errno;....    if
15830 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 7b  ( err!=EEXIST ){
15840 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 50  .#ifdef SQLITE_P
15850 52 4f 58 59 5f 44 45 42 55 47 20 2f 2a 20 73 65  ROXY_DEBUG /* se
15860 74 20 74 68 65 20 73 71 6c 69 74 65 20 65 72 72  t the sqlite err
15870 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 73 74 65  or message inste
15880 61 64 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69  ad */.      fpri
15890 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
158a0 69 74 65 20 65 72 72 6f 72 20 63 72 65 61 74 69  ite error creati
158b0 6e 67 20 68 6f 73 74 20 49 44 20 66 69 6c 65 20  ng host ID file 
158c0 25 73 3a 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c  %s: %s\n", path,
158d0 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 29 3b   strerror(err));
158e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
158f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
15900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 63  ;.    }.    /* c
15910 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74  ouldn't create t
15920 68 65 20 66 69 6c 65 2c 20 72 65 61 64 20 69 74  he file, read it
15930 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20 20 20   instead */.    
15940 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
15950 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 45 58 43 4c 29  O_RDONLY|O_EXCL)
15960 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
15970 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
15980 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
15990 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
159a0 55 47 20 2f 2a 20 73 65 74 20 74 68 65 20 73 71  UG /* set the sq
159b0 6c 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  lite error messa
159c0 67 65 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 20  ge instead */.  
159d0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
159e0 72 72 2c 20 22 73 71 6c 69 74 65 20 65 72 72 6f  rr, "sqlite erro
159f0 72 20 6f 70 65 6e 69 6e 67 20 68 6f 73 74 20 49  r opening host I
15a00 44 20 66 69 6c 65 20 25 73 3a 20 25 73 5c 6e 22  D file %s: %s\n"
15a10 2c 20 70 61 74 68 2c 20 73 74 72 65 72 72 6f 72  , path, strerror
15a20 28 65 72 72 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (err));.#endif. 
15a30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15a40 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 7d 0a 20  TE_PERM;.    }. 
15a50 20 20 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 66     len = pread(f
15a60 64 2c 20 70 48 6f 73 74 49 44 2c 20 48 4f 53 54  d, pHostID, HOST
15a70 49 44 4c 45 4e 2c 20 30 29 3b 0a 09 09 69 66 28  IDLEN, 0);...if(
15a80 20 6c 65 6e 3c 30 20 29 7b 0a 09 09 09 2a 70 45   len<0 ){....*pE
15a90 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 09 09  rror = errno;...
15aa0 09 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  .rc = SQLITE_IOE
15ab0 52 52 5f 52 45 41 44 3b 0a 09 09 7d 65 6c 73 65  RR_READ;...}else
15ac0 20 69 66 28 20 6c 65 6e 3c 48 4f 53 54 49 44 4c   if( len<HOSTIDL
15ad0 45 4e 20 29 7b 0a 09 09 09 2a 70 45 72 72 6f 72  EN ){....*pError
15ae0 20 3d 20 30 3b 0a 09 09 09 72 63 20 3d 20 53 51   = 0;....rc = SQ
15af0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15b00 5f 52 45 41 44 3b 0a 09 09 7d 0a 20 20 20 20 63  _READ;...}.    c
15b10 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
15b20 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  ently leak the f
15b30 64 20 69 66 20 69 74 20 66 61 69 6c 73 20 2a 2f  d if it fails */
15b40 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47  .    OSTRACE3("G
15b50 45 54 48 4f 53 54 49 44 20 20 72 65 61 64 20 25  ETHOSTID  read %
15b60 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 48 6f  s pid=%d\n", pHo
15b70 73 74 49 44 2c 20 67 65 74 70 69 64 28 29 29 3b  stID, getpid());
15b80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
15ba0 20 69 3b 0a 20 20 20 20 2f 2a 20 77 65 27 72 65   i;.    /* we're
15bb0 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 68 6f   creating the ho
15bc0 73 74 20 49 44 20 66 69 6c 65 20 28 75 73 65 20  st ID file (use 
15bd0 61 20 72 61 6e 64 6f 6d 20 73 74 72 69 6e 67 20  a random string 
15be0 6f 66 20 62 79 74 65 73 29 20 2a 2f 0a 20 20 20  of bytes) */.   
15bf0 20 67 65 6e 48 6f 73 74 49 44 28 70 48 6f 73 74   genHostID(pHost
15c00 49 44 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ID);.    len = p
15c10 77 72 69 74 65 28 66 64 2c 20 70 48 6f 73 74 49  write(fd, pHostI
15c20 44 2c 20 48 4f 53 54 49 44 4c 45 4e 2c 20 30 29  D, HOSTIDLEN, 0)
15c30 3b 0a 09 09 69 66 28 20 6c 65 6e 3c 30 20 29 7b  ;...if( len<0 ){
15c40 0a 09 09 09 2a 70 45 72 72 6f 72 20 3d 20 65 72  ....*pError = er
15c50 72 6e 6f 3b 0a 09 09 09 72 63 20 3d 20 53 51 4c  rno;....rc = SQL
15c60 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
15c70 0a 09 09 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e  ...}else if( len
15c80 3c 48 4f 53 54 49 44 4c 45 4e 20 29 7b 0a 09 09  <HOSTIDLEN ){...
15c90 09 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  .*pError = 0;...
15ca0 09 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  .rc = SQLITE_IOE
15cb0 52 52 5f 57 52 49 54 45 3b 0a 09 09 7d 0a 20 20  RR_WRITE;...}.  
15cc0 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
15cd0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 74 68  silently leak th
15ce0 65 20 66 64 20 69 66 20 69 74 20 66 61 69 6c 73  e fd if it fails
15cf0 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 33   */.    OSTRACE3
15d00 28 22 47 45 54 48 4f 53 54 49 44 20 20 77 72 6f  ("GETHOSTID  wro
15d10 74 65 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  te %s pid=%d\n",
15d20 20 70 48 6f 73 74 49 44 2c 20 67 65 74 70 69 64   pHostID, getpid
15d30 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
15d40 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 74 61  rc;.  }.}../* ta
15d50 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79  kes the conch by
15d60 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64   taking a shared
15d70 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74   lock and read t
15d80 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63  he contents conc
15d90 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61  h, if .** lockPa
15da0 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  th is non-NULL, 
15db0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
15dc0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d  lock file path m
15dd0 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55  ust match.  A NU
15de0 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  LL .** lockPath 
15df0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c  means that the l
15e00 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63  ockPath in the c
15e10 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
15e20 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a  e used if the .*
15e30 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68  * host IDs match
15e40 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20  , or a new lock 
15e50 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e  path will be gen
15e60 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63  erated automatic
15e70 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69  ally .** and wri
15e80 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63  tten to the conc
15e90 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h file..*/.stati
15ea0 63 20 69 6e 74 20 74 61 6b 65 43 6f 6e 63 68 28  c int takeConch(
15eb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
15ec0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
15ed0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
15ee0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
15ef0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
15f00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
15f10 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
15f20 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
15f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f40 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
15f50 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
15f60 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
15f70 68 46 69 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  hFile;.    char 
15f80 74 65 73 74 56 61 6c 75 65 5b 43 4f 4e 43 48 4c  testValue[CONCHL
15f90 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 63 6f  EN];.    char co
15fa0 6e 63 68 56 61 6c 75 65 5b 43 4f 4e 43 48 4c 45  nchValue[CONCHLE
15fb0 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63  N];.    char loc
15fc0 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  kPath[MAXPATHLEN
15fd0 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 4c 6f  ];.    char *tLo
15fe0 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
15ff0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
16000 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 72  TE_OK;.    int r
16010 65 61 64 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f  eadRc = SQLITE_O
16020 4b 3b 0a 20 20 20 20 69 6e 74 20 73 79 6e 63 50  K;.    int syncP
16030 65 72 6d 73 20 3d 20 30 3b 0a 0a 20 20 20 20 4f  erms = 0;..    O
16040 53 54 52 41 43 45 34 28 22 54 41 4b 45 43 4f 4e  STRACE4("TAKECON
16050 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
16060 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
16070 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
16080 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
16090 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
160a0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
160b0 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
160c0 69 64 28 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d  id());..    rc =
160d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
160e0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
160f0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
16100 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
16110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 09 09 09 69  QLITE_OK ){....i
16130 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20  nt pError = 0;. 
16140 20 20 20 20 20 6d 65 6d 73 65 74 28 74 65 73 74       memset(test
16150 56 61 6c 75 65 2c 20 30 2c 20 43 4f 4e 43 48 4c  Value, 0, CONCHL
16160 45 4e 29 3b 20 2f 2f 20 63 6f 6e 63 68 20 69 73  EN); // conch is
16170 20 66 69 78 65 64 20 73 69 7a 65 0a 20 20 20 20   fixed size.    
16180 20 20 72 63 20 3d 20 67 65 74 48 6f 73 74 49 44    rc = getHostID
16190 28 74 65 73 74 56 61 6c 75 65 2c 20 26 70 45 72  (testValue, &pEr
161a0 72 6f 72 29 3b 0a 09 09 09 69 66 28 20 72 63 26  ror);....if( rc&
161b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3d 3d 53 51  SQLITE_IOERR==SQ
161c0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 09 09  LITE_IOERR ){...
161d0 09 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ..pFile->lastErr
161e0 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 09 09 09  no = pError;....
161f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  }.      if( pCtx
16200 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
16210 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 6c 63  ){.        strlc
16220 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48 4f  py(&testValue[HO
16230 53 54 49 44 4c 45 4e 5d 2c 20 70 43 74 78 2d 3e  STIDLEN], pCtx->
16240 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d  lockProxyPath, M
16250 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
16260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16280 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
16290 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
162a0 20 7d 0a 20 20 20 20 0a 20 20 20 20 72 65 61 64   }.    .    read
162b0 52 63 20 3d 20 75 6e 69 78 52 65 61 64 28 28 73  Rc = unixRead((s
162c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f  qlite3_file *)co
162d0 6e 63 68 46 69 6c 65 2c 20 63 6f 6e 63 68 56 61  nchFile, conchVa
162e0 6c 75 65 2c 20 43 4f 4e 43 48 4c 45 4e 2c 20 30  lue, CONCHLEN, 0
162f0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 52  );.    if( readR
16300 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
16310 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
16320 20 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20      int match = 
16330 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 61  0;.      if( rea
16340 64 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  dRc!=SQLITE_OK )
16350 7b 0a 09 09 09 09 69 66 28 20 72 63 26 53 51 4c  {.....if( rc&SQL
16360 49 54 45 5f 49 4f 45 52 52 3d 3d 53 51 4c 49 54  ITE_IOERR==SQLIT
16370 45 5f 49 4f 45 52 52 20 29 7b 0a 09 09 09 09 09  E_IOERR ){......
16380 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16390 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
163a0 73 74 45 72 72 6e 6f 3b 0a 09 09 09 09 7d 0a 20  stErrno;.....}. 
163b0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
163c0 52 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  Rc;.        goto
163d0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
163e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
163f0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61   if the conch ha
16400 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74  s data compare t
16410 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
16420 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
16430 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
16440 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20  .        /* for 
16450 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
16460 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
16470 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
16480 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
16490 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65        ** use the
164a0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
164b0 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72   path that's alr
164c0 65 61 64 79 20 69 6e 20 74 68 65 72 65 20 2a 2f  eady in there */
164d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d 65  .        if( !me
164e0 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c 20  mcmp(testValue, 
164f0 63 6f 6e 63 68 56 61 6c 75 65 2c 20 48 4f 53 54  conchValue, HOST
16500 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
16510 20 20 20 20 74 4c 6f 63 6b 50 61 74 68 20 3d 20      tLockPath = 
16520 28 63 68 61 72 20 2a 29 26 63 6f 6e 63 68 56 61  (char *)&conchVa
16530 6c 75 65 5b 48 4f 53 54 49 44 4c 45 4e 5d 3b 0a  lue[HOSTIDLEN];.
16540 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
16550 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
16560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16570 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
16580 77 65 27 76 65 20 67 6f 74 20 74 68 65 20 63 6f  we've got the co
16590 6e 63 68 20 69 66 20 63 6f 6e 63 68 56 61 6c 75  nch if conchValu
165a0 65 20 6d 61 74 63 68 65 73 20 6f 75 72 20 70 61  e matches our pa
165b0 74 68 20 61 6e 64 20 68 6f 73 74 20 49 44 20 2a  th and host ID *
165c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6d  /.        if( !m
165d0 65 6d 63 6d 70 28 74 65 73 74 56 61 6c 75 65 2c  emcmp(testValue,
165e0 20 63 6f 6e 63 68 56 61 6c 75 65 2c 20 43 4f 4e   conchValue, CON
165f0 43 48 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  CHLEN) ){.      
16600 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
16610 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
16620 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
16630 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  lse{.      /* a 
16640 73 68 6f 72 74 20 72 65 61 64 20 6d 65 61 6e 73  short read means
16650 20 77 65 27 72 65 20 22 63 72 65 61 74 69 6e 67   we're "creating
16660 22 20 74 68 65 20 63 6f 6e 63 68 20 28 65 76 65  " the conch (eve
16670 6e 20 74 68 6f 75 67 68 20 69 74 20 63 6f 75 6c  n though it coul
16680 64 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  d .      ** have
16690 20 62 65 65 6e 20 75 73 65 72 2d 69 6e 74 65 72   been user-inter
166a0 76 65 6e 74 69 6f 6e 29 2c 20 69 66 20 77 65 20  vention), if we 
166b0 61 63 71 75 69 72 65 20 74 68 65 20 65 78 63 6c  acquire the excl
166c0 75 73 69 76 65 20 6c 6f 63 6b 2c 0a 20 20 20 20  usive lock,.    
166d0 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
166e0 6f 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72  o match the curr
166f0 65 6e 74 20 6f 6e 2d 64 69 73 6b 20 70 65 72 6d  ent on-disk perm
16700 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
16710 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2f  atabase.      */
16720 0a 20 20 20 20 20 20 73 79 6e 63 50 65 72 6d 73  .      syncPerms
16730 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
16740 0a 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 63  .    /* either c
16750 6f 6e 63 68 20 77 61 73 20 65 6d 74 70 79 20 6f  onch was emtpy o
16760 72 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 2a  r didn't match *
16770 2f 0a 20 20 20 20 69 66 28 20 21 70 43 74 78 2d  /.    if( !pCtx-
16780 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
16790 7b 0a 20 20 20 20 20 20 67 65 74 4c 6f 63 6b 50  {.      getLockP
167a0 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ath(pCtx->dbPath
167b0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  , lockPath, MAXP
167c0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 74  ATHLEN);.      t
167d0 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
167e0 61 74 68 3b 0a 20 20 20 20 20 20 73 74 72 6c 63  ath;.      strlc
167f0 70 79 28 26 74 65 73 74 56 61 6c 75 65 5b 48 4f  py(&testValue[HO
16800 53 54 49 44 4c 45 4e 5d 2c 20 6c 6f 63 6b 50 61  STIDLEN], lockPa
16810 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
16820 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
16830 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
16840 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
16850 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
16860 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
16870 65 73 73 0a 20 20 20 20 20 2a 2a 20 68 61 73 20  ess.     ** has 
16880 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c  a shared lock al
16890 72 65 61 64 79 29 20 2a 2f 0a 20 20 20 20 72 63  ready) */.    rc
168a0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
168b0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
168c0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
168d0 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
168e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
168f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16900 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
16910 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
16920 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
16930 20 74 65 73 74 56 61 6c 75 65 2c 20 43 4f 4e 43   testValue, CONC
16940 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  HLEN, 0);.      
16950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16960 4b 20 26 26 20 73 79 6e 63 50 65 72 6d 73 20 29  K && syncPerms )
16970 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
16980 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
16990 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74     int err = fst
169a0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
169b0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
169c0 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  err==0 ){.      
169d0 20 20 20 20 6d 6f 64 65 5f 74 20 6d 6f 64 65 20      mode_t mode 
169e0 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  = buf.st_mode & 
169f0 30 31 30 30 36 36 36 3b 0a 20 20 20 20 20 20 20  0100666;.       
16a00 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
16a10 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
16a20 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  file permissions
16a30 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
16a40 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
16a50 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
16a60 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28           fchmod(
16a70 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
16a80 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 23 65 6c 73  f.st_mode);.#els
16a90 65 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  e.          if( 
16aa0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
16ab0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65  ->h, buf.st_mode
16ac0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
16ad0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
16ae0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
16af0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16b00 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
16b10 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
16b20 22 2c 62 75 66 2e 73 74 5f 6d 6f 64 65 2c 20 63  ",buf.st_mode, c
16b30 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
16b40 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  de));.          
16b50 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
16b60 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
16b70 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
16b80 53 55 43 43 45 44 45 44 5c 6e 22 2c 62 75 66 2e  SUCCEDED\n",buf.
16b90 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20  st_mode);.      
16ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
16bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
16bc0 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
16bd0 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
16be0 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54  tf(stderr, "STAT
16bf0 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68   FAILED[%d] with
16c00 20 25 64 20 25 73 5c 6e 22 2c 20 65 72 72 2c 20   %d %s\n", err, 
16c10 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
16c20 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ode));.#endif.  
16c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16c40 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e 63 68 46      }.    conchF
16c50 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
16c60 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
16c70 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
16c80 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
16c90 0a 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a  .end_takeconch:.
16ca0 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 54 52      OSTRACE2("TR
16cb0 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20  ANSPROXY: CLOSE 
16cc0 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
16cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16ce0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
16cf0 65 2d 3e 6f 66 6c 61 67 73 20 29 7b 0a 20 20 20  e->oflags ){.   
16d00 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
16d10 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52  =0 ){.#ifdef STR
16d20 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a  ICT_CLOSE_ERROR.
16d30 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
16d40 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
16d50 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16d60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
16d70 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  o;.          ret
16d80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16d90 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20  _CLOSE;.        
16da0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
16db0 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
16dc0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
16dd0 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a  k fd if fail */.
16de0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
16df0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
16e00 2d 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 64  -1;.      int fd
16e10 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62   = open(pCtx->db
16e20 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 66 6c  Path, pFile->ofl
16e30 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
16e40 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
16e50 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 4f 53 54  IONS);.      OST
16e60 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58  RACE2("TRANSPROX
16e70 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20  Y: OPEN  %d\n", 
16e80 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  fd);.      if( f
16e90 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d>=0 ){.        
16ea0 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  pFile->h = fd;. 
16eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16ec0 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
16ed0 4e 54 4f 50 45 4e 3b 20 2f 2f 20 53 51 4c 49 54  NTOPEN; // SQLIT
16ee0 45 5f 42 55 53 59 3f 20 74 61 6b 65 43 6f 6e 63  E_BUSY? takeConc
16ef0 68 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  h called during 
16f00 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 7d 0a  locking.      }.
16f10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16f20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
16f30 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
16f40 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
16f50 61 74 68 20 3d 20 74 4c 6f 63 6b 50 61 74 68 20  ath = tLockPath 
16f60 3f 20 74 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43  ? tLockPath : pC
16f70 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
16f80 68 3b 0a 20 20 20 20 20 20 2f 2f 20 41 43 53 3a  h;.      // ACS:
16f90 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
16fa0 63 6f 70 79 20 6f 66 20 70 61 74 68 20 73 6f 6d  copy of path som
16fb0 65 74 69 6d 65 73 0a 20 20 20 20 20 20 72 63 20  etimes.      rc 
16fc0 3d 20 63 72 65 61 74 65 50 72 6f 78 79 55 6e 69  = createProxyUni
16fd0 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
16fe0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  x->lockProxy);. 
16ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17010 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
17020 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  eld = 1;..      
17030 69 66 28 20 74 4c 6f 63 6b 50 61 74 68 20 29 7b  if( tLockPath ){
17040 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c  .        pCtx->l
17050 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
17060 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
17070 2c 20 74 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  , tLockPath);.  
17080 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
17090 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
170a0 6f 64 20 3d 3d 20 69 6f 4d 65 74 68 6f 64 46 6f  od == ioMethodFo
170b0 72 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 4c 4f  rLockingStyle(LO
170c0 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 29  CKING_STYLE_AFP)
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 28   ){.          ((
170e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
170f0 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
17100 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
17110 65 78 74 29 2d 3e 64 62 50 61 74 68 20 3d 20 70  ext)->dbPath = p
17120 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
17130 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  th;.        }.  
17140 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
17150 20 7b 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   {.      conchFi
17160 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
17170 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
17180 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
17190 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  O_LOCK);.    }. 
171a0 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b     OSTRACE3("TAK
171b0 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
171c0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
171d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
171e0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
171f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
17200 0a 20 20 7d 0a 7d 0a 20 20 0a 73 74 61 74 69 63  .  }.}.  .static
17210 20 69 6e 74 20 72 65 6c 65 61 73 65 43 6f 6e 63   int releaseConc
17220 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
17230 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
17240 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
17250 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
17260 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
17270 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
17280 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
17290 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
172a0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
172b0 65 3b 0a 0a 20 20 4f 53 54 52 41 43 45 34 28 22  e;..  OSTRACE4("
172c0 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
172d0 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
172e0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
172f0 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74  .           (pCt
17300 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
17310 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
17320 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
17330 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
17340 67 65 74 70 69 64 28 29 29 3b 0a 20 20 70 43 74  getpid());.  pCt
17350 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
17360 3b 0a 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69  ;.  rc = conchFi
17370 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
17380 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
17390 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
173a0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 4f 53 54 52 41  O_LOCK);.  OSTRA
173b0 43 45 33 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE3("RELEASECONC
173c0 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
173d0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
173e0 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
173f0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
17400 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
17410 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
17420 20 69 6e 74 20 67 65 74 43 6f 6e 63 68 50 61 74   int getConchPat
17430 68 46 72 6f 6d 44 42 50 61 74 68 28 63 68 61 72  hFromDBPath(char
17440 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
17450 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20  *pConchPath){.  
17460 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6c 65 6e  int i;.  int len
17470 20 3d 20 73 74 72 6c 65 6e 28 64 62 50 61 74 68   = strlen(dbPath
17480 29 3b 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  );.  char *conch
17490 50 61 74 68 3b 0a 20 20 0a 20 20 63 6f 6e 63 68  Path;.  .  conch
174a0 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73  Path = (char *)s
174b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65  qlite3_malloc(le
174c0 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f  n + 8);.  if( co
174d0 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  nchPath==0 ){.  
174e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
174f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 74 72  NOMEM;.  }.  str
17500 6c 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  lcpy(conchPath, 
17510 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
17520 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
17530 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
17540 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
17550 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
17560 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
17570 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
17580 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
17590 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
175a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
175b0 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
175c0 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
175d0 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
175e0 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
175f0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
17600 2b 2b 3b 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50  ++;.  }.  conchP
17610 61 74 68 5b 69 2b 31 5d 3d 27 5c 30 27 3b 0a 20  ath[i+1]='\0';. 
17620 20 73 74 72 6c 63 61 74 28 63 6f 6e 63 68 50 61   strlcat(conchPa
17630 74 68 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 6c 65  th, "-conch", le
17640 6e 20 2b 20 38 29 3b 0a 20 20 2a 70 43 6f 6e 63  n + 8);.  *pConc
17650 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
17660 68 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  h;.  return SQLI
17670 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
17680 20 69 6e 74 20 67 65 74 4c 6f 63 6b 50 61 74 68   int getLockPath
17690 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
176a0 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
176b0 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
176c0 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
176d0 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
176e0 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
176f0 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
17700 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
17710 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
17720 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
17730 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
17740 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
17750 0a 20 20 20 20 63 68 61 72 20 75 74 64 69 72 5b  .    char utdir[
17760 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
17770 20 0a 20 20 20 20 63 6f 6e 66 73 74 72 28 5f 43   .    confstr(_C
17780 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
17790 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
177a0 61 78 4c 65 6e 29 3b 0a 20 20 20 20 6c 65 6e 20  axLen);.    len 
177b0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
177c0 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
177d0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 20 20 69 66   maxLen);.    if
177e0 28 20 6d 6b 64 69 72 28 6c 50 61 74 68 2c 20 53  ( mkdir(lPath, S
177f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
17800 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
17810 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NS) ){.      /* 
17820 69 66 20 6d 6b 64 69 72 20 66 61 69 6c 73 2c 20  if mkdir fails, 
17830 68 61 6e 64 6c 65 20 61 73 20 6c 6f 63 6b 20 66  handle as lock f
17840 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 66 61 69  ile creation fai
17850 6c 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  lure */.      in
17860 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 23  t err = errno;.#
17870 20 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44    ifdef SQLITE_D
17880 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 65  EBUG.      if( e
17890 72 72 21 3d 45 45 58 49 53 54 20 29 7b 0a 20 20  rr!=EEXIST ){.  
178a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
178b0 64 65 72 72 2c 20 22 67 65 74 4c 6f 63 6b 50 61  derr, "getLockPa
178c0 74 68 3a 20 6d 6b 64 69 72 28 25 73 2c 30 25 6f  th: mkdir(%s,0%o
178d0 29 20 65 72 72 6f 72 20 25 64 20 25 73 5c 6e 22  ) error %d %s\n"
178e0 2c 20 6c 50 61 74 68 2c 0a 20 20 20 20 20 20 20  , lPath,.       
178f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17900 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
17910 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2c 20 65 72  _PERMISSIONS, er
17920 72 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  r, strerror(err)
17930 29 3b 0a 20 20 20 20 20 20 7d 0a 23 20 20 65 6e  );.      }.#  en
17940 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
17950 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 47       OSTRACE3("G
17960 45 54 4c 4f 43 4b 50 41 54 48 20 20 6d 6b 64 69  ETLOCKPATH  mkdi
17970 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
17980 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  lPath, getpid())
17990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 7d  ;.    }.    .  }
179a0 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
179b0 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
179c0 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
179d0 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
179e0 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
179f0 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
17a00 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
17a10 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
17a20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
17a30 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
17a40 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
17a50 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
17a60 20 64 62 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28   dbLen = strlen(
17a70 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
17a80 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
17a90 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e  (i+len+7)<maxLen
17aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
17ab0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
17ac0 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
17ad0 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
17ae0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
17af0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
17b00 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
17b10 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
17b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b30 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  OK;.}../* Takes 
17b40 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72  a fully configur
17b50 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ed proxy locking
17b60 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65  -style unix file
17b70 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a   and switches.**
17b80 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
17b90 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74  file path .*/.st
17ba0 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c  atic int switchL
17bb0 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69  ockProxyPath(uni
17bc0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
17bd0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
17be0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
17bf0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
17c00 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
17c10 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
17c20 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
17c30 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70  har *oldPath = p
17c40 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
17c50 74 68 3b 0a 20 20 69 6e 74 20 74 61 6b 65 6e 20  th;.  int taken 
17c60 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
17c70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
17c80 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17c90 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
17ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17cb0 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  BUSY;.  }  ..  /
17cc0 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
17cd0 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e  if the path is N
17ce0 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d  ULL, :auto: or m
17cf0 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74  atches the exist
17d00 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66  ing path */.  if
17d10 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b  ( !path || path[
17d20 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72  0]=='\0' || !str
17d30 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f  cmp(path, ":auto
17d40 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50  :") ||.    (oldP
17d50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28  ath && !strncmp(
17d60 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d  oldPath, path, M
17d70 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20  AXPATHLEN)) ){. 
17d80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17d90 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17da0 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
17db0 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
17dc0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74  ckProxy;.    pCt
17dd0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c  x->lockProxy=NUL
17de0 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  L;.    pCtx->con
17df0 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20  chHeld = 0;.    
17e00 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e  if( lockProxy!=N
17e10 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  ULL ){.      rc=
17e20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
17e30 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
17e40 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50  te3_file *)lockP
17e50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
17e60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
17e80 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
17e90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17ea0 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b  3_free(oldPath);
17eb0 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
17ec0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
17ed0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61  e3DbStrDup(0, pa
17ee0 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  th);.  }.  .  re
17ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17f00 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
17f10 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
17f20 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
17f30 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
17f40 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
17f50 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
17f60 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
17f70 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
17f80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
17f90 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
17fa0 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
17fb0 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
17fc0 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
17fd0 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
17fe0 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
17ff0 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
18000 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
18010 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
18020 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
18030 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
18040 69 63 20 69 6e 74 20 74 72 61 6e 73 66 6f 72 6d  ic int transform
18050 55 6e 69 78 46 69 6c 65 46 6f 72 4c 6f 63 6b 50  UnixFileForLockP
18060 72 6f 78 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  roxy(unixFile *p
18070 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
18080 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
18090 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
180a0 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62  *pCtx;.  char db
180b0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
180c0 3b 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  ;.  char *lockPa
180d0 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72  th=NULL;.  int r
180e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
180f0 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c   .  if( pFile->l
18100 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
18110 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18120 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
18130 20 20 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e    getDbPathForUn
18140 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62  ixFile(pFile, db
18150 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61  Path);.  if( !pa
18160 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
18170 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
18180 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29  ath, ":auto:") )
18190 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e  {.    lockPath=N
181a0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
181b0 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72    lockPath=(char
181c0 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a   *)path;.  }.  .
181d0 20 20 4f 53 54 52 41 43 45 34 28 22 54 52 41 4e    OSTRACE4("TRAN
181e0 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25  SPROXY  %d for %
181f0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  s pid=%d\n", pFi
18200 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
18210 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f    (lockPath ? lo
18220 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  ckPath : ":auto:
18230 22 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  "), getpid());..
18240 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33    pCtx = sqlite3
18250 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
18260 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20  *pCtx) );.  if( 
18270 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCtx==0 ){.    r
18280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
18290 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
182a0 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCtx, 0, sizeof
182b0 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20  (*pCtx));..  rc 
182c0 3d 20 67 65 74 43 6f 6e 63 68 50 61 74 68 46 72  = getConchPathFr
182d0 6f 6d 44 42 50 61 74 68 28 64 62 50 61 74 68 2c  omDBPath(dbPath,
182e0 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
182f0 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63  ePath);.  if( rc
18300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18310 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 50 72     rc = createPr
18320 6f 78 79 55 6e 69 78 46 69 6c 65 28 70 43 74 78  oxyUnixFile(pCtx
18330 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
18340 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
18350 65 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  e);.  }  .  if( 
18360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18370 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20   lockPath ){.   
18380 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
18390 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
183a0 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61  StrDup(0, lockPa
183b0 74 68 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 74 72  th);.  }..end_tr
183c0 61 6e 73 66 6f 72 6d 5f 66 69 6c 65 3a 0a 20 20  ansform_file:.  
183d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
183e0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  K ){.    /* all 
183f0 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
18400 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20  ted, proxys are 
18410 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69  created and assi
18420 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77  gned, .    ** sw
18430 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67  itch the locking
18440 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
18450 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e  thod then return
18460 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74  ..    */.    pCt
18470 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69  x->dbPath = sqli
18480 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64  te3DbStrDup(0, d
18490 62 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  bPath);.    pCtx
184a0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
184b0 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
184c0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
184d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
184e0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
184f0 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
18500 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
18510 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
18520 3e 70 4d 65 74 68 6f 64 20 3d 20 69 6f 4d 65 74  >pMethod = ioMet
18530 68 6f 64 46 6f 72 4c 6f 63 6b 69 6e 67 53 74 79  hodForLockingSty
18540 6c 65 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  le(LOCKING_STYLE
18550 5f 50 52 4f 58 59 29 3b 0a 20 20 7d 65 6c 73 65  _PROXY);.  }else
18560 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  {.    if( pCtx->
18570 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20  conchFile ){ .  
18580 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 63      rc = pCtx->c
18590 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
185a0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
185b0 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
185c0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
185d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
185e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
185f0 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
18600 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
18610 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18620 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
18630 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c  ePath); .    sql
18640 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
18650 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
18660 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20  "TRANSPROXY  %d 
18670 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
18680 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
18690 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
186a0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
186b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 20 0a    return rc;.} .
186c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
186d0 74 65 50 72 6f 78 79 55 6e 69 78 46 69 6c 65 28  teProxyUnixFile(
186e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
186f0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46  , unixFile **ppF
18700 69 6c 65 29 20 7b 0a 20 20 69 6e 74 20 66 64 3b  ile) {.  int fd;
18710 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d  .  int dirfd = -
18720 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
18730 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
18740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 64  SQLITE_OK;..  fd
18750 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f   = open(path, O_
18760 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 2c 20  RDWR | O_CREAT, 
18770 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
18780 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
18790 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
187a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
187b0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
187c0 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
187d0 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
187e0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 75 6e  malloc(sizeof(un
187f0 69 78 46 69 6c 65 29 29 3b 0a 20 20 69 66 28 20  ixFile));.  if( 
18800 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
18810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18820 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
18830 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
18840 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
18850 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
18860 78 46 69 6c 65 29 29 3b 0a 20 20 0a 20 20 72 63  xFile));.  .  rc
18870 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
18880 65 28 4e 55 4c 4c 2c 20 66 64 2c 20 64 69 72 66  e(NULL, fd, dirf
18890 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
188a0 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c  *)pNew, path, 0,
188b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
188c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
188d0 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
188e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
188f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
18900 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
18910 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
18920 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
18930 20 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65   if error, we're
18940 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
18950 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
18960 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ree(pNew);.  ret
18970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64  urn rc;.}...#end
18980 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18990 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
189a0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
189b0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  nolockLockingCon
189c0 74 65 78 74 20 69 73 20 76 6f 69 64 0a 2a 2f 0a  text is void.*/.
189d0 74 79 70 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c  typedef void nol
189e0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
189f0 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  t;..static int n
18a00 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
18a10 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
18a20 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
18a30 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
18a40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18a50 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
18a60 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
18a70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18a80 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
18a90 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
18aa0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
18ab0 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
18ac0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
18ad0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
18ae0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
18af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
18b00 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
18b10 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18b20 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
18b30 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
18b40 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
18b50 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
18b60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18b70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
18b80 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
18b90 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
18ba0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
18bb0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
18bc0 20 72 63 3b 0a 20 20 69 66 28 20 49 53 5f 56 58   rc;.  if( IS_VX
18bd0 57 4f 52 4b 53 20 29 20 65 6e 74 65 72 4d 75 74  WORKS ) enterMut
18be0 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ex();.  rc = clo
18bf0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
18c00 20 20 69 66 28 20 49 53 5f 56 58 57 4f 52 4b 53    if( IS_VXWORKS
18c10 20 29 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b   ) leaveMutex();
18c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18c30 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
18c40 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
18c50 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
18c60 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
18c70 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
18c80 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
18c90 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
18ca0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
18cb0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
18cc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18cd0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
18ce0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
18cf0 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
18d00 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
18d10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18d20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18d30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
18d40 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
18d50 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  {.#if SQLITE_ENA
18d60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
18d70 45 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  E.      unixFile
18d80 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18d90 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
18da0 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
18db0 64 20 3d 3d 20 69 6f 4d 65 74 68 6f 64 46 6f 72  d == ioMethodFor
18dc0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 4c 4f 43  LockingStyle(LOC
18dd0 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 52 4f 58 59  KING_STYLE_PROXY
18de0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  ) ){.        pro
18df0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
18e00 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
18e10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
18e20 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
18e30 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 74 61  text;.        ta
18e40 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
18e50 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
18e60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
18e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  ){.          *(c
18e80 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
18e90 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  g = pCtx->lockPr
18ea0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
18eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18ec0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
18ed0 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a  *)pArg = ":auto:
18ee0 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20   (not held)";.  
18ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
18f00 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a  else {.        *
18f10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
18f20 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Arg = NULL;.    
18f30 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
18f40 2a 28 76 6f 69 64 2a 29 70 41 72 67 20 3d 20 4e  *(void*)pArg = N
18f50 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ULL;.#endif.    
18f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18f70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
18f80 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
18f90 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 23  CKPROXYFILE: {.#
18fa0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
18fb0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
18fc0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
18fd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18fe0 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  *)id;.      int 
18ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19000 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78        int isProx
19010 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d  yStyle = (pFile-
19020 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 69 6f 4d 65  >pMethod == ioMe
19030 74 68 6f 64 46 6f 72 4c 6f 63 6b 69 6e 67 53 74  thodForLockingSt
19040 79 6c 65 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  yle(LOCKING_STYL
19050 45 5f 50 52 4f 58 59 29 29 3b 0a 20 20 20 20 20  E_PROXY));.     
19060 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20   if( pArg==NULL 
19070 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  || (const char *
19080 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  )pArg==0 ){.    
19090 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
190a0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
190b0 20 20 2f 2f 20 74 75 72 6e 20 6f 66 66 20 70 72    // turn off pr
190c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f  oxy locking - no
190d0 74 20 73 75 70 70 6f 72 74 65 64 0a 20 20 20 20  t supported.    
190e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
190f0 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45  E_ERROR /*SQLITE
19100 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54  _PROTOCOL? SQLIT
19110 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20  E_MISUSE?*/;.   
19120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19130 20 20 20 20 20 20 2f 2f 20 74 75 72 6e 20 6f 66        // turn of
19140 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
19150 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20  - already off - 
19160 4e 4f 4f 50 0a 20 20 20 20 20 20 20 20 20 20 72  NOOP.          r
19170 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
191a0 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
191b0 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
191c0 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
191d0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
191e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
191f0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
19200 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
19210 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
19220 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
19230 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
19240 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
19250 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
19260 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 20 28  , ":auto:") || (
19270 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
19280 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28  ath && !strncmp(
19290 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
192a0 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  ath, proxyPath, 
192b0 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a  MAXPATHLEN)) ){.
192c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
192d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
192e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
192f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
19300 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
19310 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
19320 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
19330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19340 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 75 72            // tur
19350 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
19360 6c 6f 63 6b 69 6e 67 20 0a 20 20 20 20 20 20 20  locking .       
19370 20 20 20 72 63 20 3d 20 74 72 61 6e 73 66 6f 72     rc = transfor
19380 6d 55 6e 69 78 46 69 6c 65 46 6f 72 4c 6f 63 6b  mUnixFileForLock
19390 50 72 6f 78 79 28 70 46 69 6c 65 2c 20 70 72 6f  Proxy(pFile, pro
193a0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
193b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
193c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73   return rc;.#els
193d0 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  e.      return S
193e0 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51  QLITE_ERROR /*SQ
193f0 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53  LITE_PROTOCOL? S
19400 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b  QLITE_MISUSE?*/;
19410 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19420 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
19430 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
19440 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
19450 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19460 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
19470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19480 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20 20  OK;.    }.      
19490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
194a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
194b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
194c0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
194d0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
194e0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
194f0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
19500 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
19510 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
19520 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
19530 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
19540 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
19550 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
19560 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
19570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
19580 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
19590 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
195a0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
195b0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
195c0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
195d0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
195e0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
195f0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
19600 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
19610 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
19620 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
19630 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
19640 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
19650 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
19660 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
19670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19680 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
19690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
196a0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
196b0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
196c0 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
196d0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
196e0 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  r the file. This
196f0 20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72   is always 0 for
19700 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   unix..*/.static
19710 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
19720 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
19730 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
19740 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
19750 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
19760 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
19770 7d 0a 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  }..#define IOMET
19780 48 4f 44 53 28 78 43 6c 6f 73 65 2c 20 78 4c 6f  HODS(xClose, xLo
19790 63 6b 2c 20 78 55 6e 6c 6f 63 6b 2c 20 78 43 68  ck, xUnlock, xCh
197a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29  eckReservedLock)
197b0 20 7b 20 20 20 20 5c 0a 31 2c 20 20 20 20 20 20   {    \.1,      
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
197e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 78               \.x
19800 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
19810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
19820 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 5c 0a 75 6e 69 78 52 65 61 64 2c 20      \.unixRead, 
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 20 20 20 20 5c 0a 75 6e 69             \.uni
19890 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
198a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
198b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 5c 0a 75 6e 69 78 54 72 75 6e 63 61 74 65    \.unixTruncate
198e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
198f0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 20 5c 0a 75 6e 69 78 53           \.unixS
19920 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
19930 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
19940 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 5c 0a 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20  \.unixFileSize, 
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19980 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 20 20 20 5c 0a 78 4c 6f 63 6b 2c 20         \.xLock, 
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
199f0 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
19a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19a10 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 5c 0a 78 43 68 65 63 6b 52 65 73       \.xCheckRes
19a40 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
19a50 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
19a60 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
19a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 75 6e              \.un
19a80 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
19a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
19aa0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 20 5c 0a 75 6e 69 78 53 65 63 74 6f 72 53     \.unixSectorS
19ad0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
19ae0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
19af0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19b00 20 20 20 20 20 20 20 20 20 20 5c 0a 75 6e 69 78            \.unix
19b10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
19b20 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65 76 69  stics   /* xDevi
19b30 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
19b40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19b50 20 5c 0a 7d 0a 73 74 61 74 69 63 20 73 71 6c 69   \.}.static sqli
19b60 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
19b70 49 6f 4d 65 74 68 6f 64 5b 5d 20 3d 20 7b 0a 49  IoMethod[] = {.I
19b80 4f 4d 45 54 48 4f 44 53 28 75 6e 69 78 43 6c 6f  OMETHODS(unixClo
19b90 73 65 2c 20 75 6e 69 78 4c 6f 63 6b 2c 20 75 6e  se, unixLock, un
19ba0 69 78 55 6e 6c 6f 63 6b 2c 20 75 6e 69 78 43 68  ixUnlock, unixCh
19bb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29  eckReservedLock)
19bc0 20 0a 2c 49 4f 4d 45 54 48 4f 44 53 28 6e 6f 6c   .,IOMETHODS(nol
19bd0 6f 63 6b 43 6c 6f 73 65 2c 20 6e 6f 6c 6f 63 6b  ockClose, nolock
19be0 4c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  Lock, nolockUnlo
19bf0 63 6b 2c 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  ck, nolockCheckR
19c00 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a 23 69 66  eservedLock).#if
19c10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19c20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2c 49 4f  OCKING_STYLE.,IO
19c30 4d 45 54 48 4f 44 53 28 64 6f 74 6c 6f 63 6b 43  METHODS(dotlockC
19c40 6c 6f 73 65 2c 20 64 6f 74 6c 6f 63 6b 4c 6f 63  lose, dotlockLoc
19c50 6b 2c 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  k, dotlockUnlock
19c60 2c 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73  ,dotlockCheckRes
19c70 65 72 76 65 64 4c 6f 63 6b 29 0a 23 69 66 20 49  ervedLock).#if I
19c80 53 5f 56 58 57 4f 52 4b 53 0a 20 20 2c 49 4f 4d  S_VXWORKS.  ,IOM
19c90 45 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f  ETHODS(nolockClo
19ca0 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  se, nolockLock, 
19cb0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f  nolockUnlock, no
19cc0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
19cd0 64 4c 6f 63 6b 29 0a 20 20 2c 49 4f 4d 45 54 48  dLock).  ,IOMETH
19ce0 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  ODS(nolockClose,
19cf0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c   nolockLock, nol
19d00 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63  ockUnlock, noloc
19d10 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
19d20 63 6b 29 0a 20 20 2c 49 4f 4d 45 54 48 4f 44 53  ck).  ,IOMETHODS
19d30 28 6e 61 6d 65 64 73 65 6d 43 6c 6f 73 65 2c 20  (namedsemClose, 
19d40 6e 61 6d 65 64 73 65 6d 4c 6f 63 6b 2c 20 6e 61  namedsemLock, na
19d50 6d 65 64 73 65 6d 55 6e 6c 6f 63 6b 2c 20 6e 61  medsemUnlock, na
19d60 6d 65 64 73 65 6d 43 68 65 63 6b 52 65 73 65 72  medsemCheckReser
19d70 76 65 64 4c 6f 63 6b 29 0a 20 20 2c 49 4f 4d 45  vedLock).  ,IOME
19d80 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73  THODS(nolockClos
19d90 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e  e, nolockLock, n
19da0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c  olockUnlock, nol
19db0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
19dc0 4c 6f 63 6b 29 0a 23 65 6c 73 65 0a 20 20 2c 49  Lock).#else.  ,I
19dd0 4f 4d 45 54 48 4f 44 53 28 66 6c 6f 63 6b 43 6c  OMETHODS(flockCl
19de0 6f 73 65 2c 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  ose, flockLock, 
19df0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 66 6c 6f  flockUnlock, flo
19e00 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
19e10 6f 63 6b 29 0a 20 20 2c 49 4f 4d 45 54 48 4f 44  ock).  ,IOMETHOD
19e20 53 28 61 66 70 43 6c 6f 73 65 2c 20 61 66 70 4c  S(afpClose, afpL
19e30 6f 63 6b 2c 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  ock, afpUnlock, 
19e40 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
19e50 4c 6f 63 6b 29 0a 20 20 2c 49 4f 4d 45 54 48 4f  Lock).  ,IOMETHO
19e60 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  DS(nolockClose, 
19e70 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c 6f  nolockLock, nolo
19e80 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b  ckUnlock, nolock
19e90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19ea0 6b 29 0a 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28  k).  ,IOMETHODS(
19eb0 70 72 6f 78 79 43 6c 6f 73 65 2c 20 70 72 6f 78  proxyClose, prox
19ec0 79 4c 6f 63 6b 2c 20 70 72 6f 78 79 55 6e 6c 6f  yLock, proxyUnlo
19ed0 63 6b 2c 20 70 72 6f 78 79 43 68 65 63 6b 52 65  ck, proxyCheckRe
19ee0 73 65 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6e 64  servedLock).#end
19ef0 69 66 0a 23 65 6e 64 69 66 0a 2f 2a 20 54 68 65  if.#endif./* The
19f00 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 49 4f   order of the IO
19f10 4d 45 54 48 4f 44 53 20 6d 61 63 72 6f 73 20 61  METHODS macros a
19f20 62 6f 76 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  bove is importan
19f30 74 2e 20 20 49 74 20 6d 75 73 74 20 62 65 20 74  t.  It must be t
19f40 68 65 0a 20 2a 2a 20 73 61 6d 65 20 6f 72 64 65  he. ** same orde
19f50 72 20 61 73 20 74 68 65 20 4c 4f 43 4b 49 4e 47  r as the LOCKING
19f60 5f 53 54 59 4c 45 20 6e 75 6d 62 65 72 73 0a 20  _STYLE numbers. 
19f70 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  */.};../*.** Ini
19f80 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
19f90 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
19fa0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
19fb0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
19fc0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6c 6f 63  ..**.** When loc
19fd0 6b 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 73 20  king extensions 
19fe0 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65  are enabled, the
19ff0 20 66 69 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f   filepath and lo
1a000 63 6b 69 6e 67 20 73 74 79 6c 65 20 0a 2a 2a 20  cking style .** 
1a010 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20 64 65  are needed to de
1a020 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
1a030 46 69 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f 20  File pMethod to 
1a040 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  use for locking 
1a050 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 20 54  operations..** T
1a060 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65  he locking-style
1a070 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
1a080 67 43 6f 6e 74 65 78 74 20 64 61 74 61 20 73 74  gContext data st
1a090 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1a0a0 65 64 20 0a 2a 2a 20 61 6e 64 20 61 73 73 69 67  ed .** and assig
1a0b0 6e 65 64 20 68 65 72 65 20 61 6c 73 6f 2e 0a 2a  ned here also..*
1a0c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1a0d0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
1a0e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1a0f0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
1a100 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
1a110 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a130 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
1a140 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
1a150 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
1a160 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20  nt dirfd,       
1a170 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
1a180 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
1a190 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
1a1a0 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
1a1b0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
1a1c0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a1d0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
1a1e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a1f0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
1a200 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
1a210 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
1a220 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  noLock,         
1a230 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b      /* Omit lock
1a240 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ing if true */. 
1a250 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
1a260 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1a270 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74  te on close if t
1a280 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
1a290 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  eLockingStyle;. 
1a2a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
1a2b0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
1a2c0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1a2d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1a2e0 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d  rt( pNew->pLock=
1a2f0 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  =NULL );.  asser
1a300 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d  t( pNew->pOpen==
1a310 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  NULL );..  /* Pa
1a320 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65  rameter isDelete
1a330 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e   is only used on
1a340 20 76 78 77 6f 72 6b 73 2e 20 50 61 72 61 6d 65   vxworks. Parame
1a350 74 65 72 20 70 56 66 73 20 69 73 20 6f 6e 6c 79  ter pVfs is only
1a360 0a 20 20 2a 2a 20 75 73 65 64 20 69 66 20 45 4e  .  ** used if EN
1a370 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1a380 4c 45 20 69 73 20 64 65 66 69 6e 65 64 2e 20 45  LE is defined. E
1a390 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c  xpress this expl
1a3a0 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72  icitly .  ** her
1a3b0 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d  e to prevent com
1a3c0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1a3d0 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
1a3e0 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
1a3f0 66 28 20 21 49 53 5f 56 58 57 4f 52 4b 53 20 29  f( !IS_VXWORKS )
1a400 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a410 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 69  R(isDelete);.  i
1a420 66 28 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c  f( !SQLITE_ENABL
1a430 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a440 29 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ) UNUSED_PARAMET
1a450 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
1a460 21 49 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 21  !IS_VXWORKS && !
1a470 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a480 43 4b 49 4e 47 5f 53 54 59 4c 45 20 29 20 55 4e  CKING_STYLE ) UN
1a490 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
1a4a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 4f 53  Filename);..  OS
1a4b0 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20  TRACE3("OPEN    
1a4c0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
1a4d0 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20  Filename);    . 
1a4e0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
1a4f0 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69  pNew->dirfd = di
1a500 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41  rfd;.  SET_THREA
1a510 44 49 44 28 70 4e 65 77 29 3b 0a 0a 23 69 66 20  DID(pNew);..#if 
1a520 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 7b 0a 20  IS_VXWORKS.  {. 
1a530 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c     HashElem *pEl
1a540 65 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  em;.    char *zR
1a550 65 61 6c 6e 61 6d 65 20 3d 20 76 78 72 65 61 6c  ealname = vxreal
1a560 70 61 74 68 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  path(zFilename, 
1a570 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  1);.    int n;. 
1a580 20 20 20 70 4e 65 77 2d 3e 7a 52 65 61 6c 70 61     pNew->zRealpa
1a590 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  th = 0;.    if( 
1a5a0 21 7a 52 65 61 6c 6e 61 6d 65 20 29 7b 0a 20 20  !zRealname ){.  
1a5b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a5c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 65 4c 6f  NOMEM;.      eLo
1a5d0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 4c 4f 43  ckingStyle = LOC
1a5e0 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b  KING_STYLE_NONE;
1a5f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a600 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65    n = strlen(zRe
1a610 61 6c 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  alname) + 1;.   
1a620 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b     enterMutex();
1a630 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 73  .      pElem = s
1a640 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 45 6c  qlite3HashFindEl
1a650 65 6d 28 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52  em(&nameHash, zR
1a660 65 61 6c 6e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ealname, n);.   
1a670 20 20 20 69 66 28 20 70 45 6c 65 6d 20 29 7b 0a     if( pElem ){.
1a680 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 63 6e 74          long cnt
1a690 20 3d 20 28 6c 6f 6e 67 29 70 45 6c 65 6d 2d 3e   = (long)pElem->
1a6a0 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6e  data;.        cn
1a6b0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t++;.        pNe
1a6c0 77 2d 3e 7a 52 65 61 6c 70 61 74 68 20 3d 20 70  w->zRealpath = p
1a6d0 45 6c 65 6d 2d 3e 70 4b 65 79 3b 0a 20 20 20 20  Elem->pKey;.    
1a6e0 20 20 20 20 70 45 6c 65 6d 2d 3e 64 61 74 61 20      pElem->data 
1a6f0 3d 20 28 76 6f 69 64 2a 29 63 6e 74 3b 0a 20 20  = (void*)cnt;.  
1a700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a710 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61     if( sqlite3Ha
1a720 73 68 49 6e 73 65 72 74 28 26 6e 61 6d 65 48 61  shInsert(&nameHa
1a730 73 68 2c 20 7a 52 65 61 6c 6e 61 6d 65 2c 20 6e  sh, zRealname, n
1a740 2c 20 28 76 6f 69 64 2a 29 31 29 3d 3d 30 20 29  , (void*)1)==0 )
1a750 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6c 65  {.          pEle
1a760 6d 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  m = sqlite3HashF
1a770 69 6e 64 45 6c 65 6d 28 26 6e 61 6d 65 48 61 73  indElem(&nameHas
1a780 68 2c 20 7a 52 65 61 6c 6e 61 6d 65 2c 20 6e 29  h, zRealname, n)
1a790 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1a7a0 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  pElem ){.       
1a7b0 20 20 20 20 20 70 4e 65 77 2d 3e 7a 52 65 61 6c       pNew->zReal
1a7c0 70 61 74 68 20 3d 20 70 45 6c 65 6d 2d 3e 70 4b  path = pElem->pK
1a7d0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ey;.          }e
1a7e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a7f0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1a800 72 74 28 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52  rt(&nameHash, zR
1a810 65 61 6c 6e 61 6d 65 2c 20 6e 2c 20 30 29 3b 0a  ealname, n, 0);.
1a820 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a830 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a840 20 20 20 20 20 20 20 20 20 20 20 65 4c 6f 63 6b             eLock
1a850 69 6e 67 53 74 79 6c 65 20 3d 20 4c 4f 43 4b 49  ingStyle = LOCKI
1a860 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20  NG_STYLE_NONE;. 
1a870 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a880 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a890 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
1a8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1a8b0 72 65 65 28 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a  ree(zRealname);.
1a8c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a8d0 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ..  if( noLock )
1a8e0 7b 0a 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74  {.    eLockingSt
1a8f0 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53 54  yle = LOCKING_ST
1a900 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  YLE_NONE;.  }els
1a910 65 7b 0a 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53  e{.    eLockingS
1a920 74 79 6c 65 20 3d 20 64 65 74 65 63 74 4c 6f 63  tyle = detectLoc
1a930 6b 69 6e 67 53 74 79 6c 65 28 70 56 66 73 2c 20  kingStyle(pVfs, 
1a940 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 23  zFilename, h);.#
1a950 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1a960 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
1a970 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
1a980 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
1a990 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
1a9a0 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
1a9b0 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
1a9c0 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
1a9d0 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
1a9e0 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
1a9f0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
1aa00 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
1aa10 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
1aa20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
1aa30 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
1aa40 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
1aa50 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1aa60 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
1aa70 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
1aa80 7d 0a 0a 20 20 2f 2a 20 4d 61 63 72 6f 20 74 6f  }..  /* Macro to
1aa90 20 64 65 66 69 6e 65 20 74 68 65 20 73 74 61 74   define the stat
1aaa0 69 63 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ic contents of a
1aab0 6e 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  n sqlite3_io_met
1aac0 68 6f 64 73 20 0a 20 20 2a 2a 20 73 74 72 75 63  hods .  ** struc
1aad0 74 75 72 65 20 66 6f 72 20 61 20 75 6e 69 78 20  ture for a unix 
1aae0 62 61 63 6b 65 6e 64 20 66 69 6c 65 2e 20 44 69  backend file. Di
1aaf0 66 66 65 72 65 6e 74 20 6c 6f 63 6b 69 6e 67 20  fferent locking 
1ab00 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 72 65 71  methods.  ** req
1ab10 75 69 72 65 20 64 69 66 66 65 72 65 6e 74 20 66  uire different f
1ab20 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  unctions for the
1ab30 20 78 43 6c 6f 73 65 2c 20 78 4c 6f 63 6b 2c 20   xClose, xLock, 
1ab40 78 55 6e 6c 6f 63 6b 20 61 6e 64 0a 20 20 2a 2a  xUnlock and.  **
1ab50 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1ab60 6f 63 6b 20 6d 65 74 68 6f 64 73 2e 0a 20 20 2a  ock methods..  *
1ab70 2f 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49  /.  assert(LOCKI
1ab80 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 3d 3d  NG_STYLE_POSIX==
1ab90 31 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43  1);.  assert(LOC
1aba0 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3d  KING_STYLE_NONE=
1abb0 3d 32 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f  =2);.  assert(LO
1abc0 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46  CKING_STYLE_DOTF
1abd0 49 4c 45 3d 3d 33 29 3b 0a 20 20 61 73 73 65 72  ILE==3);.  asser
1abe0 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  t(LOCKING_STYLE_
1abf0 46 4c 4f 43 4b 3d 3d 34 29 3b 0a 20 20 61 73 73  FLOCK==4);.  ass
1ac00 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ert(LOCKING_STYL
1ac10 45 5f 41 46 50 3d 3d 35 29 3b 0a 20 20 61 73 73  E_AFP==5);.  ass
1ac20 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ert(LOCKING_STYL
1ac30 45 5f 4e 41 4d 45 44 53 45 4d 3d 3d 36 29 3b 0a  E_NAMEDSEM==6);.
1ac40 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47    assert(LOCKING
1ac50 5f 53 54 59 4c 45 5f 50 52 4f 58 59 3d 3d 37 29  _STYLE_PROXY==7)
1ac60 3b 0a 20 20 20 20 0a 20 20 73 77 69 74 63 68 28  ;.    .  switch(
1ac70 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29   eLockingStyle )
1ac80 7b 0a 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b  {..    case LOCK
1ac90 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 3a  ING_STYLE_POSIX:
1aca0 20 7b 0a 20 20 20 20 20 20 65 6e 74 65 72 4d 75   {.      enterMu
1acb0 74 65 78 28 29 3b 0a 23 69 66 20 49 53 5f 56 58  tex();.#if IS_VX
1acc0 57 4f 52 4b 53 0a 20 20 20 20 20 20 72 63 20 3d  WORKS.      rc =
1acd0 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1ace0 65 77 2c 20 70 4e 65 77 2d 3e 7a 52 65 61 6c 70  ew, pNew->zRealp
1acf0 61 74 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63  ath, &pNew->pLoc
1ad00 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  k, &pNew->pOpen)
1ad10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
1ad20 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
1ad30 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f  pNew, &pNew->pLo
1ad40 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e  ck, &pNew->pOpen
1ad50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1ad60 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
1ad70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ad80 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1ad90 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ada0 45 0a 0a 23 69 66 20 21 49 53 5f 56 58 57 4f 52  E..#if !IS_VXWOR
1adb0 4b 53 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b  KS.    case LOCK
1adc0 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 3a 20 7b  ING_STYLE_AFP: {
1add0 0a 20 20 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  .      /* AFP lo
1ade0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
1adf0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
1ae00 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
1ae10 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ded in.      ** 
1ae20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
1ae30 6e 74 65 78 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ntext..      */.
1ae40 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
1ae50 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
1ae60 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
1ae70 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
1ae80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1ae90 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
1aea0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
1aeb0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  tx==0 ){.       
1aec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1aed0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1aee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  .        /* NB: 
1aef0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
1af00 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
1af10 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
1af20 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
1af30 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
1af40 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
1af50 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
1af60 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
1af70 6b 65 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  ke a.        ** 
1af80 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
1af90 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  name. */.       
1afa0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
1afb0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
1afc0 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
1afd0 0a 20 20 20 20 20 20 20 20 65 6e 74 65 72 4d 75  .        enterMu
1afe0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72  tex();.        r
1aff0 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
1b000 28 70 4e 65 77 2c 20 4e 55 4c 4c 2c 20 26 70 4e  (pNew, NULL, &pN
1b010 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ew->pOpen);.    
1b020 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
1b030 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  ;        .      
1b040 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1b050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1b060 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
1b070 59 4c 45 5f 44 4f 54 46 49 4c 45 3a 20 7b 0a 20  YLE_DOTFILE: {. 
1b080 20 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20       /* Dotfile 
1b090 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
1b0a0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
1b0b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
1b0c0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  luded in.      *
1b0d0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
1b0e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
1b0f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
1b100 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
1b110 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
1b120 3b 0a 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d  ;.      nFilenam
1b130 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
1b140 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 20  name) + 6;.     
1b150 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
1b160 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
1b170 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
1b180 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46        if( zLockF
1b190 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
1b1a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1b1b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
1b1c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b1d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
1b1e0 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
1b1f0 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
1b200 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
1b210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b220 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
1b230 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
1b240 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b250 20 20 20 7d 0a 0a 23 69 66 20 49 53 5f 56 58 57     }..#if IS_VXW
1b260 4f 52 4b 53 0a 20 20 20 20 63 61 73 65 20 4c 4f  ORKS.    case LO
1b270 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45  CKING_STYLE_NAME
1b280 44 53 45 4d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  DSEM: {.      /*
1b290 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
1b2a0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1b2b0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1b2c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
1b2d0 20 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64       ** included
1b2e0 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 73 65 6d   in the namedsem
1b2f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
1b300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
1b310 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
1b320 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
1b330 49 6e 66 6f 28 68 2c 20 70 4e 65 77 2d 3e 7a 52  Info(h, pNew->zR
1b340 65 61 6c 70 61 74 68 2c 20 26 70 4e 65 77 2d 3e  ealpath, &pNew->
1b350 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f  pLock, &pNew->pO
1b360 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
1b370 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
1b380 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d  && (pNew->pOpen-
1b390 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
1b3a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
1b3b0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
1b3c0 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  Open->aSemName;.
1b3d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
1b3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
1b3f0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1b400 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
1b410 22 25 73 2e 73 65 6d 22 2c 20 70 4e 65 77 2d 3e  "%s.sem", pNew->
1b420 7a 52 65 61 6c 70 61 74 68 29 3b 0a 20 20 20 20  zRealpath);.    
1b430 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b 20 7a 53      for( n=0; zS
1b440 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
1b450 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1b460 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
1b470 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
1b480 27 5f 27 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  '_';.        pNe
1b490 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d  w->pOpen->pSem =
1b4a0 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
1b4b0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
1b4c0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  6, 1);.        i
1b4d0 66 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e  f( pNew->pOpen->
1b4e0 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
1b4f0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
1b500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b510 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  M;.          pNe
1b520 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61  w->pOpen->aSemNa
1b530 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
1b540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b550 20 20 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78        leaveMutex
1b560 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1b570 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1b580 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f     case LOCKING_
1b590 53 54 59 4c 45 5f 46 4c 4f 43 4b 3a 20 0a 20 20  STYLE_FLOCK: .  
1b5a0 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53    case LOCKING_S
1b5b0 54 59 4c 45 5f 4e 4f 4e 45 3a 20 0a 20 20 20 20  TYLE_NONE: .    
1b5c0 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
1b5d0 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c    }.  .  pNew->l
1b5e0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
1b5f0 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f IS_VXWORKS.  i
1b600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b610 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
1b620 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
1b630 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
1b640 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74  .  pNew->isDelet
1b650 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65  e = isDelete;.#e
1b660 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
1b670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b680 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
1b690 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20  lose(dirfd); /* 
1b6a0 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66  silent leak if f
1b6b0 61 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20  ail, already in 
1b6c0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c 6f  error */.    clo
1b6d0 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  se(h);.  }else{.
1b6e0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
1b6f0 64 20 3d 20 26 61 49 6f 4d 65 74 68 6f 64 5b 65  d = &aIoMethod[e
1b700 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2d 31 5d 3b  LockingStyle-1];
1b710 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
1b720 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
1b730 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
1b740 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1b750 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
1b760 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b770 6f 64 73 20 2a 69 6f 4d 65 74 68 6f 64 46 6f 72  ods *ioMethodFor
1b780 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 69 6e 74  LockingStyle(int
1b790 20 73 74 79 6c 65 29 7b 0a 20 20 72 65 74 75 72   style){.  retur
1b7a0 6e 20 26 61 49 6f 4d 65 74 68 6f 64 5b 73 74 79  n &aIoMethod[sty
1b7b0 6c 65 2d 31 5d 3b 0a 7d 0a 0a 73 74 61 74 69 63  le-1];.}..static
1b7c0 20 69 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f   int getDbPathFo
1b7d0 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  rUnixFile(unixFi
1b7e0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20  le *pFile, char 
1b7f0 2a 64 62 50 61 74 68 29 7b 0a 20 20 69 66 28 20  *dbPath){.  if( 
1b800 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3d 3d  pFile->pMethod==
1b810 69 6f 4d 65 74 68 6f 64 46 6f 72 4c 6f 63 6b 69  ioMethodForLocki
1b820 6e 67 53 74 79 6c 65 28 4c 4f 43 4b 49 4e 47 5f  ngStyle(LOCKING_
1b830 53 54 59 4c 45 5f 41 46 50 29 20 29 7b 0a 20 20  STYLE_AFP) ){.  
1b840 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
1b850 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
1b860 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
1b870 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
1b880 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 74 72  field of the str
1b890 75 63 74 20 2a 2f 0a 20 20 20 20 73 74 72 6c 63  uct */.    strlc
1b8a0 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
1b8b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
1b8c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
1b8d0 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
1b8e0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
1b8f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b900 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  OK;.  }.  if( pF
1b910 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3d 3d 69 6f  ile->pMethod==io
1b920 4d 65 74 68 6f 64 46 6f 72 4c 6f 63 6b 69 6e 67  MethodForLocking
1b930 53 74 79 6c 65 28 4c 4f 43 4b 49 4e 47 5f 53 54  Style(LOCKING_ST
1b940 59 4c 45 5f 44 4f 54 46 49 4c 45 29 20 29 7b 0a  YLE_DOTFILE) ){.
1b950 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20      /* dot lock 
1b960 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c  style uses the l
1b970 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
1b980 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20  o store the dot 
1b990 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 2a  lock file path *
1b9a0 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  /.    int len = 
1b9b0 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
1b9c0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1b9d0 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44  text) - strlen(D
1b9e0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a  OTLOCK_SUFFIX);.
1b9f0 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
1ba00 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
1ba10 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
1ba20 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 20  t, len + 1);.   
1ba30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ba40 4b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 6c 6c 20  K;.  }.  /* all 
1ba50 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65  other styles use
1ba60 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
1ba70 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
1ba80 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a  e db file path *
1ba90 2f 0a 20 20 73 74 72 6c 63 70 79 28 64 62 50 61  /.  strlcpy(dbPa
1baa0 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
1bab0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
1bac0 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  t, MAXPATHLEN);.
1bad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bae0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1baf0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1bb00 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1bb10 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1bb20 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1bb30 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1bb40 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1bb50 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1bb60 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1bb70 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1bb80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1bb90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1bba0 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1bbb0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1bbc0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1bbd0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1bbe0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1bbf0 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1bc00 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  lue..**.** If SQ
1bc10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1bc20 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1bc30 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1bc40 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1bc50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1bc60 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1bc70 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1bc80 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1bc90 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1bca0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1bcb0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1bcc0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1bcd0 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1bce0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1bcf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1bd00 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1bd10 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1bd20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1bd30 72 28 69 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72  r(ii=strlen(zDir
1bd40 6e 61 6d 65 29 3b 20 69 69 3e 3d 30 20 26 26 20  name); ii>=0 && 
1bd50 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1bd60 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1bd70 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1bd80 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1bd90 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
1bda0 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1bdb0 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1bdc0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1bdd0 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
1bde0 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
1bdf0 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
1be00 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
1be10 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
1be20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1be30 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
1be40 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1be50 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  zDirname);.    }
1be60 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1be70 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1be80 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
1be90 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a  TE_CANTOPEN);.}.
1bea0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1beb0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
1bec0 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
1bed0 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  uf must be alloc
1bee0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
1bef0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61  alling process a
1bf00 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  nd must be big e
1bf10 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74  nough to hold at
1bf20 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e   least.** pVfs->
1bf30 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
1bf40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bf50 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  getTempname(int 
1bf60 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1bf70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1bf80 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
1bf90 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
1bfa0 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
1bfb0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
1bfc0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
1bfd0 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
1bfe0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
1bff0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c000 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
1c010 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
1c020 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
1c030 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
1c040 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
1c050 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
1c060 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
1c070 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1c080 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
1c090 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74   = ".";..  /* It
1c0a0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
1c0b0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
1c0c0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
1c0d0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
1c0e0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
1c0f0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
1c100 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
1c110 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
1c120 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1c130 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
1c140 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
1c150 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1c160 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61  TE_IOERR );..  a
1c170 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
1c180 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1c190 79 3b 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d  y;.  if (NULL ==
1c1a0 20 61 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20   azDirs[1]) {.  
1c1b0 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65    azDirs[1] = ge
1c1c0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
1c1d0 20 20 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30    }.  .  for(i=0
1c1e0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
1c1f0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
1c200 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
1c210 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30  if( azDirs[i]==0
1c220 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c230 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73   if( stat(azDirs
1c240 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  [i], &buf) ) con
1c250 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
1c260 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
1c270 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
1c280 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
1c290 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29  azDirs[i], 07) )
1c2a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
1c2b0 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
1c2c0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
1c2d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c2e0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1c2f0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
1c300 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
1c310 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
1c320 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
1c330 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
1c340 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
1c350 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
1c360 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
1c370 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
1c380 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69  IX) + 17) >= (si
1c390 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
1c3a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c3b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
1c3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1c3d0 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a  rintf(nBuf-17, z
1c3e0 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
1c3f0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
1c400 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
1c410 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
1c420 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1c430 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
1c440 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
1c450 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
1c460 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
1c470 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
1c480 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
1c490 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
1c4a0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
1c4b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
1c4c0 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
1c4d0 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29  ( access(zBuf,0)
1c4e0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
1c4f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1c500 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
1c510 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
1c520 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
1c530 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
1c540 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
1c550 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
1c560 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
1c570 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
1c580 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
1c590 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
1c5a0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
1c5b0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
1c5c0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
1c5d0 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
1c5e0 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
1c5f0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1c600 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
1c610 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
1c620 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
1c630 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
1c640 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
1c650 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
1c660 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
1c670 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
1c680 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
1c690 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
1c6a0 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
1c6b0 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
1c6c0 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
1c6d0 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
1c6e0 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
1c6f0 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
1c700 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
1c710 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
1c720 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
1c730 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
1c740 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
1c750 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
1c760 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
1c770 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
1c780 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
1c790 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
1c7a0 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
1c7b0 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
1c7c0 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
1c7d0 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
1c7e0 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
1c7f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c800 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
1c810 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 73  har *zPath, .  s
1c820 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1c830 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  le,.  int flags,
1c840 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
1c850 73 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  s.){.  int fd = 
1c860 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c870 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1c880 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
1c890 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
1c8a0 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
1c8d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1c8e0 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20 30    int oflags = 0
1c8f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c900 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
1c910 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
1c920 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
1c930 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
1c940 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
1c950 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1c960 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
1c970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c980 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
1c990 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
1c9a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1c9b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69  ITE_OK;..  int i
1c9c0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
1c9d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1c9e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
1c9f0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
1ca00 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1ca10 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1ca20 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
1ca30 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
1ca40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1ca50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
1ca60 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
1ca70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1ca80 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
1ca90 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
1caa0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
1cab0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1cac0 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  RITE);..  /* If 
1cad0 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
1cae0 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
1caf0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
1cb00 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
1cb10 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
1cb20 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
1cb30 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
1cb40 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
1cb50 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
1cb60 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
1cb70 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
1cb80 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
1cb90 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
1cba0 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  )d..  */.  int i
1cbb0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d  sOpenDirectory =
1cbc0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 0a 20   (isCreate && . 
1cbd0 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c       (eType==SQL
1cbe0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1cbf0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
1cc00 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1cc10 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b  IN_JOURNAL).  );
1cc20 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
1cc30 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
1cc40 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
1cc50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
1cc60 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
1cc70 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
1cc80 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
1cc90 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
1cca0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
1ccb0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
1ccc0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1ccd0 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+1];.  const ch
1cce0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
1ccf0 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
1cd00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1cd10 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
1cd20 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
1cd30 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
1cd40 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
1cd50 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
1cd60 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
1cd70 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
1cd80 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
1cd90 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
1cda0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1cdb0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
1cdc0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
1cdd0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
1cde0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1cdf0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
1ce00 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
1ce10 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1ce20 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1ce30 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
1ce40 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
1ce50 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1ce60 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
1ce70 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
1ce80 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
1ce90 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
1cea0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
1ceb0 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
1cec0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
1ced0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
1cee0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
1cef0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
1cf00 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
1cf10 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74  ournal, and mast
1cf20 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
1cf30 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63 61 6c  ever automatical
1cf40 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 0a  ly.  ** deleted.
1cf50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65    */.  assert( e
1cf60 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1cf70 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c 20 21 69 73  N_MAIN_DB || !is
1cf80 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65  Delete );.  asse
1cf90 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
1cfa0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1cfb0 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  NAL || !isDelete
1cfc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
1cfd0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1cfe0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1cff0 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
1d000 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1d010 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
1d020 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
1d030 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
1d040 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
1d050 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
1d060 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1d070 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1d080 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1d090 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
1d0a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d0b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
1d0c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1d0d0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1d0e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
1d0f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
1d100 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
1d110 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1d120 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1d130 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
1d140 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
1d150 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b  RANSIENT_DB.  );
1d160 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ..  memset(pFile
1d170 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
1d180 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 21  File));..  if( !
1d190 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  zName ){.    ass
1d1a0 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
1d1b0 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  !isOpenDirectory
1d1c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54  );.    rc = getT
1d1d0 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
1d1e0 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
1d1f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d220 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
1d230 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
1d240 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
1d250 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44    oflags |= O_RD
1d260 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
1d270 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61 67 73  adWrite ) oflags
1d280 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
1d290 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
1d2a0 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  oflags |= O_CREA
1d2b0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
1d2c0 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d  sive ) oflags |=
1d2d0 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
1d2e0 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c  LOW);.  oflags |
1d2f0 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
1d300 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66 64 20  _BINARY);..  fd 
1d310 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 66  = open(zName, of
1d320 6c 61 67 73 2c 20 69 73 44 65 6c 65 74 65 3f 30  lags, isDelete?0
1d330 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55  600:SQLITE_DEFAU
1d340 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1d350 4f 4e 53 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ONS);.  OSTRACE4
1d360 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
1d370 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
1d380 61 6d 65 2c 20 6f 66 6c 61 67 73 29 3b 0a 20 20  ame, oflags);.  
1d390 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
1d3a0 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
1d3b0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
1d3c0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
1d3d0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
1d3e0 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
1d3f0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1d400 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
1d410 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   */.    flags &=
1d420 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
1d430 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
1d440 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
1d450 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
1d460 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
1d470 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1d480 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68  Open(pVfs, zPath
1d490 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  , pFile, flags, 
1d4a0 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pOutFlags);.  }.
1d4b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
1d4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4d0 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
1d4e0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
1d4f0 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20  #if IS_VXWORKS. 
1d500 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
1d510 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69  ;.#else.    unli
1d520 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
1d530 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  f.  }else{.    (
1d540 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
1d550 65 29 2d 3e 6f 66 6c 61 67 73 20 3d 20 6f 66 6c  e)->oflags = ofl
1d560 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ags;.  }.  if( p
1d570 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
1d580 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
1d590 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  gs;.  }..  asser
1d5a0 74 28 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20  t(fd!=0);.  if( 
1d5b0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
1d5c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1d5d0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
1d5e0 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
1d5f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d600 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  ){.      close(f
1d610 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
1d620 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
1d630 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
1d640 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1d650 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  c;.    }.  }..#i
1d660 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
1d670 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
1d680 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
1d690 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
1d6a0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
1d6b0 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ..  noLock = eTy
1d6c0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1d6d0 4d 41 49 4e 5f 44 42 3b 0a 0a 23 69 66 20 53 51  MAIN_DB;..#if SQ
1d6e0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
1d6f0 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 66 28 20  Y_LOCKING.  if( 
1d700 7a 50 61 74 68 21 3d 4e 55 4c 4c 20 26 26 20 21  zPath!=NULL && !
1d710 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68  noLock ){.    ch
1d720 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
1d730 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
1d740 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
1d750 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
1d760 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
1d770 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
1d780 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
1d790 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
1d7a0 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 0a  ays use proxy, .
1d7b0 20 20 20 20 20 2a 2a 20 30 20 6d 65 61 6e 73 20       ** 0 means 
1d7c0 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
1d7d0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
1d7e0 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
1d7f0 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 0a 20  cal files only. 
1d800 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
1d810 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
1d820 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
1d830 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
1d840 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
1d850 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
1d860 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 20 20  fs fsInfo;..    
1d870 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61    if( statfs(zPa
1d880 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  th, &fsInfo) == 
1d890 2d 31 20 29 7b 0a 09 09 09 09 28 28 75 6e 69 78  -1 ){.....((unix
1d8a0 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61  File*)pFile)->la
1d8b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1d8c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69 72  .        if( dir
1d8d0 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
1d8e0 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  rfd); /* silentl
1d8f0 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
1d900 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
1d910 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
1d920 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
1d930 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
1d940 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
1d950 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d960 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
1d970 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
1d980 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
1d990 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
1d9a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
1d9b0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
1d9c0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
1d9d0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
1d9e0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
1d9f0 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65  , noLock, isDele
1da00 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
1da10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1da20 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72 61          rc = tra
1da30 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 46 6f  nsformUnixFileFo
1da40 72 4c 6f 63 6b 50 72 6f 78 79 28 28 75 6e 69 78  rLockProxy((unix
1da50 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
1da60 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 7d 0a  uto:");.      }.
1da70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1da80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1da90 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 66 69  f.  .  return fi
1daa0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
1dab0 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46  s, fd, dirfd, pF
1dac0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
1dad0 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 7d  ck, isDelete);.}
1dae0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1daf0 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
1db00 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
1db10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
1db20 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
1db30 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
1db40 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
1db50 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1db60 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71  nt unixDelete(sq
1db70 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
1db80 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
1db90 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
1dba0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1dbb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
1dbc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1dbd0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
1dbe0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
1dbf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
1dc00 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
1dc10 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
1dc20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
1dc30 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
1dc40 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
1dc50 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
1dc60 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
1dc70 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
1dc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dc90 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a  .#if IS_VXWORKS.
1dca0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
1dcb0 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
1dcc0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
1dcd0 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
1dce0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
1dcf0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
1dd00 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
1dd10 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
1dd20 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
1dd30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dd40 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
1dd50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1dd60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1dd70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dd80 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
1dd90 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
1dda0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
1ddb0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
1ddc0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
1ddd0 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
1dde0 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
1ddf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1de00 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1de10 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
1de20 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
1de30 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
1de40 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
1de50 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
1de60 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
1de70 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
1de80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
1de90 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
1dea0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
1deb0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
1dec0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
1ded0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1dee0 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
1def0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
1df00 55 73 65 64 2c 20 0a 20 20 63 6f 6e 73 74 20 63  Used, .  const c
1df10 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
1df20 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74  nt flags, .  int
1df30 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 69   *pResOut.){.  i
1df40 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
1df50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1df60 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
1df70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1df80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1df90 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
1dfa0 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
1dfb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dfc0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
1dfd0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
1dfe0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
1dff0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e000 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
1e010 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
1e020 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
1e030 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1e040 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
1e050 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
1e060 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
1e070 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
1e080 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
1e090 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
1e0a0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
1e0b0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
1e0c0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
1e0d0 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
1e0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e0f0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
1e100 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
1e110 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
1e120 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
1e130 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
1e140 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
1e150 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
1e160 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
1e170 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
1e180 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
1e190 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
1e1a0 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
1e1b0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
1e1c0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
1e1d0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
1e1e0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
1e1f0 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
1e200 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
1e210 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
1e220 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1e230 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1e240 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
1e250 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1e260 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
1e270 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1e280 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
1e290 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1e2a0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
1e2b0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
1e2c0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
1e2d0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
1e300 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
1e310 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
1e320 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
1e330 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
1e340 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
1e350 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
1e360 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
1e370 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
1e380 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
1e390 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
1e3a0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
1e3b0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
1e3c0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
1e3d0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
1e3e0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
1e3f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1e400 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
1e410 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
1e420 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
1e430 6b 69 6e 67 20 64 69 72 65 63 74 6c 79 20 68 61  king directly ha
1e440 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
1e450 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1e460 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1e470 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1e480 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
1e490 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
1e4a0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
1e4b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1e4c0 70 56 66 73 29 3b 0a 0a 23 69 66 20 49 53 5f 56  pVfs);..#if IS_V
1e4d0 58 57 4f 52 4b 53 0a 20 20 7b 0a 20 20 20 20 63  XWORKS.  {.    c
1e4e0 68 61 72 20 2a 7a 52 65 61 6c 6e 61 6d 65 20 3d  har *zRealname =
1e4f0 20 76 78 72 65 61 6c 70 61 74 68 28 7a 50 61 74   vxrealpath(zPat
1e500 68 2c 20 30 29 3b 0a 20 20 20 20 7a 4f 75 74 5b  h, 0);.    zOut[
1e510 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69  0] = '\0';.    i
1e520 66 28 20 21 7a 52 65 61 6c 6e 61 6d 65 20 29 7b  f( !zRealname ){
1e530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e540 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
1e550 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e560 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
1e570 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 52 65 61  zOut, "%s", zRea
1e580 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  lname);.    sqli
1e590 74 65 33 5f 66 72 65 65 28 7a 52 65 61 6c 6e 61  te3_free(zRealna
1e5a0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
1e5b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23  SQLITE_OK;.  }.#
1e5c0 65 6c 73 65 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  else.  zOut[nOut
1e5d0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
1e5e0 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
1e5f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1e600 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
1e610 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
1e620 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e630 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
1e640 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
1e650 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
1e660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e670 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
1e680 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65      nCwd = strle
1e690 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
1e6a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
1e6b0 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
1e6c0 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
1e6d0 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
1e6e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  n SQLITE_OK;..#i
1e6f0 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  f 0.  /*.  ** Re
1e700 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74 68 20  move "/./" path 
1e710 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e  elements and con
1e720 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74  vert "/A/./" pat
1e730 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  h elements.  ** 
1e740 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a  to just "/"..  *
1e750 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b  /.  if( zFull ){
1e760 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
1e770 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46     for(i=j=0; zF
1e780 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ull[i]; i++){.  
1e790 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d      if( zFull[i]
1e7a0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
1e7b0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
1e7c0 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
1e7d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75  .        if( zFu
1e7e0 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20  ll[i+1]=='.' && 
1e7f0 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20  zFull[i+2]=='/' 
1e800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  ){.          i +
1e810 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 1;.          c
1e820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e830 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
1e840 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  Full[i+1]=='.' &
1e850 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e  & zFull[i+2]=='.
1e860 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d  ' && zFull[i+3]=
1e870 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
1e880 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
1e890 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20  zFull[j-1]!='/' 
1e8a0 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
1e8b0 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20      i += 3;.    
1e8c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8e0 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b  }.      zFull[j+
1e8f0 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20  +] = zFull[i];. 
1e900 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a     }.    zFull[j
1e910 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  ] = 0;.  }.#endi
1e920 66 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 20  f.#endif /* #if 
1e930 49 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 7d 0a  IS_VXWORKS */.}.
1e940 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e950 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1e960 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
1e970 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
1e980 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
1e990 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
1e9a0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
1e9b0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
1e9c0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
1e9d0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
1e9e0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
1e9f0 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
1ea00 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
1ea10 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1ea20 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
1ea30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1ea40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1ea50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1ea60 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
1ea70 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
1ea80 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
1ea90 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
1eaa0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
1eab0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
1eac0 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
1ead0 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
1eae0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
1eaf0 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
1eb00 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
1eb10 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
1eb20 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
1eb30 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
1eb40 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
1eb50 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
1eb60 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
1eb70 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
1eb80 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
1eb90 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
1eba0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
1ebb0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
1ebc0 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
1ebd0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
1ebe0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
1ebf0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
1ec00 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1ec10 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  Out){.  char *zE
1ec20 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
1ec30 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1ec40 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
1ec50 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
1ec60 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
1ec70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1ec80 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
1ec90 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
1eca0 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d  r);.  }.  leaveM
1ecb0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
1ecc0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d   void *unixDlSym
1ecd0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
1ece0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
1ecf0 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
1ed00 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 55 4e 55  *zSymbol){.  UNU
1ed10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1ed20 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1ed30 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20   dlsym(pHandle, 
1ed40 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74  zSymbol);.}.stat
1ed50 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
1ed60 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
1ed70 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
1ed80 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
1ed90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1eda0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
1edb0 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
1edc0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
1edd0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1ede0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
1edf0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
1ee00 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
1ee10 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
1ee20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
1ee30 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
1ee40 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
1ee50 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1ee60 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
1ee70 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
1ee80 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1ee90 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
1eea0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1eeb0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
1eec0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1eed0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1eee0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
1eef0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1ef00 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
1ef10 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
1ef20 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
1ef30 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
1ef40 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
1ef50 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
1ef60 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
1ef70 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
1ef80 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
1ef90 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
1efa0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
1efb0 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
1efc0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
1efd0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
1efe0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
1eff0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
1f000 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
1f010 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
1f020 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
1f030 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
1f040 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
1f050 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
1f060 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
1f070 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
1f080 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
1f090 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
1f0a0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
1f0b0 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
1f0c0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
1f0d0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
1f0e0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
1f0f0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
1f100 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
1f110 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
1f120 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
1f130 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
1f140 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
1f150 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
1f160 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
1f170 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
1f180 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
1f190 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
1f1a0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
1f1b0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
1f1c0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
1f1d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1f1e0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
1f1f0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f  , fd;.    fd = o
1f200 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
1f210 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  m", O_RDONLY);. 
1f220 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
1f230 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
1f240 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
1f250 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1f260 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
1f270 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
1f280 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
1f290 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
1f2a0 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
1f2b0 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
1f2c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1f2d0 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
1f2e0 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
1f2f0 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
1f300 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
1f310 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
1f320 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72 65  .      nBuf = re
1f330 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
1f340 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  f);.      close(
1f350 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  fd);.    }.  }.#
1f360 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
1f370 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
1f380 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1f390 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1f3a0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1f3b0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
1f3c0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1f3d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
1f3e0 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
1f3f0 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
1f400 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f410 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f420 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
1f430 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
1f440 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
1f450 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f460 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1f470 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
1f480 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
1f490 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1f4a0 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
1f4b0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
1f4c0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
1f4d0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
1f4e0 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
1f4f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
1f500 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
1f510 63 6f 6e 64 73 29 7b 0a 23 69 66 20 49 53 5f 56  conds){.#if IS_V
1f520 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1f530 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
1f540 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
1f550 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
1f560 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
1f570 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
1f580 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
1f590 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
1f5a0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 72 65  &sp, NULL);.  re
1f5b0 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
1f5c0 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
1f5d0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
1f5e0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
1f5f0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
1f600 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ds);.  return mi
1f610 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
1f620 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
1f630 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
1f640 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
1f650 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
1f660 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
1f670 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
1f680 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
1f690 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1f6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1f6b0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1f6c0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
1f6d0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
1f6e0 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
1f6f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
1f700 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
1f710 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
1f720 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1f730 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
1f740 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
1f750 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1f760 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
1f770 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1f780 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
1f790 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
1f7a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
1f7b0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
1f7c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
1f7d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
1f7e0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
1f7f0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
1f800 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
1f810 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
1f820 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
1f830 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1f840 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
1f850 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
1f860 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
1f870 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20 49 53   *prNow){.#if IS
1f880 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f890 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
1f8a0 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
1f8b0 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
1f8c0 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f   &sNow);.  *prNo
1f8d0 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
1f8e0 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
1f8f0 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  0.0 + sNow.tv_ns
1f900 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 30 30  ec/8640000000000
1f910 30 2e 30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  0.0;.#elif defin
1f920 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
1f930 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
1f940 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
1f950 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
1f960 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20  0587.5;.#else.  
1f970 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
1f980 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
1f990 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
1f9a0 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
1f9b0 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
1f9c0 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
1f9d0 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30  .tv_usec/8640000
1f9e0 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a  0000.0;.#endif..
1f9f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1fa00 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
1fa10 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
1fa20 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
1fa30 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1fa40 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
1fa50 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
1fa60 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
1fa70 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1fa80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
1fa90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
1faa0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
1fab0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
1fac0 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63   int NotUsed2, c
1fad0 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a  har *NotUsed3){.
1fae0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1faf0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55  ER(NotUsed);.  U
1fb00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1fb10 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55  NotUsed2);.  UNU
1fb20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1fb30 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72  tUsed3);.  retur
1fb40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
1fb50 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
1fb60 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
1fb70 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
1fb80 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
1fb90 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 4d 61 63  void){ .  /* Mac
1fba0 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  ro to define the
1fbb0 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73   static contents
1fbc0 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   of an sqlite3_v
1fbd0 66 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  fs structure for
1fbe0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69 78 20 62  .  ** the unix b
1fbf0 61 63 6b 65 6e 64 2e 20 54 68 65 20 74 77 6f 20  ackend. The two 
1fc00 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
1fc10 68 65 20 76 61 6c 75 65 73 20 74 6f 20 75 73 65  he values to use
1fc20 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 73 71   for.  ** the sq
1fc30 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61 6d 65 20  lite3_vfs.zName 
1fc40 61 6e 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  and sqlite3_vfs.
1fc50 70 41 70 70 44 61 74 61 20 66 69 65 6c 64 73 2c  pAppData fields,
1fc60 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
1fc70 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23 64 65 66   ** .  */.  #def
1fc80 69 6e 65 20 55 4e 49 58 56 46 53 28 7a 56 66 73  ine UNIXVFS(zVfs
1fc90 4e 61 6d 65 2c 20 70 56 66 73 41 70 70 44 61 74  Name, pVfsAppDat
1fca0 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
1fcb0 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20        \.    1,  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
1fd00 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
1fd10 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
1fd40 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
1fd50 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1fd90 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fdb0 20 20 20 20 7a 56 66 73 4e 61 6d 65 2c 20 20 20      zVfsName,   
1fdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
1fdd0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fdf0 20 20 28 76 6f 69 64 20 2a 29 70 56 66 73 41 70    (void *)pVfsAp
1fe00 70 44 61 74 61 2c 20 20 2f 2a 20 70 41 70 70 44  pData,  /* pAppD
1fe10 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
1fe20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1fe30 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
1fe40 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
1fe50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1fe60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
1fe70 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
1fe80 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
1fe90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1fea0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
1feb0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
1fec0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
1fef0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
1ff00 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
1ff10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1ff20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
1ff30 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
1ff40 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
1ff70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
1ff80 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ffa0 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
1ffb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1ffc0 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ffe0 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
1fff0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
20000 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
20010 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
20020 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
20030 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
20040 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
20050 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
20060 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
20070 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
200a0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
200b0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
200c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
200d0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
200e0 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20 20  tLastError      
200f0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
20100 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
20110 20 20 5c 0a 20 20 7d 0a 0a 20 20 73 74 61 74 69    \.  }..  stati
20120 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 75 6e  c sqlite3_vfs un
20130 69 78 56 66 73 20 3d 20 55 4e 49 58 56 46 53 28  ixVfs = UNIXVFS(
20140 22 75 6e 69 78 22 2c 20 30 29 3b 0a 23 69 66 20  "unix", 0);.#if 
20150 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
20160 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
20170 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 73 71  t i;.  static sq
20180 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d  lite3_vfs aVfs[]
20190 20 3d 20 7b 0a 20 20 20 20 55 4e 49 58 56 46 53   = {.    UNIXVFS
201a0 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20  ("unix-posix",  
201b0 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50   LOCKING_STYLE_P
201c0 4f 53 49 58 29 2c 20 0a 20 20 20 20 55 4e 49 58  OSIX), .    UNIX
201d0 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20  VFS("unix-afp", 
201e0 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c      LOCKING_STYL
201f0 45 5f 41 46 50 29 2c 20 0a 20 20 20 20 55 4e 49  E_AFP), .    UNI
20200 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
20210 22 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  ",   LOCKING_STY
20220 4c 45 5f 46 4c 4f 43 4b 29 2c 20 0a 20 20 20 20  LE_FLOCK), .    
20230 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f  UNIXVFS("unix-do
20240 74 66 69 6c 65 22 2c 20 4c 4f 43 4b 49 4e 47 5f  tfile", LOCKING_
20250 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 29 2c 20  STYLE_DOTFILE), 
20260 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
20270 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 4c 4f 43  ix-none",    LOC
20280 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 29  KING_STYLE_NONE)
20290 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
202a0 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 4c 4f  nix-namedsem",LO
202b0 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45  CKING_STYLE_NAME
202c0 44 53 45 4d 29 2c 0a 20 20 20 20 55 4e 49 58 56  DSEM),.    UNIXV
202d0 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
202e0 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
202f0 5f 50 52 4f 58 59 29 0a 20 20 7d 3b 0a 20 20 66  _PROXY).  };.  f
20300 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f  or(i=0; i<(sizeo
20310 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73  f(aVfs)/sizeof(s
20320 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b  qlite3_vfs)); i+
20330 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
20340 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 61 56  vfs_register(&aV
20350 66 73 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 23  fs[i], 0);.  }.#
20360 65 6e 64 69 66 0a 23 69 66 20 49 53 5f 56 58 57  endif.#if IS_VXW
20370 4f 52 4b 53 0a 20 20 73 71 6c 69 74 65 33 48 61  ORKS.  sqlite3Ha
20380 73 68 49 6e 69 74 28 26 6e 61 6d 65 48 61 73 68  shInit(&nameHash
20390 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , 1);.#endif.  s
203a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
203b0 74 65 72 28 26 75 6e 69 78 56 66 73 2c 20 31 29  ter(&unixVfs, 1)
203c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
203d0 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
203e0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65  Shutdown the ope
203f0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
20400 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 69 73  terface. This is
20410 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
20420 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
20430 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
20440 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20450 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
20460 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
20470 49 58 20 2a 2f 0a                                IX */.