/ Hex Artifact Content
Login

Artifact af390f03ebe339e63911aec2d4ccd1e53fde581e:


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: 30 39 20 32 30 30 38 2f 31 31 2f 31 31 20 31 38  09 2008/11/11 18
01e0: 3a 33 34 3a 33 35 20 64 61 6e 69 65 6c 6b 31 39  :34:35 danielk19
01f0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0200: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0210: 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  h".#if SQLITE_OS
0220: 5f 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20  _UNIX           
0230: 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20     /* This file 
0240: 69 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20  is used on unix 
0250: 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  only */../*.** I
0260: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0270: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
0280: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73 20   defined and is 
0290: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 73  non-zero, then s
02a0: 65 76 65 72 61 6c 0a 2a 2a 20 61 6c 74 65 72 6e  everal.** altern
02b0: 61 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  ative locking im
02c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 72  plementations ar
02d0: 65 20 70 72 6f 76 69 64 65 64 3a 0a 2a 2a 0a 2a  e provided:.**.*
02e0: 2a 20 20 20 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  *   * POSIX lock
02f0: 69 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74  ing (the default
0300: 29 2c 0a 2a 2a 20 20 20 2a 20 4e 6f 20 6c 6f 63  ),.**   * No loc
0310: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 44 6f 74  king,.**   * Dot
0320: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
0330: 2a 20 20 20 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  *   * flock() lo
0340: 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 41 46  cking,.**   * AF
0350: 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f  P locking (OSX o
0360: 6e 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  nly)..**.** SQLI
0370: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0380: 47 5f 53 54 59 4c 45 20 6f 6e 6c 79 20 77 6f 72  G_STYLE only wor
0390: 6b 73 20 6f 6e 20 61 20 4d 61 63 2e 20 49 74 20  ks on a Mac. It 
03a0: 69 73 20 74 75 72 6e 65 64 20 6f 6e 20 62 79 0a  is turned on by.
03b0: 2a 2a 20 64 65 66 61 75 6c 74 20 6f 6e 20 61 20  ** default on a 
03c0: 4d 61 63 20 61 6e 64 20 64 69 73 61 62 6c 65 64  Mac and disabled
03d0: 20 6f 6e 20 61 6c 6c 20 6f 74 68 65 72 20 70 6f   on all other po
03e0: 73 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  six platforms..*
03f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0410: 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69  KING_STYLE).#  i
0420: 66 20 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57  f defined(__DARW
0430: 49 4e 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  IN__).#    defin
0440: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0450: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0460: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0470: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0480: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0490: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
04a0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 23  f../*.** These #
04b0: 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20 65  defines should e
04c0: 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65 20  nable >2GB file 
04d0: 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69 78  support on Posix
04e0: 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72   if the.** under
04f0: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0500: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
0510: 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20 6c  it.  If the OS l
0520: 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66 69  acks.** large fi
0530: 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65 73  le support, thes
0540: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f  e should be no-o
0550: 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20  ps..**.** Large 
0560: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61 6e  file support can
0570: 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73 69   be disabled usi
0580: 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  ng the -DSQLITE_
0590: 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69 74  DISABLE_LFS swit
05a0: 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6d  ch.** on the com
05b0: 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69  piler command li
05c0: 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ne.  This is nec
05d0: 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61 72  essary if you ar
05e0: 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f  e compiling.** o
05f0: 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68 69  n a recent machi
0600: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 37  ne (ex: RedHat 7
0610: 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e 74  .2) but you want
0620: 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77 6f   your code to wo
0630: 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65  rk.** on an olde
0640: 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52  r machine (ex: R
0650: 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66 20  edHat 6.0).  If 
0660: 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 52  you compile on R
0670: 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69 74  edHat 7.2.** wit
0680: 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f 6e  hout this option
0690: 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65 2e  , LFS is enable.
06a0: 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20 6e    But LFS does n
06b0: 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ot exist in the 
06c0: 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65 64  kernel.** in Red
06d0: 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65 20  Hat 6.0, so the 
06e0: 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b 2e  code won't work.
06f0: 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61 78    Hence, for max
0700: 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20 70  imum binary.** p
0710: 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20 73  ortability you s
0720: 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e 0a  hould omit LFS..
0730: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0740: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
0750: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49  define _LARGE_FI
0760: 4c 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e  LE       1.# ifn
0770: 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  def _FILE_OFFSET
0780: 5f 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65  _BITS.#   define
0790: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
07a0: 54 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20  TS 64.# endif.# 
07b0: 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c  define _LARGEFIL
07c0: 45 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69  E_SOURCE 1.#endi
07d0: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
07e0: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
07f0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0800: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0810: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0820: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0830: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0840: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0850: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0860: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0870: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0880: 68 3e 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  h>..#if SQLITE_E
0890: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
08a0: 59 4c 45 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  YLE.#include <sy
08b0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
08c0: 75 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68  ude <sys/param.h
08d0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
08e0: 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 20  mount.h>.#endif 
08f0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0900: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0910: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  /../*.** If we a
0920: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0930: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0940: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0950: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0960: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0970: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
0980: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0990: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
09a0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
09b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
09c0: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
09d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
09e0: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
09f0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
0a00: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
0a10: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
0a20: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
0a30: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
0a40: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
0a50: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
0a60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0a70: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
0a80: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
0a90: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
0aa0: 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f 2a 0a 2a  HNAME 512.../*.*
0ab0: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
0ac0: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
0ad0: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
0ae0: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 66 6f  file specific fo
0af0: 72 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72  r the unix.** pr
0b00: 6f 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e  otability layer.
0b10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0b20: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
0b30: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
0b40: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
0b50: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
0b60: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
0b70: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
0b80: 74 20 65 6e 74 72 79 20 2a 2f 0a 23 69 66 64 65  t entry */.#ifde
0b90: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
0ba0: 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c  /* In test mode,
0bb0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
0bc0: 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ze of this struc
0bd0: 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68  ture a bit so th
0be0: 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c  at .  ** it is l
0bf0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
0c00: 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20  truct CrashFile 
0c10: 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36  defined in test6
0c20: 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  .c..  */.  char 
0c30: 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65  aPadding[32];.#e
0c40: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 6f 70  ndif.  struct op
0c50: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0c60: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0c70: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0c80: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0c90: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
0ca0: 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66  *pLock;   /* Inf
0cb0: 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e  o about locks on
0cc0: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23   this inode */.#
0cd0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
0ce0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
0cf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
0d00: 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 6f  ntext;     /* Lo
0d10: 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63  cking style spec
0d20: 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 23 65  ific state */.#e
0d30: 6e 64 69 66 0a 20 20 69 6e 74 20 68 3b 20 20 20  ndif.  int h;   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
0d60: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  criptor */.  uns
0d70: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
0d80: 79 70 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79  ype;   /* The ty
0d90: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
0da0: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
0db0: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0dd0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0de0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0df0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0e00: 45 41 44 53 41 46 45 0a 20 20 70 74 68 72 65 61  EADSAFE.  pthrea
0e10: 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20  d_t tid;        
0e20: 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61      /* The threa
0e30: 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68  d that "owns" th
0e40: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23  is unixFile */.#
0e50: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6c 61 73 74  endif.  int last
0e60: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
0e70: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
0e80: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
0e90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 7d  t I/O error */.}
0ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  ;../*.** Include
0eb0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0ec0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0ed0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0ee0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0ef0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
0f00: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
0f10: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
0f20: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
0f30: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
0f40: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
0f50: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
0f60: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
0f70: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
0f80: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
0f90: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
0fa0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
0fb0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
0fc0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
0fd0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
0fe0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
0ff0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
1000: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
1010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
1020: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
1030: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
1040: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
1050: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
1060: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
1070: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
1080: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
1090: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
10a0: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
10b0: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
10c0: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
10d0: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
10e0: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
10f0: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
1100: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
1110: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
1120: 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65  DJGPP__.# define
1130: 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a   fcntl(A,B,C) 0.
1140: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1150: 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f  e threadid macro
1160: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65   resolves to the
1170: 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f   thread-id or to
1180: 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a   0.  Used for.**
1190: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
11a0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
11b0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
11c0: 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68  DSAFE.#define th
11d0: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
11e0: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
11f0: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
1200: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
1210: 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75 6e   or check the un
1220: 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  ixFile.tid field
1230: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
1240: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e 69   set when an uni
1250: 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73  xFile.** is firs
1260: 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73  t opened.  All s
1270: 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f  ubsequent uses o
1280: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 76  f the unixFile v
1290: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a  erify that the.*
12a0: 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73  * same thread is
12b0: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
12c0: 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d  e unixFile.  Som
12d0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12e0: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
12f0: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
1300: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
1310: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
1320: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
1330: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
1340: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
1350: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
1360: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
1370: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
1380: 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f  nother.  This lo
1390: 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61  gic makes sure a
13a0: 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74   user does not t
13b0: 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a  ry to do that.**
13c0: 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a   by mistake..**.
13d0: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
13e0: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
13f0: 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65 20  unixFile can be 
1400: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
1410: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
1420: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
1430: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
1440: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
1450: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
1460: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
1470: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
1480: 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d  (which now the m
1490: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
14a0: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
14b0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
14c0: 20 20 42 75 74 20 74 68 65 20 75 6e 69 78 46 69    But the unixFi
14d0: 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e  le.pLock field n
14e0: 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65  eeds to be.** re
14f0: 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75 73 65  computed because
1500: 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65   its key include
1510: 73 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e  s the thread-id.
1520: 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72    See the .** tr
1530: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
1540: 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77  ) function below
1550: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1560: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23  information.*/.#
1570: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
1580: 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20 53 45  SAFE.# define SE
1590: 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20 20  T_THREADID(X)   
15a0: 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65  (X)->tid = pthre
15b0: 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69  ad_self().# defi
15c0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
15d0: 44 28 58 29 20 28 74 68 72 65 61 64 73 4f 76 65  D(X) (threadsOve
15e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
15f0: 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20  ocks==0 && \.   
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 21 70 74 68 72 65 61           !pthrea
1620: 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64  d_equal((X)->tid
1630: 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  , pthread_self()
1640: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
1650: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
1660: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
1670: 5f 54 48 52 45 41 44 49 44 28 58 29 20 30 0a 23  _THREADID(X) 0.#
1680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  endif../*.** Her
1690: 65 20 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e  e is the dirt on
16a0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
16b0: 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44  locks:  ANSI STD
16c0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
16d0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
16e0: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
16f0: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
1700: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
1710: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
1720: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
1730: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
1740: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
1750: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
1760: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1770: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
1780: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
1790: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
17a0: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
17b0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
17c0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
17d0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
17e0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
17f0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
1800: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
1810: 20 63 61 73 65 3a 0a 2a 2a 20 20 20 20 20 20 20   case:.**       
1820: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
1830: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
1840: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
1850: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
1860: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
1870: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
1880: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
1890: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
18a0: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
18b0: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
18c0: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
18d0: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
18e0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
18f0: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
1900: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
1910: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
1920: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
1930: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
1940: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
1950: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
1960: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
1970: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
1980: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
1990: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
19a0: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
19b0: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
19c0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
19d0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
19e0: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
19f0: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
1a00: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
1a10: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
1a20: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
1a30: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
1a40: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42  e names..**.** B
1a50: 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61  ummer.  If you a
1a60: 73 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62  sk me, this is b
1a70: 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72  roken.  Badly br
1a80: 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a  oken.  It means.
1a90: 2a 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ** that we canno
1aa0: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
1ab0: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
1ac0: 20 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f   file access amo
1ad0: 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20  ng.** competing 
1ae0: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
1af0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
1b00: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
1b10: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
1b20: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
1b30: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
1b40: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1b50: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
1b60: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
1b70: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
1b80: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
1b90: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
1ba0: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
1bb0: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
1bc0: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
1bd0: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
1be0: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
1bf0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
1c00: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
1c10: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
1c20: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
1c30: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
1c40: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
1c50: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
1c60: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
1c70: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1c80: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
1c90: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
1ca0: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
1cb0: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
1cc0: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
1cd0: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
1ce0: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
1cf0: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
1d00: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
1d10: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
1d20: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
1d30: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
1d40: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1d50: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
1d60: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
1d70: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
1d80: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   inode..**.** Th
1d90: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
1da0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1db0: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1dc0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1dd0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1de0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1e00: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1e10: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1e20: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1e30: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1e40: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1e50: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1e60: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1e70: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1e80: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1e90: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1ea0: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1eb0: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1ec0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1ed0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
1ee0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
1ef0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
1f00: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
1f10: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
1f20: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
1f30: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
1f40: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
1f50: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
1f60: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
1f70: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
1f80: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
1f90: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
1fa0: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
1fb0: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
1fc0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
1fd0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
1fe0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
1ff0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
2000: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
2010: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
2020: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
2030: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
2040: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
2050: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
2060: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
2070: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
2080: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
2090: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
20a0: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
20b0: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
20c0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
20d0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
20e0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
20f0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
2100: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
2110: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
2120: 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d  .**.** 2004-Jan-
2130: 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65  11:.** More rece
2140: 6e 74 20 64 69 73 63 6f 76 65 72 69 65 73 20 61  nt discoveries a
2150: 62 6f 75 74 20 50 4f 53 49 58 20 61 64 76 69 73  bout POSIX advis
2160: 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65  ory locks.  (The
2170: 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f   more.** I disco
2180: 76 65 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20  ver, the more I 
2190: 72 65 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f  realize the a PO
21a0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
21b0: 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f  ks are.** an abo
21c0: 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  mination.).**.**
21d0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
21e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21f0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
2200: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
2210: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
2220: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
2230: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
2240: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
2250: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
2260: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
2270: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
2280: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69  lem, each unixFi
2290: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  le structure con
22a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  tains.** a point
22b0: 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e 74  er to an openCnt
22c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
22d0: 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43 6e  re is one openCn
22e0: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  t structure.** p
22f0: 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77  er open inode, w
2300: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
2310: 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c  multiple unixFil
2320: 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  e can point to a
2330: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
2340: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
2350: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2360: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
2370: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
2380: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
2390: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
23a0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
23b0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
23c0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
23d0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
23e0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
23f0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
2400: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
2410: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65  lear..** The ope
2420: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b  nCnt structure k
2430: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
2440: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2450: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
2460: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
2470: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
2480: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
2490: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
24a0: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
24b0: 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65 72  .** First, under
24c0: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   Linux threads, 
24d0: 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68 72  because each thr
24e0: 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72 61  ead has a separa
24f0: 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44  te.** process ID
2500: 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  , lock operation
2510: 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20  s in one thread 
2520: 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  do not override 
2530: 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20  locks.** to the 
2540: 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74 68  same file in oth
2550: 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69 6e  er threads.  Lin
2560: 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61 76  ux threads behav
2570: 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61  e like.** separa
2580: 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20  te processes in 
2590: 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20 42  this respect.  B
25a0: 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73 65  ut, if you close
25b0: 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72   a file.** descr
25c0: 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74  iptor in linux t
25d0: 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b  hreads, all lock
25e0: 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20 65  s are cleared, e
25f0: 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20  ven locks.** on 
2600: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e  other threads an
2610: 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  d even though th
2620: 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  e other threads 
2630: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
2640: 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20 20  * process IDs.  
2650: 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  Linux threads is
2660: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e   inconsistent in
2670: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a 2a   this respect..*
2680: 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67  * (I'm beginning
2690: 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20 6c   to think that l
26a0: 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20  inux threads is 
26b0: 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74  an abomination t
26c0: 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73  oo.).** The cons
26d0: 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20  equence of this 
26e0: 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65 20  all is that the 
26f0: 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 74  hash table for t
2700: 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73  he lockInfo.** s
2710: 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f 20  tructure has to 
2720: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
2730: 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20 6f  ess id as part o
2740: 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75 73  f its key becaus
2750: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69  e.** locks in di
2760: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73 20  fferent threads 
2770: 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20 64  are treated as d
2780: 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74 68  istinct.  But th
2790: 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74  e .** openCnt st
27a0: 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 6e  ructure should n
27b0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  ot include the p
27c0: 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74 73  rocess id in its
27d0: 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65 20  .** key because 
27e0: 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20 6c  close() clears l
27f0: 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61  ock on all threa
2800: 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  ds, not just the
2810: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65   current.** thre
2820: 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f 74  ad.  Were it not
2830: 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69 6e   for this goofin
2840: 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68 72  ess in linux thr
2850: 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a  eads, we could.*
2860: 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f  * combine the lo
2870: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
2880: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  nt structures in
2890: 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75  to a single stru
28a0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  cture..**.** 200
28b0: 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20  4-Jun-28:.** On 
28c0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
28d0: 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73 20   linux, threads 
28e0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
28f0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
2900: 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74  ** On others not
2910: 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75  .  Sometimes you
2920: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20   can change the 
2930: 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65 20  behavior on the 
2940: 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62  same.** system b
2950: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c 44  y setting the LD
2960: 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65  _ASSUME_KERNEL e
2970: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
2980: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53  ble.  The.** POS
2990: 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20 73  IX standard is s
29a0: 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69 63  ilent as to whic
29b0: 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  h behavior is co
29c0: 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a  rrect, as far.**
29d0: 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20   as I can tell, 
29e0: 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e  so other version
29f0: 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74 20  s of unix might 
2a00: 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a  show the same.**
2a10: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20   inconsistency. 
2a20: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 74   There is no lit
2a30: 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79 20  tle doubt in my 
2a40: 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78 0a  mind that posix.
2a50: 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ** advisory lock
2a60: 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72 65  s and linux thre
2a70: 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e 64  ads are profound
2a80: 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  ly broken..**.**
2a90: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
2aa0: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  the inconsistenc
2ab0: 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ies, we have to 
2ac0: 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65 20  test at runtime 
2ad0: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
2ae0: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
2af0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2b00: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73  ers locks.  This
2b10: 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20   test.** is run 
2b20: 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74 20  once, the first 
2b30: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
2b40: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20 73   attempted.  A s
2b50: 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61 62  tatic .** variab
2b60: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65 63  le is set to rec
2b70: 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  ord the results 
2b80: 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f 72  of this test for
2b90: 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a   future.** use..
2ba0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
2bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2bd0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
2be0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
2bf0: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
2c00: 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  r lockInfo struc
2c10: 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69  ture given its i
2c20: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  node..**.** If t
2c30: 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76  hreads cannot ov
2c40: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
2c50: 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77  rs locks, then w
2c60: 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63  e set the.** loc
2c70: 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74  kKey.tid field t
2c80: 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e  o the thread ID.
2c90: 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e    If threads can
2ca0: 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63   override.** eac
2cb0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74  h others locks t
2cc0: 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79  hen tid is alway
2cd0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
2ce0: 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a  tid is omitted.*
2cf0: 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  * if we compile 
2d00: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
2d10: 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74  g support..*/.st
2d20: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20  ruct lockKey {. 
2d30: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
2d40: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
2d50: 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e  er */.  ino_t in
2d60: 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64  o;       /* Inod
2d70: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
2d80: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2d90: 45 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69  E.  pthread_t ti
2da0: 64 3b 20 20 20 2f 2a 20 54 68 72 65 61 64 20 49  d;   /* Thread I
2db0: 44 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 72  D or zero if thr
2dc0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2dd0: 65 20 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a  e each other */.
2de0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2df0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2e00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2e10: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
2e20: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
2e30: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65  en.** inode on e
2e40: 61 63 68 20 74 68 72 65 61 64 20 77 69 74 68 20  ach thread with 
2e50: 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  a different proc
2e60: 65 73 73 20 49 44 2e 20 20 28 54 68 72 65 61 64  ess ID.  (Thread
2e70: 73 20 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72  s have.** differ
2e80: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 73 20  ent process IDs 
2e90: 6f 6e 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f  on linux, but no
2ea0: 74 20 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20  t on most other 
2eb0: 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41  unixes.).**.** A
2ec0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
2ed0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
2ee0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2ef0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
2f00: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
2f10: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
2f20: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
2f30: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
2f40: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
2f50: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
2f60: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
2f70: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
2f80: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
2f90: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 7b  truct lockInfo {
2fa0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65  .  struct lockKe
2fb0: 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65 20 6c  y key;  /* The l
2fc0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
2fd0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
2fe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ff0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
3000: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  ld */.  int lock
3010: 74 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  type;        /* 
3020: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
3030: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
3040: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  K etc. */.  int 
3050: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3060: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
3070: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
3080: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74  tructure */.  st
3090: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
30a0: 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 20  Next, *pPrev;   
30b0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6c  /* List of all l
30c0: 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
30d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
30e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
30f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3100: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
3110: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
3120: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
3130: 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73 74 72  ular openCnt str
3140: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
3150: 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a   inode.  This.**
3160: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
3170: 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65  the lockKey exce
3180: 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65  pt that the thre
3190: 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64  ad ID is omitted
31a0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e  ..*/.struct open
31b0: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
31c0: 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e  v;   /* Device n
31d0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74  umber */.  ino_t
31e0: 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65   ino;   /* Inode
31f0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   number */.};../
3200: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
3210: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3220: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
3230: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
3240: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
3250: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3260: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
3270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
3280: 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  cks on that.** i
3290: 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f 73  node.  If a clos
32a0: 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  e is attempted a
32b0: 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20  gainst an inode 
32c0: 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a  that is holding.
32d0: 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c  ** locks, the cl
32e0: 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ose is deferred 
32f0: 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20  until all locks 
3300: 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67 20  clear by adding 
3310: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
3320: 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f  riptor to be clo
3330: 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64 69  sed to the pendi
3340: 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ng list..*/.stru
3350: 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73  ct openCnt {.  s
3360: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
3370: 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  y;   /* The look
3380: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
3390: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
33a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33b0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
33c0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
33d0: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
33e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33f0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
3400: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
3410: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  nding;         /
3420: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  * Number of pend
3430: 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72  ing close() oper
3440: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
3450: 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20  *aPending;      
3460: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70    /* Malloced sp
3470: 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73  ace holding fd's
3480: 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73   awaiting a clos
3490: 65 28 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  e() */.  struct 
34a0: 6f 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74 2c 20  openCnt *pNext, 
34b0: 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73  *pPrev;   /* Lis
34c0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 43 6e 74  t of all openCnt
34d0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
34e0: 2f 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66 20 61 6c  /*.** List of al
34f0: 6c 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  l lockInfo and o
3500: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73 2e 20  penCnt objects. 
3510: 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 62 65   This used to be
3520: 20 61 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65   a hash.** table
3530: 2e 20 20 42 75 74 20 74 68 65 20 6e 75 6d 62 65  .  But the numbe
3540: 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 69 73 20  r of objects is 
3550: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
3560: 20 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20   a dozen and.** 
3570: 6e 65 76 65 72 20 65 78 63 65 65 64 73 20 61 20  never exceeds a 
3580: 66 65 77 20 74 68 6f 75 73 61 6e 64 2e 20 20 41  few thousand.  A
3590: 6e 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e 6f 74  nd lookup is not
35a0: 20 6f 6e 20 61 20 63 72 69 74 69 63 61 6c 0a 2a   on a critical.*
35b0: 2a 20 70 61 74 68 20 6f 6f 20 61 20 73 69 6d 70  * path oo a simp
35c0: 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77  le linked list w
35d0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a 2f 0a  ill suffice..*/.
35e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 6c 6f  static struct lo
35f0: 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74  ckInfo *lockList
3600: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73 74 72   = 0;.static str
3610: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 6f 70 65  uct openCnt *ope
3620: 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nList = 0;../*.*
3630: 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74  * The locking st
3640: 79 6c 65 73 20 61 72 65 20 61 73 73 6f 63 69 61  yles are associa
3650: 74 65 64 20 77 69 74 68 20 74 68 65 20 64 69 66  ted with the dif
3660: 66 65 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63 6b  ferent file lock
3670: 69 6e 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69 74  ing.** capabilit
3680: 69 65 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  ies supported by
3690: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
36a0: 73 79 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a  systems.  .**.**
36b0: 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 73   POSIX locking s
36c0: 74 79 6c 65 20 66 75 6c 6c 79 20 73 75 70 70 6f  tyle fully suppo
36d0: 72 74 73 20 73 68 61 72 65 64 20 61 6e 64 20 65  rts shared and e
36e0: 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
36f0: 6e 67 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41 46  nge locks .** AF
3700: 50 20 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20 73  P locking only s
3710: 75 70 70 6f 72 74 73 20 65 78 63 6c 75 73 69 76  upports exclusiv
3720: 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
3730: 6b 73 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c 79  ks.** FLOCK only
3740: 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67   supports a sing
3750: 6c 65 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20 65  le file-global e
3760: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
3770: 20 44 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20 61   DOTLOCK isn't a
3780: 20 74 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73 74   true locking st
3790: 79 6c 65 2c 20 69 74 20 72 65 66 65 72 73 20 74  yle, it refers t
37a0: 6f 20 74 68 65 20 75 73 65 20 6f 66 20 61 20 73  o the use of a s
37b0: 70 65 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c 65  pecial.**   file
37c0: 20 6e 61 6d 65 64 20 74 68 65 20 73 61 6d 65 20   named the same 
37d0: 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
37e0: 66 69 6c 65 20 77 69 74 68 20 61 20 27 2e 6c 6f  file with a '.lo
37f0: 63 6b 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74  ck' extension, t
3800: 68 69 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65 20  his.**   can be 
3810: 75 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 79 73  used on file sys
3820: 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  tems that do not
3830: 20 6f 66 66 65 72 20 61 6e 79 20 72 65 6c 69 61   offer any relia
3840: 62 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ble file locking
3850: 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20 6d  .** NO locking m
3860: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63  eans that no loc
3870: 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74  king will be att
3880: 65 6d 70 74 65 64 2c 20 74 68 69 73 20 69 73 20  empted, this is 
3890: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
38a0: 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c     read-only fil
38b0: 65 20 73 79 73 74 65 6d 73 20 63 75 72 72 65 6e  e systems curren
38c0: 74 6c 79 0a 2a 2a 20 55 4e 53 55 50 50 4f 52 54  tly.** UNSUPPORT
38d0: 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  ED means that no
38e0: 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65   locking will be
38f0: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
3900: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
3910: 72 0a 2a 2a 20 20 20 66 69 6c 65 20 73 79 73 74  r.**   file syst
3920: 65 6d 73 20 74 68 61 74 20 61 72 65 20 6b 6e 6f  ems that are kno
3930: 77 6e 20 74 6f 20 62 65 20 75 6e 73 75 70 70 6f  wn to be unsuppo
3940: 72 74 65 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rted.*/.#define 
3950: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f  LOCKING_STYLE_PO
3960: 53 49 58 20 20 20 20 20 20 20 20 31 0a 23 64 65  SIX        1.#de
3970: 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  fine LOCKING_STY
3980: 4c 45 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20  LE_NONE         
3990: 32 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e  2.#define LOCKIN
39a0: 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 20  G_STYLE_DOTFILE 
39b0: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4c       3.#define L
39c0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f  OCKING_STYLE_FLO
39d0: 43 4b 20 20 20 20 20 20 20 20 34 0a 23 64 65 66  CK        4.#def
39e0: 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ine LOCKING_STYL
39f0: 45 5f 41 46 50 20 20 20 20 20 20 20 20 20 20 35  E_AFP          5
3a00: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
3a10: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
3a20: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
3a30: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
3a40: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
3a50: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
3a60: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
3a70: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
3a80: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
3a90: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
3aa0: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
3ab0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
3ac0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
3ad0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
3ae0: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
3af0: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
3b00: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a  e global mutex..
3b10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
3b20: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
3b30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3b40: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
3b50: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
3b60: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
3b70: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
3b80: 76 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28  void leaveMutex(
3b90: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
3ba0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
3bb0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
3bc0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
3bd0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a  IC_MASTER));.}..
3be0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
3bf0: 44 53 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DSAFE./*.** This
3c00: 20 76 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64   variable record
3c10: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
3c20: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
3c30: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3c40: 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  s.** locks..**.*
3c50: 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68  *    0:  No.  Th
3c60: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
3c70: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3c80: 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31  s locks..**    1
3c90: 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73  :  Yes.  Threads
3ca0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
3cb0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
3cc0: 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f  .**   -1:  We do
3cd0: 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a  n't know yet..**
3ce0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  .** On some syst
3cf0: 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20  ems, we know at 
3d00: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20  compile-time if 
3d10: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
3d20: 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68  ride each.** oth
3d30: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74  ers locks.  On t
3d40: 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68  hose systems, th
3d50: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3d60: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61  OVERRIDE_LOCK ma
3d70: 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  cro.** will be s
3d80: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
3d90: 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74  .  On other syst
3da0: 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ems, we have to 
3db0: 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74  check at.** runt
3dc0: 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c  ime.  On these l
3dd0: 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53  atter systems, S
3de0: 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLTIE_THREAD_OVE
3df0: 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a  RRIDE_LOCK is.**
3e00: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
3e10: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
3e20: 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c  normally has fil
3e30: 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42  e scope only.  B
3e40: 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ut during testin
3e50: 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74  g, we make.** it
3e60: 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61   a global so tha
3e70: 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20  t the test code 
3e80: 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76  can change its v
3e90: 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  alue in order to
3ea0: 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20   verify.** that 
3eb0: 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20  the right stuff 
3ec0: 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65  happens in eithe
3ed0: 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  r case..*/.#ifnd
3ee0: 65 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ef SQLITE_THREAD
3ef0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23  _OVERRIDE_LOCK.#
3f00: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
3f10: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3f20: 4f 43 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69  OCK -1.#endif.#i
3f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3f40: 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72  .int threadsOver
3f50: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
3f60: 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52  cks = SQLITE_THR
3f70: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3f80: 4b 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  K;.#else.static 
3f90: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
3fa0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
3fb0: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
3fc0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3fd0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
3fe0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  This structure h
3ff0: 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  olds information
4000: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64   passed into ind
4010: 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20  ividual test.** 
4020: 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74  threads by the t
4030: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4040: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
4050: 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68  ne..*/.struct th
4060: 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20  readTestData {. 
4070: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
4080: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4090: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
40a0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
40b0: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ock;     /* The 
40c0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
40d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  n */.  int resul
40e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
40f0: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c   Result of the l
4100: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4110: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53   */.};..#ifdef S
4120: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4130: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
4140: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
4150: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
4160: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
4170: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4180: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
4190: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
41a0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
41b0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
41c0: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
41d0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
41e0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
41f0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
4200: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
4210: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
4220: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
4230: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
4240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
4250: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
4260: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
4270: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
4280: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
4290: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
42a0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
42b0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
42c0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
42d0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
42e0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
42f0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
4300: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
4310: 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  se{.    s = fcnt
4320: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
4330: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4340: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
4350: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
4360: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
4370: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
4380: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
4390: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
43a0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
43b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
43c0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
43d0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
43e0: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
43f0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4400: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
4410: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
4420: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4430: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
4440: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
4450: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
4460: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
4470: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
4480: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
4490: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
44a0: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
44b0: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
44c0: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
44d0: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
44e0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
44f0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
4500: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
4510: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
4520: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
4530: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
4540: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
4550: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
4560: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
4570: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4580: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
4590: 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
45a0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
45b0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
45c0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
45d0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
45e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
45f0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
4600: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4610: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
4620: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
4630: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4640: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4650: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
4660: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
4670: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
4680: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4690: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
46a0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
46b0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
46c0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
46d0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
46e0: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
46f0: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
4700: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
4710: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
4720: 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f  #define fcntl lo
4730: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
4740: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
4750: 41 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f  ACE */..#ifdef _
4760: 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 54  _linux__./*.** T
4770: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4780: 75 73 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e  used as the main
4790: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 74   routine for a t
47a0: 68 72 65 61 64 20 6c 61 75 6e 63 68 65 64 20 62  hread launched b
47b0: 79 0a 2a 2a 20 74 65 73 74 54 68 72 65 61 64 4c  y.** testThreadL
47c0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
47d0: 2e 20 49 74 20 74 65 73 74 73 20 77 68 65 74 68  . It tests wheth
47e0: 65 72 20 74 68 65 20 73 68 61 72 65 64 2d 6c 6f  er the shared-lo
47f0: 63 6b 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 62  ck obtained.** b
4800: 79 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61  y the main threa
4810: 64 20 69 6e 20 74 65 73 74 54 68 72 65 61 64 4c  d in testThreadL
4820: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4830: 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
4840: 61 0a 2a 2a 20 68 79 70 6f 74 68 65 74 69 63 61  a.** hypothetica
4850: 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 62 74  l write-lock obt
4860: 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 74 68  ained by this th
4870: 72 65 61 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  read on the same
4880: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
4890: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
48a0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 63 71 75  ot actually acqu
48b0: 69 72 65 64 2c 20 61 73 20 74 68 69 73 20 69 73  ired, as this is
48c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 69 66   not possible if
48d0: 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73   .** the file is
48e0: 20 6f 70 65 6e 20 69 6e 20 72 65 61 64 2d 6f 6e   open in read-on
48f0: 6c 79 20 6d 6f 64 65 20 28 73 65 65 20 74 69 63  ly mode (see tic
4900: 6b 65 74 20 23 33 34 37 32 29 2e 0a 2a 2f 20 0a  ket #3472)..*/ .
4910: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72  static void *thr
4920: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76  eadLockingTest(v
4930: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74  oid *pArg){.  st
4940: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
4950: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74  ata *pData = (st
4960: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
4970: 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61  ata*)pArg;.  pDa
4980: 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e  ta->result = fcn
4990: 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f  tl(pData->fd, F_
49a0: 47 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c  GETLK, &pData->l
49b0: 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ock);.  return p
49c0: 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
49d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74 74  is procedure att
49e0: 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
49f0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
4a00: 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e  t threads.** can
4a10: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4a20: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
4a30: 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68   sets the .** th
4a40: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
4a50: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72  hOthersLocks var
4a60: 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74  iable appropriat
4a70: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
4a80: 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f  oid testThreadLo
4a90: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e  ckingBehavior(in
4aa0: 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e  t fd_orig){.  in
4ab0: 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t fd;.  int rc;.
4ac0: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4ad0: 65 73 74 44 61 74 61 20 64 3b 0a 20 20 73 74 72  estData d;.  str
4ae0: 75 63 74 20 66 6c 6f 63 6b 20 6c 3b 0a 20 20 70  uct flock l;.  p
4af0: 74 68 72 65 61 64 5f 74 20 74 3b 0a 0a 20 20 66  thread_t t;..  f
4b00: 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29  d = dup(fd_orig)
4b10: 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72  ;.  if( fd<0 ) r
4b20: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
4b30: 26 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 29  &l, 0, sizeof(l)
4b40: 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70 65 20 3d 20  );.  l.l_type = 
4b50: 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c 2e 6c 5f 6c  F_RDLCK;.  l.l_l
4b60: 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e 6c 5f 73 74  en = 1;.  l.l_st
4b70: 61 72 74 20 3d 20 30 3b 0a 20 20 6c 2e 6c 5f 77  art = 0;.  l.l_w
4b80: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
4b90: 3b 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66  ;.  rc = fcntl(f
4ba0: 64 5f 6f 72 69 67 2c 20 46 5f 53 45 54 4c 4b 2c  d_orig, F_SETLK,
4bb0: 20 26 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &l);.  if( rc!=
4bc0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
4bd0: 6d 73 65 74 28 26 64 2c 20 30 2c 20 73 69 7a 65  mset(&d, 0, size
4be0: 6f 66 28 64 29 29 3b 0a 20 20 64 2e 66 64 20 3d  of(d));.  d.fd =
4bf0: 20 66 64 3b 0a 20 20 64 2e 6c 6f 63 6b 20 3d 20   fd;.  d.lock = 
4c00: 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e 6c 5f 74 79  l;.  d.lock.l_ty
4c10: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
4c20: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26  pthread_create(&
4c30: 74 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  t, 0, threadLock
4c40: 69 6e 67 54 65 73 74 2c 20 26 64 29 3b 0a 20 20  ingTest, &d);.  
4c50: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c 20  pthread_join(t, 
4c60: 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  0);.  close(fd);
4c70: 0a 20 20 69 66 28 20 64 2e 72 65 73 75 6c 74 21  .  if( d.result!
4c80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 74  =0 ) return;.  t
4c90: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
4ca0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
4cb0: 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  (d.lock.l_type==
4cc0: 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a 23 65 6c 73  F_UNLCK);.}.#els
4cd0: 65 0a 2f 2a 0a 2a 2a 20 4f 6e 20 61 6e 79 74 68  e./*.** On anyth
4ce0: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 6c  ing other than l
4cf0: 69 6e 75 78 2c 20 61 73 73 75 6d 65 20 74 68 72  inux, assume thr
4d00: 65 61 64 73 20 6f 76 65 72 72 69 64 65 20 65 61  eads override ea
4d10: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
4d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4d30: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4d40: 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64  gBehavior(int fd
4d50: 5f 6f 72 69 67 29 7b 0a 20 20 74 68 72 65 61 64  _orig){.  thread
4d60: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4d70: 65 72 73 4c 6f 63 6b 73 20 3d 20 31 3b 0a 7d 0a  ersLocks = 1;.}.
4d80: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
4d90: 78 5f 5f 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  x__ */..#endif /
4da0: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
4db0: 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AFE */../*.** Re
4dc0: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f  lease a lockInfo
4dd0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
4de0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
4df0: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
4e00: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
4e10: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
4e20: 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  o(struct lockInf
4e30: 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  o *pLock){.  if(
4e40: 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c   pLock ){.    pL
4e50: 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ock->nRef--;.   
4e60: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66   if( pLock->nRef
4e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4e80: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b   pLock->pPrev ){
4e90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4ea0: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70   pLock->pPrev->p
4eb0: 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  Next==pLock );. 
4ec0: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50         pLock->pP
4ed0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f  rev->pNext = pLo
4ee0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
4ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f00: 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74  assert( lockList
4f10: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
4f20: 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c     lockList = pL
4f30: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
4f40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
4f50: 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ock->pNext ){.  
4f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
4f70: 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ock->pNext->pPre
4f80: 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  v==pLock );.    
4f90: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
4fa0: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d  ->pPrev = pLock-
4fb0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
4fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4fd0: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
4fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4ff0: 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20  lease a openCnt 
5000: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
5010: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
5020: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
5030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5040: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
5050: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5060: 70 4f 70 65 6e 29 7b 0a 20 20 69 66 28 20 70 4f  pOpen){.  if( pO
5070: 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e  pen ){.    pOpen
5080: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5090: 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30  ( pOpen->nRef==0
50a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
50b0: 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  pen->pPrev ){.  
50c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
50d0: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
50e0: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
50f0: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76      pOpen->pPrev
5100: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d  ->pNext = pOpen-
5110: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
5120: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
5130: 65 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70  ert( openList==p
5140: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
5150: 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e  openList = pOpen
5160: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
5170: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
5180: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
5190: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
51a0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
51b0: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
51c0: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70   pOpen->pNext->p
51d0: 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50  Prev = pOpen->pP
51e0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
51f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5200: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
5210: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5220: 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20  free(pOpen);.   
5230: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51   }.  }.}..#if SQ
5240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5250: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
5260: 54 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e  Tests a byte-ran
5270: 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79  ge locking query
5280: 20 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20   to see if byte 
5290: 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
52a0: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69  .** supported, i
52b0: 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61  f not we fall ba
52c0: 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63  ck to dotlockLoc
52d0: 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74  kingStyle..*/.st
52e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 4c 6f 63  atic int testLoc
52f0: 6b 69 6e 67 53 74 79 6c 65 28 69 6e 74 20 66 64  kingStyle(int fd
5300: 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
5310: 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 2f  k lockInfo;..  /
5320: 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
5330: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
5340: 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
5350: 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
5360: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
5370: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
5380: 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
5390: 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
53a0: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
53b0: 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
53c0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
53d0: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
53e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
53f0: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
5400: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
5410: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
5420: 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
5430: 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
5440: 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  n LOCKING_STYLE_
5450: 50 4f 53 49 58 3b 0a 20 20 7d 0a 20 20 0a 20 20  POSIX;.  }.  .  
5460: 2f 2a 20 54 65 73 74 69 6e 67 20 66 6f 72 20 66  /* Testing for f
5470: 6c 6f 63 6b 28 29 20 63 61 6e 20 67 69 76 65 20  lock() can give 
5480: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 2e  false positives.
5490: 20 20 53 6f 20 69 66 20 69 66 20 74 68 65 20 61    So if if the a
54a0: 62 6f 76 65 20 0a 20 20 2a 2a 20 74 65 73 74 20  bove .  ** test 
54b0: 66 61 69 6c 73 2c 20 74 68 65 6e 20 77 65 20 66  fails, then we f
54c0: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
54d0: 67 20 64 6f 74 2d 66 69 6c 65 20 73 74 79 6c 65  g dot-file style
54e0: 20 6c 6f 63 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20   locking..  */  
54f0: 0a 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e  .  return LOCKIN
5500: 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 3b  G_STYLE_DOTFILE;
5510: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  .}.#endif../* .*
5520: 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
5530: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
5540: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69   is defined, thi
5550: 73 20 66 75 6e 63 74 69 6f 6e 20 45 78 61 6d 69  s function Exami
5560: 6e 65 73 20 74 68 65 20 0a 2a 2a 20 66 5f 66 73  nes the .** f_fs
5570: 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69  typename entry i
5580: 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72  n the statfs str
5590: 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e  ucture as return
55a0: 65 64 20 62 79 20 73 74 61 74 28 29 20 66 6f 72  ed by stat() for
55b0: 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 73 79   .** the file sy
55c0: 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65  stem hosting the
55d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
55e0: 6e 64 20 73 65 6c 65 63 74 73 20 20 74 68 65 20  nd selects  the 
55f0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6c  appropriate.** l
5600: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73  ocking style bas
5610: 65 64 20 6f 6e 20 69 74 73 20 76 61 6c 75 65 2e  ed on its value.
5620: 20 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 61    These values a
5630: 6e 64 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 61  nd assignments a
5640: 72 65 20 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  re .** based on 
5650: 44 61 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76  Darwin/OSX behav
5660: 69 6f 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74  ior and have not
5670: 20 62 65 65 6e 20 74 68 6f 72 6f 75 67 68 6c 79   been thoroughly
5680: 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f   tested on .** o
5690: 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2a  ther systems..**
56a0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e  .** If SQLITE_EN
56b0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
56c0: 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  LE is not define
56d0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
56e0: 20 61 6c 77 61 79 73 0a 2a 2a 20 72 65 74 75 72   always.** retur
56f0: 6e 73 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ns LOCKING_STYLE
5700: 5f 50 4f 53 49 58 2e 0a 2a 2f 0a 73 74 61 74 69  _POSIX..*/.stati
5710: 63 20 69 6e 74 20 64 65 74 65 63 74 4c 6f 63 6b  c int detectLock
5720: 69 6e 67 53 74 79 6c 65 28 0a 20 20 73 71 6c 69  ingStyle(.  sqli
5730: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
5740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
5750: 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64  ePath, .  int fd
5760: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .){.#if SQLITE_E
5770: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5780: 59 4c 45 0a 20 20 73 74 72 75 63 74 20 4d 61 70  YLE.  struct Map
5790: 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
57a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
57b0: 65 6d 3b 0a 20 20 20 20 69 6e 74 20 65 4c 6f 63  em;.    int eLoc
57c0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 20 61  kingStyle;.  } a
57d0: 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
57e0: 22 68 66 73 22 2c 20 20 20 20 4c 4f 43 4b 49 4e  "hfs",    LOCKIN
57f0: 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 20 7d 2c  G_STYLE_POSIX },
5800: 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
5810: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50   LOCKING_STYLE_P
5820: 4f 53 49 58 20 7d 2c 0a 20 20 20 20 7b 20 22 61  OSIX },.    { "a
5830: 66 70 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f  fpfs",  LOCKING_
5840: 53 54 59 4c 45 5f 41 46 50 20 7d 2c 0a 23 69 66  STYLE_AFP },.#if
5850: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5860: 45 5f 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d  E_AFP_LOCKING_SM
5870: 42 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  B.    { "smbfs",
5880: 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f    LOCKING_STYLE_
5890: 41 46 50 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20  AFP },.#else.   
58a0: 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 4c 4f 43   { "smbfs",  LOC
58b0: 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b  KING_STYLE_FLOCK
58c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b   },.#endif.    {
58d0: 20 22 6d 73 64 6f 73 22 2c 20 20 4c 4f 43 4b 49   "msdos",  LOCKI
58e0: 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45  NG_STYLE_DOTFILE
58f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
5900: 76 22 2c 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  v", LOCKING_STYL
5910: 45 5f 4e 4f 4e 45 20 7d 2c 0a 20 20 20 20 7b 20  E_NONE },.    { 
5920: 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
5930: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
5940: 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20  atfs fsInfo;..  
5950: 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
5960: 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b  .    return LOCK
5970: 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a  ING_STYLE_NONE;.
5980: 20 20 7d 0a 20 20 69 66 28 20 70 56 66 73 2d 3e    }.  if( pVfs->
5990: 70 41 70 70 44 61 74 61 20 29 7b 0a 20 20 20 20  pAppData ){.    
59a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 54  return SQLITE_PT
59b0: 52 5f 54 4f 5f 49 4e 54 28 70 56 66 73 2d 3e 70  R_TO_INT(pVfs->p
59c0: 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  AppData);.  }.. 
59d0: 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
59e0: 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
59f0: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
5a00: 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
5a10: 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
5a20: 20 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b       return LOCK
5a30: 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a  ING_STYLE_NONE;.
5a40: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
5a50: 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
5a60: 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
5a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
5a80: 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
5a90: 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
5aa0: 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
5ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
5ac0: 61 70 5b 69 5d 2e 65 4c 6f 63 6b 69 6e 67 53 74  ap[i].eLockingSt
5ad0: 79 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yle;.      }.   
5ae0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
5af0: 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
5b00: 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
5b10: 72 73 2c 20 22 6e 66 73 22 2e 20 2a 2f 0a 20 20  rs, "nfs". */.  
5b20: 72 65 74 75 72 6e 20 74 65 73 74 4c 6f 63 6b 69  return testLocki
5b30: 6e 67 53 74 79 6c 65 28 66 64 29 3b 20 20 0a 23  ngStyle(fd);  .#
5b40: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 4c  endif.  return L
5b50: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53  OCKING_STYLE_POS
5b60: 49 58 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  IX;.}../*.** Giv
5b70: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
5b80: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63  ptor, locate loc
5b90: 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e  kInfo and openCn
5ba0: 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  t structures tha
5bb0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
5bc0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
5bd0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77  tor.  Create new
5be0: 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61   ones if necessa
5bf0: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
5c00: 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20  rn values might 
5c10: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
5c20: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
5c30: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  urs..**.** Retur
5c40: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
5c50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
5c60: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c  static int findL
5c70: 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66  ockInfo(.  int f
5c80: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
5c90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
5ca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
5cb0: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
5cc0: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  /.  struct lockI
5cd0: 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20  nfo **ppLock,   
5ce0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c   /* Return the l
5cf0: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
5d00: 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  e here */.  stru
5d10: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f  ct openCnt **ppO
5d20: 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74 75  pen      /* Retu
5d30: 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73  rn the openCnt s
5d40: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
5d50: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
5d60: 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b  struct lockKey k
5d70: 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70  ey1;.  struct op
5d80: 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74  enKey key2;.  st
5d90: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
5da0: 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  f;.  struct lock
5db0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73  Info *pLock;.  s
5dc0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
5dd0: 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74  Open;.  rc = fst
5de0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5df0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
5e00: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
5e10: 57 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  W.    if( errno=
5e20: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
5e30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
5e40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
5e50: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
5e60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 20 4f  ;.  }..  /* On O
5e70: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
5e80: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
5e90: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
5ea0: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
5eb0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
5ec0: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
5ed0: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
5ee0: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
5ef0: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
5f00: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
5f10: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
5f20: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
5f30: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
5f40: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
5f50: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
5f60: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
5f70: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
5f80: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
5f90: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
5fa0: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
5fb0: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
5fc0: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
5fd0: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
5fe0: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
5ff0: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
6000: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
6010: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
6020: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
6030: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
6040: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
6050: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
6060: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
6070: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
6080: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
6090: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
60a0: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
60b0: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
60c0: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
60d0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  .st_size==0 ){. 
60e0: 20 20 20 77 72 69 74 65 28 66 64 2c 20 22 53 22     write(fd, "S"
60f0: 2c 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  , 1);.    rc = f
6100: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
6110: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
6120: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
6130: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
6140: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
6150: 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69  set(&key1, 0, si
6160: 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b  zeof(key1));.  k
6170: 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75  ey1.dev = statbu
6180: 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31  f.st_dev;.  key1
6190: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
61a0: 74 5f 69 6e 6f 3b 0a 23 69 66 20 53 51 4c 49 54  t_ino;.#if SQLIT
61b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 69  E_THREADSAFE.  i
61c0: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
61d0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
61e0: 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54  s<0 ){.    testT
61f0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
6200: 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20  vior(fd);.  }.  
6210: 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61  key1.tid = threa
6220: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
6230: 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20  hersLocks ? 0 : 
6240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
6250: 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28  #endif.  memset(
6260: 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66  &key2, 0, sizeof
6270: 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e  (key2));.  key2.
6280: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
6290: 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f  _dev;.  key2.ino
62a0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
62b0: 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63  o;.  pLock = loc
62c0: 6b 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  kList;.  while( 
62d0: 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28  pLock && memcmp(
62e0: 26 6b 65 79 31 2c 20 26 70 4c 6f 63 6b 2d 3e 6b  &key1, &pLock->k
62f0: 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29  ey, sizeof(key1)
6300: 29 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  ) ){.    pLock =
6310: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
6320: 20 7d 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d   }.  if( pLock==
6330: 30 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  0 ){.    pLock =
6340: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6350: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
6360: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
6370: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6380: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6390: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
63a0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
63b0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
63c0: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
63d0: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
63e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
63f0: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
6400: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
6410: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
6420: 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 70 4c  lockList;.    pL
6430: 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ock->pPrev = 0;.
6440: 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74      if( lockList
6450: 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72   ) lockList->pPr
6460: 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20  ev = pLock;.    
6470: 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b  lockList = pLock
6480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6490: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
64a0: 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c  }.  *ppLock = pL
64b0: 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65  ock;.  if( ppOpe
64c0: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
64d0: 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20  n = openList;.  
64e0: 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26    while( pOpen &
64f0: 26 20 6d 65 6d 63 6d 70 28 26 6b 65 79 32 2c 20  & memcmp(&key2, 
6500: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
6510: 65 6f 66 28 6b 65 79 32 29 29 20 29 7b 0a 20 20  eof(key2)) ){.  
6520: 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65      pOpen = pOpe
6530: 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  n->pNext;.    }.
6540: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
6550: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20   ){.      pOpen 
6560: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
6570: 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29  ( sizeof(*pOpen)
6580: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
6590: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
65a0: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
65b0: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
65c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
65d0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
65e0: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
65f0: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
6600: 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20     pOpen->key = 
6610: 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65  key2;.      pOpe
6620: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
6630: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20     pOpen->nLock 
6640: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
6650: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
6660: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
6670: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
6680: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20   pOpen->pNext = 
6690: 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  openList;.      
66a0: 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 3d 20 30  pOpen->pPrev = 0
66b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e  ;.      if( open
66c0: 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d  List ) openList-
66d0: 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a  >pPrev = pOpen;.
66e0: 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d        openList =
66f0: 20 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65 6c 73   pOpen;.    }els
6700: 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  e{.      pOpen->
6710: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
6720: 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65    *ppOpen = pOpe
6730: 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e  n;.  }..exit_fin
6740: 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74  dlockinfo:.  ret
6750: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
6760: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
6770: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
6780: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
6790: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
67a0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
67b0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
67c0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
67d0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
67e0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
67f0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
6800: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
6810: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6820: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
6830: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
6840: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
6850: 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e  type ){.  case N
6860: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
6870: 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48  NONE";.  case SH
6880: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
6890: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61  n "SHARED";.  ca
68a0: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
68b0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
68c0: 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44  ED";.  case PEND
68d0: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
68e0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61   "PENDING";.  ca
68f0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
6900: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
6910: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
6920: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
6930: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
6940: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
6950: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
6960: 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20  thread than the 
6970: 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a  thread that the.
6980: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75  ** unixFile argu
6990: 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c  ment belongs to,
69a0: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f   then transfer o
69b0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
69c0: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72  unixFile.** over
69d0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
69e0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
69f0: 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79  unixFile is only
6a00: 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65   owned by a thre
6a10: 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68  ad on systems wh
6a20: 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69  ere one thread i
6a30: 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f  s.** unable to o
6a40: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72  verride locks cr
6a50: 65 61 74 65 64 20 62 79 20 61 20 64 69 66 66 65  eated by a diffe
6a60: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65  rent thread.  Re
6a70: 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65  dHat9 is.** an e
6a80: 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61  xample of such a
6a90: 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f   system..**.** O
6aa0: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
6ab0: 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  r is only allowe
6ac0: 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c  d if the unixFil
6ad0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
6ae0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74  nlocked..** If t
6af0: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c  he unixFile is l
6b00: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e  ocked and an own
6b10: 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c  ership is wrong,
6b20: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
6b30: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20  SQLITE_MISUSE.  
6b40: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6b50: 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
6b60: 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69  ing works..*/.#i
6b70: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
6b80: 41 46 45 0a 73 74 61 74 69 63 20 69 6e 74 20 74  AFE.static int t
6b90: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
6ba0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
6bb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
6bc0: 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a  thread_t hSelf;.
6bd0: 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65    if( threadsOve
6be0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
6bf0: 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  ocks ){.    /* O
6c00: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
6c10: 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e  rs not needed on
6c20: 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a   this system */.
6c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c  E_OK;.  }.  hSel
6c50: 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  f = pthread_self
6c60: 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  ();.  if( pthrea
6c70: 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74  d_equal(pFile->t
6c80: 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20  id, hSelf) ){.  
6c90: 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c    /* We are stil
6ca0: 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68  l in the same th
6cb0: 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52  read */.    OSTR
6cc0: 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65  ACE1("No-transfe
6cd0: 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e  r, same thread\n
6ce0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
6cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
6d00: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
6d10: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
6d20: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74      /* We cannot
6d30: 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69   change ownershi
6d40: 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68  p while we are h
6d50: 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a  olding a lock! *
6d60: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
6d70: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
6d80: 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e    OSTRACE4("Tran
6d90: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
6da0: 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20  f %d from %d to 
6db0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
6dc0: 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
6dd0: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b  le->tid, hSelf);
6de0: 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20  .  pFile->tid = 
6df0: 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69  hSelf;.  if (pFi
6e00: 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c  le->pLock != NUL
6e10: 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  L) {.    release
6e20: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
6e30: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  pLock);.    rc =
6e40: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46   findLockInfo(pF
6e50: 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e  ile->h, &pFile->
6e60: 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f  pLock, 0);.    O
6e70: 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
6e80: 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73   %d is now %s(%s
6e90: 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ,%d)\n", pFile->
6ea0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
6eb0: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
6ec0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20  ->locktype),.   
6ed0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
6ee0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Name(pFile->pLoc
6ef0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46  k->locktype), pF
6f00: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29  ile->pLock->cnt)
6f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
6f20: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
6f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6f40: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20  ;.  }.}.#else.  
6f50: 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72  /* On single-thr
6f60: 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77  eaded builds, ow
6f70: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
6f80: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23   is a no-op */.#
6f90: 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72   define transfer
6fa0: 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c  Ownership(X) SQL
6fb0: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
6fc0: 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
6fd0: 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
6fe0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
6ff0: 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
7000: 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
7010: 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
7020: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7030: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
7040: 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
7050: 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
7060: 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
7070: 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
7080: 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
7090: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
70a0: 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
70b0: 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
70c0: 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
70d0: 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
70e0: 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
70f0: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
7100: 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
7110: 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d  .** any any form
7120: 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
7130: 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
7140: 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
7150: 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
7160: 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
7170: 6e 64 20 23 32 36 38 31 2e 0a 2a 2f 0a 73 74 61  nd #2681..*/.sta
7180: 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
7190: 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
71a0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
71b0: 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
71c0: 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
71d0: 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e  int got;.  i64 n
71e0: 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45  ewOffset;.  TIME
71f0: 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
7200: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
7210: 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64    got = pread(id
7220: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
7230: 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c  offset);.  Simul
7240: 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
7250: 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65  = -1 );.#elif de
7260: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
7270: 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64  4).  got = pread
7280: 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
7290: 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
72a0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
72b0: 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
72c0: 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
72d0: 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
72e0: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
72f0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
7300: 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
7310: 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
7320: 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
7330: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
7340: 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64  .  got = read(id
7350: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
7360: 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
7370: 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  END;.  OSTRACE5(
7380: 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
7390: 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
73a0: 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66   id->h, got, off
73b0: 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
73c0: 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  ED);.  return go
73d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
73e0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
73f0: 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
7400: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7410: 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
7420: 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
7430: 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
7440: 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
7450: 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
7460: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7470: 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
7480: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
7490: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
74a0: 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
74b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
74c0: 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74  set.){.  int got
74d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
74e0: 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ;.  got = seekAn
74f0: 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
7500: 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  )id, offset, pBu
7510: 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
7520: 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
7530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7540: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
7550: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
7560: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
7570: 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
7580: 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
7590: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
75a0: 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
75b0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
75c0: 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
75d0: 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
75e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
75f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
7600: 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
7610: 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
7620: 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
7630: 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
7640: 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
7650: 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
7660: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7670: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
7680: 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
7690: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
76a0: 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28  nt seekAndWrite(
76b0: 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36  unixFile *id, i6
76c0: 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20  4 offset, const 
76d0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
76e0: 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
76f0: 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
7700: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
7710: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
7720: 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20  _PREAD).  got = 
7730: 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
7740: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
7750: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
7760: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
7770: 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64  ot = pwrite64(id
7780: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
7790: 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20  offset);.#else. 
77a0: 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
77b0: 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
77c0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69  , SEEK_SET);.  i
77d0: 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
77e0: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
77f0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
7800: 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
7810: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
7820: 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
7830: 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54    OSTRACE5("WRIT
7840: 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
7850: 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
7860: 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
7870: 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
7880: 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
7890: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
78a0: 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
78b0: 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
78c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
78d0: 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
78e0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
78f0: 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
7900: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7910: 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
7920: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
7930: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
7940: 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
7950: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
7960: 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e   offset .){.  in
7970: 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
7980: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
7990: 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
79a0: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
79b0: 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
79c0: 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46 69 6c  ndWrite((unixFil
79d0: 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70  e*)id, offset, p
79e0: 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
79f0: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
7a00: 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
7a10: 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
7a20: 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
7a30: 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
7a40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
7a50: 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
7a60: 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
7a70: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
7a80: 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
7a90: 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  ));.  if( amt>0 
7aa0: 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
7ab0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <0 ){.      retu
7ac0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
7ad0: 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
7ae0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7af0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
7b00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
7b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
7b20: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
7b30: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
7b40: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
7b50: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
7b60: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
7b70: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
7b80: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
7b90: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
7ba0: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
7bb0: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
7bc0: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
7bd0: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
7be0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
7bf0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
7c00: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
7c10: 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
7c20: 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
7c30: 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
7c40: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
7c50: 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
7c60: 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
7c70: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
7c80: 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
7c90: 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
7ca0: 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
7cb0: 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
7cc0: 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
7cd0: 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
7ce0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
7cf0: 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
7d00: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
7d10: 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
7d20: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
7d30: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
7d40: 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
7d50: 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
7d60: 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
7d70: 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
7d80: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
7d90: 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
7da0: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
7db0: 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
7dc0: 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
7dd0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
7de0: 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
7df0: 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
7e00: 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
7e10: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
7e20: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
7e30: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
7e40: 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
7e50: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
7e60: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
7e70: 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
7e80: 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
7e90: 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
7ea0: 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
7eb0: 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
7ec0: 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
7ed0: 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
7ee0: 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
7ef0: 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
7f00: 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
7f10: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
7f20: 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
7f30: 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
7f40: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
7f50: 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
7f60: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
7f70: 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
7f80: 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
7f90: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7fa0: 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
7fb0: 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
7fc0: 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
7fd0: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
7fe0: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
7ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
8000: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
8010: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
8020: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
8030: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
8040: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
8050: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
8060: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
8070: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
8080: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
8090: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
80a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
80b0: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
80c0: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
80d0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
80e0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
80f0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
8100: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
8110: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
8120: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
8130: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
8140: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
8150: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8160: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
8170: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
8180: 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  ..#if HAVE_FULLF
8190: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
81a0: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
81b0: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
81c0: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
81d0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
81e0: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
81f0: 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
8200: 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
8210: 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
8220: 6e 63 28 29 2e 0a 20 20 20 2a 20 49 74 20 73 68  nc()..   * It sh
8230: 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
8240: 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
8250: 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
8260: 20 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c   local .   * fil
8270: 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
8280: 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
8290: 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
82a0: 4c 46 53 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27  LFSYNC.   * isn'
82b0: 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
82c0: 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
82d0: 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
82e0: 20 66 73 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64   fsync .   * and
82f0: 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
8300: 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
8310: 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
8320: 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
8330: 20 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65   * It'd be bette
8340: 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
8350: 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
8360: 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
8370: 20 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c   * the fcntl cal
8380: 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
8390: 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20  c is called..   
83a0: 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
83b0: 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
83c0: 65 6c 73 65 20 0a 20 20 69 66 28 20 64 61 74 61  else .  if( data
83d0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
83e0: 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
83f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
8400: 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
8410: 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f  .#endif /* HAVE_
8420: 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 23 65 6e  FULLFSYNC */.#en
8430: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
8440: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a  QLITE_NO_SYNC) *
8450: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
8460: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
8470: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
8480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
8490: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
84a0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
84b0: 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
84c0: 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
84d0: 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
84e0: 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
84f0: 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
8500: 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
8510: 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
8520: 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
8530: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
8540: 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
8550: 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
8560: 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
8570: 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
8580: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
8590: 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
85a0: 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
85b0: 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
85c0: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
85d0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
85e0: 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
85f0: 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
8600: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
8610: 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
8620: 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
8630: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
8640: 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
8650: 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
8660: 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
8670: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
8680: 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
8690: 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
86a0: 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
86b0: 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
86c0: 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
86d0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
86e0: 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
86f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8700: 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
8710: 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
8720: 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
8730: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
8740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8750: 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
8760: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
8770: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
8780: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
8790: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
87a0: 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
87b0: 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
87c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
87d0: 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
87e0: 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
87f0: 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
8800: 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
8810: 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
8820: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
8830: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
8840: 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
8850: 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
8860: 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
8870: 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
8880: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
8890: 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
88a0: 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
88b0: 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
88c0: 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
88d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
88e0: 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
88f0: 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
8900: 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
8910: 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
8920: 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
8930: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
8940: 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
8950: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
8960: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
8970: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
8980: 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
8990: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
89a0: 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
89b0: 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
89c0: 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
89d0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
89e0: 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
89f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
8a00: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
8a10: 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28  FSYNC;.  }.  if(
8a20: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
8a30: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34   ){.    OSTRACE4
8a40: 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
8a50: 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
8a60: 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
8a70: 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
8a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
8a90: 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
8aa0: 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65  ullsync);.#ifnde
8ab0: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
8ac0: 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20  _DIRSYNC.    /* 
8ad0: 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  The directory sy
8ae0: 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  nc is only attem
8af0: 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79  pted if full_fsy
8b00: 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72  nc is.    ** tur
8b10: 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61  ned off or unava
8b20: 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75  ilable.  If a fu
8b30: 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65  ll_fsync occurre
8b40: 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20  d above,.    ** 
8b50: 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  then the directo
8b60: 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72  ry sync is super
8b70: 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  fluous..    */. 
8b80: 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55     if( (!HAVE_FU
8b90: 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75  LLFSYNC || !isFu
8ba0: 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llsync) && full_
8bb0: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
8bc0: 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
8bd0: 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
8be0: 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
8bf0: 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
8c00: 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
8c10: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
8c20: 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
8c30: 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
8c40: 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
8c50: 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
8c60: 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
8c70: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
8c80: 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
8c90: 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
8ca0: 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
8cb0: 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
8cc0: 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
8cd0: 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
8ce0: 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
8cf0: 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
8d00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
8d10: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
8d20: 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  d);  /* Only nee
8d30: 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
8d40: 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72  so close the dir
8d50: 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46  ectory */.    pF
8d60: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
8d70: 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61      /* when we a
8d80: 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a  re done. */.  }.
8d90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8da0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
8db0: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
8dc0: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
8dd0: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
8de0: 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
8df0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
8e00: 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
8e10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
8e20: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
8e30: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
8e40: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8e50: 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72  _TRUNCATE );.  r
8e60: 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
8e70: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
8e80: 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
8e90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8eb0: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
8ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8ed0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8ee0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
8ef0: 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
8f00: 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
8f10: 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
8f20: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
8f30: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
8f40: 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
8f50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
8f60: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
8f70: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
8f80: 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
8f90: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
8fa0: 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
8fb0: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
8fc0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8fd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8fe0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
8ff0: 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
9000: 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
9010: 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
9020: 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
9030: 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f  base, the findLo
9040: 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  ckInfo() procedu
9050: 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
9060: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
9070: 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
9080: 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
9090: 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
90a0: 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
90b0: 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
90c0: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
90d0: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
90e0: 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
90f0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
9100: 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
9110: 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
9120: 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
9130: 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
9140: 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
9150: 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
9160: 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
9170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9180: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
9190: 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c  s routine transl
91a0: 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20  ates a standard 
91b0: 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65  POSIX errno code
91c0: 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a   into something.
91d0: 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65  ** useful to the
91e0: 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20   clients of the 
91f0: 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e  sqlite3 function
9200: 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
9210: 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e  , it is.** inten
9220: 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  ded to translate
9230: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74   a variety of "t
9240: 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73  ry again" errors
9250: 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53   into SQLITE_BUS
9260: 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65  Y.** and a varie
9270: 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c  ty of "please cl
9280: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
9290: 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72  criptor NOW" err
92a0: 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c  ors into .** SQL
92b0: 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a  ITE_IOERR.** .**
92c0: 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69   Errors during i
92d0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
92e0: 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20   locks, or file 
92f0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66  system support f
9300: 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f  or locks,.** sho
9310: 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43  uld handle ENOLC
9320: 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e  K, ENOTSUP, EOPN
9330: 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c  OTSUPP separatel
9340: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
9350: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
9360: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70  PosixError(int p
9370: 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73  osixError, int s
9380: 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20  qliteIOErr) {.  
9390: 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72  switch (posixErr
93a0: 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20  or) {.  case 0: 
93b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
93c0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61  TE_OK;.    .  ca
93d0: 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73  se EAGAIN:.  cas
93e0: 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63  e ETIMEDOUT:.  c
93f0: 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73  ase EBUSY:.  cas
9400: 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20  e EINTR:.  case 
9410: 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a  ENOLCK:  .    /*
9420: 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72   random NFS retr
9430: 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20  y error, unless 
9440: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
9450: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
9460: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
9470: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
9480: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
9490: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20  t it says */.   
94a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
94b0: 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  USY;.    .  case
94c0: 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a   EACCES: .    /*
94d0: 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20   EACCES is like 
94e0: 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f  EAGAIN during lo
94f0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
9500: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74  , but not any ot
9510: 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69  her time*/.    i
9520: 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20  f( (sqliteIOErr 
9530: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
9540: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
9550: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
9560: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
9570: 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72  || ..(sqliteIOEr
9580: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
9590: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73  R_RDLOCK) ||..(s
95a0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
95b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
95c0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b  RESERVEDLOCK) ){
95d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
95e0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
95f0: 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
9600: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63  l through */.  c
9610: 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20  ase EPERM: .    
9620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
9630: 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  RM;.    .  case 
9640: 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74  EDEADLK:.    ret
9650: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9660: 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23  _BLOCKED;.    .#
9670: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
9680: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
9690: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
96a0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
96b0: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
96c0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
96d0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
96e0: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
96f0: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
9700: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
9710: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
9720: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
9730: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
9740: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
9750: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
9760: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
9770: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
9780: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
9790: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
97a0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
97b0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
97c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
97d0: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
97e0: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
97f0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
9800: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
9810: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
9820: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20    case ENOENT:. 
9830: 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20   case ESTALE:.  
9840: 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20  case ENOSYS:.   
9850: 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64   /* these should
9860: 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e   force the clien
9870: 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66  t to close the f
9880: 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63  ile and reconnec
9890: 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61  t */.    .  defa
98a0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
98b0: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
98c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
98d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
98e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
98f0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
9900: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
9910: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
9920: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
9930: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
9940: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
9950: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
9960: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
9970: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
9980: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
9990: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
99a0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
99b0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
99c0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
99d0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
99e0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
99f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9a00: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
9a10: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
9a20: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
9a30: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
9a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
9a50: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
9a60: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
9a70: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
9a80: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
9a90: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
9aa0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
9ab0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
9ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9ad0: 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   );.  enterMutex
9ae0: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
9af0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
9b00: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
9b10: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
9b20: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
9b30: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
9b40: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
9b50: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
9b60: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
9b70: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
9b80: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
9b90: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
9ba0: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
9bb0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
9bc0: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
9bd0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
9be0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9bf0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
9c00: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
9c10: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
9c20: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
9c30: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
9c40: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
9c50: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9c60: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20  F_WRLCK;.    if 
9c70: 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69  (-1 == fcntl(pFi
9c80: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
9c90: 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20  &lock)) {.      
9ca0: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
9cb0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
9cc0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9cd0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9ce0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
9cf0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
9d00: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
9d10: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9d20: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
9d30: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
9d40: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
9d50: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9d60: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61    }.  }.  .  lea
9d70: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
9d80: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
9d90: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
9da0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
9db0: 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
9dc0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
9dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9de0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
9df0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
9e00: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
9e10: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
9e20: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
9e30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9e40: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
9e50: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
9e60: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
9e70: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
9e80: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
9e90: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
9ea0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
9eb0: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
9ec0: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
9ed0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
9ee0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
9ef0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
9f00: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
9f10: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
9f20: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
9f30: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
9f40: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
9f50: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
9f60: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
9f70: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
9f80: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
9f90: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
9fa0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
9fb0: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
9fc0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
9fd0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
9fe0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
9ff0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
a000: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
a010: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a020: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
a030: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
a040: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a050: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
a060: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a070: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
a080: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
a090: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
a0a0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
a0b0: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
a0c0: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
a0d0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
a0e0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
a0f0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a110: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
a120: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
a130: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54  ocktype){.  /* T
a140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
a150: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
a160: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
a170: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
a180: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
a190: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
a1a0: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
a1b0: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
a1c0: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
a1d0: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
a1e0: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
a1f0: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
a200: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
a210: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
a220: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
a230: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
a240: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
a250: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
a260: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
a270: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
a280: 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73  ble with windows
a290: 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61   systems simulta
a2a0: 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63  neously.  ** acc
a2b0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
a2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
a2d0: 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65  n case that is e
a2e0: 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20  ver required..  
a2f0: 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20  **.  ** Symbols 
a300: 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20  defined in os.h 
a310: 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70  indentify the 'p
a320: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64  ending byte' and
a330: 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20   the 'reserved. 
a340: 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20   ** byte', each 
a350: 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20  single bytes at 
a360: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
a370: 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61  ts, and the 'sha
a380: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
a390: 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66  nge', a range of
a3a0: 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20   510 bytes at a 
a3b0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
a3c0: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  t..  **.  ** To 
a3d0: 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
a3e0: 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63  lock, a read-loc
a3f0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e  k is obtained on
a400: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20   the 'pending.  
a410: 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68  ** byte'.  If th
a420: 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
a430: 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  , a random byte 
a440: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
a450: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a460: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
a470: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
a480: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
a490: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  te' released..  
a4a0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a4b0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a4c0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
a4d0: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
a4e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
a4f0: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
a500: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
a510: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
a520: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
a530: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
a540: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
a550: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
a560: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
a570: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
a580: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
a590: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
a5a0: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
a5b0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
a5c0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
a5d0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
a5e0: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
a5f0: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
a600: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
a610: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
a620: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
a630: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
a640: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
a650: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
a660: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
a670: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
a680: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
a690: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a6a0: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
a6b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
a6c0: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
a6d0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
a6e0: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
a6f0: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
a700: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
a710: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
a720: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
a730: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
a740: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
a750: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
a760: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
a770: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
a780: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
a790: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
a7a0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
a7b0: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
a7c0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
a7d0: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
a7e0: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
a7f0: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
a800: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
a810: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
a820: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
a830: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
a840: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
a850: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73  **.  ** The reas
a860: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  on a single byte
a870: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
a880: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27  instead of the '
a890: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
a8a0: 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20   range' is that 
a8b0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
a8c0: 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20   windows do not 
a8d0: 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63  support read-loc
a8e0: 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ks. By.  ** lock
a8f0: 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ing a random byt
a900: 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20  e from a range, 
a910: 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45  concurrent SHARE
a920: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73  D locks may exis
a930: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  t.  ** even if t
a940: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  he locking primi
a950: 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77  tive used is alw
a960: 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ays a write-lock
a970: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ..  */.  int rc 
a980: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
a990: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a9a0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a9b0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
a9c0: 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  o *pLock = pFile
a9d0: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63  ->pLock;.  struc
a9e0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
a9f0: 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74  int s;..  assert
aa00: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
aa10: 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25  RACE7("LOCK    %
aa20: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
aa30: 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  d) pid=%d\n", pF
aa40: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f  ile->h,.      lo
aa50: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
aa60: 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  ype), locktypeNa
aa70: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
aa80: 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  pe),.      lockt
aa90: 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c  ypeName(pLock->l
aaa0: 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d  ocktype), pLock-
aab0: 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29  >cnt , getpid())
aac0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
aad0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
aae0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
aaf0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
ab00: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
ab10: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
ab20: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
ab30: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
ab40: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
ab50: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61   enterMutex() ha
ab60: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
ab70: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
ab80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ab90: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
aba0: 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
abb0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
abc0: 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
abd0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
abe0: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
abf0: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
ac00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ac10: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
ac20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
ac30: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
ac40: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
ac50: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ac60: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
ac70: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
ac80: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
ac90: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
aca0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
acb0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
acc0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
acd0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
ace0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
acf0: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
ad00: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ad10: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
ad20: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
ad30: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
ad40: 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   */.  enterMutex
ad50: 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ();..  /* Make s
ad60: 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ure the current 
ad70: 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20  thread owns the 
ad80: 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pFile..  */.  rc
ad90: 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72   = transferOwner
ada0: 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69  ship(pFile);.  i
adb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
adc0: 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74   ){.    leaveMut
add0: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
ade0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
adf0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
ae00: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
ae10: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
ae20: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
ae30: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
ae40: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
ae50: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
ae60: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
ae70: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
ae80: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
ae90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
aea0: 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e!=pLock->lockty
aeb0: 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  pe && .         
aec0: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
aed0: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
aee0: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  || locktype>SHAR
aef0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
af00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
af10: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
af20: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
af30: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
af40: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
af50: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
af60: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
af70: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
af80: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
af90: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
afa0: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
afb0: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
afc0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
afd0: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
afe0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
aff0: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
b000: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
b010: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b020: 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  || pLock->lockty
b030: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
b040: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
b050: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
b060: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
b070: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
b080: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
b090: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b0a0: 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  cnt>0 );.    pFi
b0b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
b0c0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
b0d0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
b0e0: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
b0f0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
b100: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
b110: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
b120: 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68  1L;..  lock.l_wh
b130: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b140: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
b150: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
b160: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
b170: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
b180: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
b190: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
b1a0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
b1b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
b1c0: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
b1d0: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
b1e0: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
b1f0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b200: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
b210: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
b220: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
b230: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
b240: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
b250: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
b260: 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  = (locktype==SHA
b270: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
b280: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
b290: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
b2a0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
b2b0: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
b2c0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
b2d0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
b2e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  (-1) ){.      in
b2f0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
b300: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b310: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b320: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b330: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b340: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
b350: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b360: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
b370: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
b380: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
b390: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b3a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
b3b0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
b3c0: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
b3d0: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
b3e0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
b3f0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
b400: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
b410: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
b420: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
b430: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b440: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
b450: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t tErrno = 0;.  
b460: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b470: 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  >cnt==0 );.    a
b480: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
b490: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20  cktype==0 );..  
b4a0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
b4b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
b4c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b4d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b4e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b4f0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
b500: 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28   if( (s = fcntl(
b510: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b520: 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29  K, &lock))==(-1)
b530: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
b540: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
b550: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
b560: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
b570: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
b580: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
b590: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
b5a0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
b5b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
b5c0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
b5d0: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
b5e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b5f0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  k)!=0 ){.      i
b600: 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20  f( s != -1 ){.  
b610: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
b620: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
b630: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
b640: 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  */.        tErrn
b650: 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20  o = errno; .    
b660: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b670: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b680: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b690: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
b6a0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
b6b0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
b6c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
b6d0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b6e0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
b6f0: 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
b700: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  nd_lock;.      }
b710: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
b720: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b730: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b740: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b750: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b760: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
b770: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b780: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b790: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b7a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
b7b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
b7c0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b7d0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
b7e0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
b7f0: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
b800: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
b810: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
b820: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
b830: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
b840: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
b850: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
b860: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
b870: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
b880: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
b890: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
b8a0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
b8b0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
b8c0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
b8d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
b8e0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
b8f0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
b900: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
b910: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
b920: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
b930: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
b940: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
b950: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
b960: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
b970: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
b980: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
b990: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
b9a0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
b9b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b9c0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
b9d0: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
b9e0: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
b9f0: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
ba00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ba10: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
ba20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ba30: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
ba40: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
ba50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ba60: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ba70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
ba80: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ba90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
baa0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
bab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
bac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
bad0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
bae0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
baf0: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
bb00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
bb10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bb20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
bb30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
bb40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
bb50: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
bb60: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
bb70: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
bb80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bb90: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
bba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bbb0: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
bbc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bbd0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
bbe0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
bbf0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
bc00: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
bc10: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
bc20: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
bc30: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
bc40: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
bc50: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  NG_LOCK;.    pLo
bc60: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  ck->locktype = P
bc70: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
bc80: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65  ..end_lock:.  le
bc90: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
bca0: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
bcb0: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
bcc0: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
bcd0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
bce0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
bcf0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
bd00: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
bd10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
bd20: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
bd30: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
bd40: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
bd50: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
bd60: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
bd70: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
bd80: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
bd90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
bda0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
bdb0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
bdc0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
bdd0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
bde0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
bdf0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
be00: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
be10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
be20: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
be30: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
be40: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74   locktype){.  st
be50: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
be60: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
be70: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
be80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
be90: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bea0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
beb0: 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  id;.  int h;..  
bec0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
bed0: 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c  .  OSTRACE7("UNL
bee0: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
bef0: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c  d(%d,%d) pid=%d\
bf00: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bf10: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46  cktype,.      pF
bf20: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
bf30: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
bf40: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
bf50: 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
bf60: 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
bf70: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
bf80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bf90: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
bfa0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
bfb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bfc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
bfd0: 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
bfe0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
bff0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
c000: 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28   }.  enterMutex(
c010: 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e  );.  h = pFile->
c020: 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69  h;.  pLock = pFi
c030: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73  le->pLock;.  ass
c040: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21  ert( pLock->cnt!
c050: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
c060: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
c070: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
c080: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
c090: 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c  cktype==pFile->l
c0a0: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53  ocktype );.    S
c0b0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
c0c0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
c0d0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
c0e0: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
c0f0: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
c100: 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  (0);.    if( loc
c110: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
c120: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
c130: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
c140: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
c150: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c160: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c170: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
c180: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
c190: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
c1a0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
c1b0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
c1c0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
c1d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
c1e0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
c1f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c200: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
c210: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
c220: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
c230: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
c240: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
c250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
c260: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c270: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
c280: 20 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f   }.....goto end_
c290: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  unlock;.      }.
c2a0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
c2b0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
c2c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
c2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c2f0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c300: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c310: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
c320: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
c330: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
c340: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
c350: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
c360: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70  =(-1) ){.      p
c370: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c380: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c3a0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
c3b0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c3c0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c3d0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
c3f0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
c400: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
c410: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
c420: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c430: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
c440: 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f  ...goto end_unlo
c450: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
c460: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
c470: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72  _LOCK ){.    str
c480: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
c490: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
c4a0: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
c4b0: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
c4c0: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
c4d0: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
c4e0: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
c4f0: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
c500: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
c510: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
c520: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
c530: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
c540: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
c550: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
c560: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
c570: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c580: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
c590: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c5a0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
c5b0: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
c5c0: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69  n = 0L;.      Si
c5d0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c5e0: 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
c5f0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
c600: 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
c610: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c620: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
c630: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
c640: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
c650: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
c660: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
c670: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
c680: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
c690: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c6a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c6b0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c6c0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c6d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c6e0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
c6f0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
c700: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
c710: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c720: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
c730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
c740: 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09  ck->cnt = 1;....
c750: 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b  .goto end_unlock
c760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c770: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
c780: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
c790: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
c7a0: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
c7b0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
c7c0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
c7d0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
c7e0: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
c7f0: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
c800: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
c810: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
c820: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
c830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c840: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c850: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  .      pOpen = p
c860: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
c870: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
c880: 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
c890: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
c8a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
c8b0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26  pen->nLock==0 &&
c8c0: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
c8d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
c8e0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
c8f0: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
c900: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
c910: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70           close(p
c920: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
c930: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c950: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
c960: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ng);.        pOp
c970: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
c980: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
c990: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
c9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c9b0: 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  ...end_unlock:. 
c9c0: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
c9d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c9e0: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
c9f0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
ca00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ca10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ca20: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
ca30: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
ca40: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
ca50: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
ca60: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
ca70: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
ca80: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
ca90: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
caa0: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
cab0: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
cac0: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
cad0: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
cae0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
caf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
cb00: 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
cb10: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
cb20: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
cb30: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
cb40: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b  ;.  if( pFile ){
cb50: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
cb60: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
cb70: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64    close(pFile->d
cb80: 69 72 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  irfd);.    }.   
cb90: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
cba0: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
cbb0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d  pFile->h);.    }
cbc0: 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 43  .    OSTRACE2("C
cbd0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
cbe0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f  pFile->h);.    O
cbf0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
cc00: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
cc10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
cc20: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
cc30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cc40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
cc50: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
cc60: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
cc70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
cc80: 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
cc90: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
cca0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
ccb0: 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f  id;.    unixUnlo
ccc0: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
ccd0: 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28  .    enterMutex(
cce0: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
ccf0: 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65  ->pOpen && pFile
cd00: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
cd10: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
cd20: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
cd30: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
cd40: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
cd50: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
cd60: 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
cd70: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
cd80: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
cd90: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
cda0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
cdb0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
cdc0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e  pOpen->aPending.
cdd0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
cde0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
cdf0: 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
ce00: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
ce10: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
ce20: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  */.      int *aN
ce30: 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ew;.      struct
ce40: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20   openCnt *pOpen 
ce50: 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
ce60: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
ce70: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70  ite3_realloc(pOp
ce80: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70  en->aPending, (p
ce90: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31  Open->nPending+1
cea0: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
ceb0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
cec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
ced0: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   If a malloc fai
cee0: 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68  ls, just leak th
cef0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
cf00: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  r */.      }else
cf10: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  {.        pOpen-
cf20: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
cf30: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
cf40: 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d  >aPending[pOpen-
cf50: 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69  >nPending] = pFi
cf60: 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70  le->h;.        p
cf70: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
cf80: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
cf90: 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  >h = -1;.      }
cfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
cfb0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
cfc0: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
cfd0: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
cfe0: 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
cff0: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
d000: 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65  );.    leaveMute
d010: 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
d020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d030: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
d040: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
d050: 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46  .#pragma mark AF
d060: 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a  P Support../*. *
d070: 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
d080: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
d090: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
d0a0: 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
d0b0: 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64   state. */.typed
d0c0: 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63  ef struct afpLoc
d0d0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c  kingContext afpL
d0e0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
d0f0: 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
d100: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69  Context {.  unsi
d110: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
d120: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20  haredLockByte;. 
d130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
d140: 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75 63  ePath;.};..struc
d150: 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
d160: 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
d170: 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
d180: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
d190: 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
d1a0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
d1b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
d1c0: 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
d1d0: 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
d1e0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
d1f0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
d200: 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
d210: 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
d220: 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
d230: 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
d240: 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
d250: 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
d260: 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
d270: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
d280: 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
d290: 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
d2a0: 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
d2b0: 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
d2c0: 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
d2d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
d2f0: 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
d300: 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
d310: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
d320: 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
d330: 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
d340: 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
d350: 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
d360: 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a 20 2a 2a  ockPB2)../* . **
d370: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d380: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
d390: 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
d3a0: 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  lure.. */.static
d3b0: 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74 4c 6f   int _AFPFSSetLo
d3c0: 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
d3d0: 20 2a 70 61 74 68 2c 20 0a 20 20 75 6e 69 78 46   *path, .  unixF
d3e0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 75  ile *pFile, .  u
d3f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d400: 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 75 6e 73  g offset, .  uns
d410: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
d420: 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e 74 20 73  length, .  int s
d430: 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a 20 20  etLockFlag.){.  
d440: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
d450: 4c 6f 63 6b 50 42 32 20 20 20 20 20 20 20 70 62  LockPB2       pb
d460: 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20 20 20  ;.  int         
d470: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 3b              err;
d480: 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
d490: 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
d4a0: 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
d4b0: 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
d4c0: 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
d4d0: 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
d4e0: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
d4f0: 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
d500: 68 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 41  h;.  OSTRACE5("A
d510: 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67 20 6c  FPLOCK setting l
d520: 6f 63 6b 20 25 73 20 66 6f 72 20 25 64 20 69 6e  ock %s for %d in
d530: 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
d540: 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
d550: 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
d560: 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 66  "), pFile->h, of
d570: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
d580: 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
d590: 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
d5a0: 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
d5b0: 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
d5c0: 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
d5d0: 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
d5e0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d5f0: 20 4f 53 54 52 41 43 45 34 28 22 41 46 50 4c 4f   OSTRACE4("AFPLO
d600: 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
d610: 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
d620: 6e 22 2c 20 70 61 74 68 2c 20 74 45 72 72 6e 6f  n", path, tErrno
d630: 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
d640: 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  o));.    rc = sq
d650: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d660: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d670: 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
d680: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
d690: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
d6a0: 4e 4c 4f 43 4b 29 3b 20 2f 2a 20 65 72 72 6f 72  NLOCK); /* error
d6b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
d6c0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
d6d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
d6e0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
d700: 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
d710: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d720: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
d730: 2a 20 41 46 50 2d 73 74 79 6c 65 20 72 65 73 65  * AFP-style rese
d740: 72 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69  rved lock checki
d750: 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ng following the
d760: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a   behavior of .**
d770: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
d780: 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20  edLock, see the 
d790: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
d7a0: 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63  dLock function c
d7b0: 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69  omments */.stati
d7c0: 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
d7d0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
d7e0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d7f0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
d800: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d810: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
d820: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
d830: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
d840: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
d850: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
d860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d870: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
d880: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
d890: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d8a0: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
d8b0: 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
d8c0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d8d0: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
d8e0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
d8f0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
d900: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
d910: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
d920: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
d930: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
d940: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d950: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
d960: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
d970: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
d980: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
d990: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
d9a0: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
d9b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
d9c0: 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
d9d0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
d9e0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
d9f0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
da00: 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
da10: 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
da20: 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
da30: 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
da40: 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
da50: 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
da60: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
da70: 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
da80: 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
da90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
daa0: 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
dab0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
dac0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
dad0: 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
dae0: 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
daf0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
db00: 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
db10: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
db20: 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
db30: 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
db40: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
db50: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
db60: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
db70: 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
db80: 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
db90: 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
dba0: 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
dbb0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
dbc0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
dbd0: 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52 65  rved);.  .  *pRe
dbe0: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
dbf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dc00: 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c 6f  ./* AFP-style lo
dc10: 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
dc20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
dc30: 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74 68  unixLock, see th
dc40: 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20 66  e unixLock .** f
dc50: 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  unction comments
dc60: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66 20   for details of 
dc70: 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74 2e  lock management.
dc80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
dc90: 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
dca0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
dcb0: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
dcc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
dcd0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
dce0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
dcf0: 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
dd00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
dd10: 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
dd20: 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
dd30: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
dd40: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
dd50: 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c  );.  OSTRACE5("L
dd60: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
dd70: 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
dd80: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
dd90: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
dda0: 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
ddb0: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
ddc0: 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64 28  cktype), getpid(
ddd0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
dde0: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
ddf0: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
de00: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
de10: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
de20: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
de30: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
de40: 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
de50: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
de60: 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74 65  s.  ** enterMute
de70: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
de80: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
de90: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
dea0: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
deb0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33   ){.    OSTRACE3
dec0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
ded0: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
dee0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
def0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
df00: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
df10: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
df20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
df30: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
df40: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
df50: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
df60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
df70: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
df80: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
df90: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
dfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
dfb0: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
dfc0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
dfd0: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
dfe0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
dff0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
e000: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
e010: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
e020: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
e030: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
e040: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
e050: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e 74  reads.  */.  ent
e060: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
e070: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
e080: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
e090: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
e0a0: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
e0b0: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
e0c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
e0d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c  LITE_OK ){.    l
e0e0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
e0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e100: 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
e110: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
e120: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
e130: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
e140: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
e150: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
e160: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
e170: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
e180: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
e190: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
e1a0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
e1b0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
e1c0: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
e1d0: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
e1e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
e1f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
e200: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
e210: 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
e220: 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
e230: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e240: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e250: 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
e260: 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
e270: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
e280: 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
e290: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
e2a0: 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
e2b0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
e2c0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
e2d0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
e2e0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
e2f0: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
e300: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
e310: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
e320: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
e330: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
e340: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
e350: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20   ){.    int lk, 
e360: 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
e370: 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20 20 20 20  Errno;.    .    
e380: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
e390: 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
e3a0: 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
e3b0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
e3c0: 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
e3d0: 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
e3e0: 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
e3f0: 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
e400: 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65  om(); .    conte
e410: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
e420: 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66  te = (lk & 0x7ff
e430: 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
e440: 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
e450: 63 31 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  c1 = _AFPFSSetLo
e460: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e470: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
e480: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
e490: 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68  IRST+context->sh
e4a0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
e4b0: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
e4c0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
e4d0: 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
e4e0: 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
e4f0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
e500: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
e510: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
e520: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
e530: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e540: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e550: 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
e560: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
e570: 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
e580: 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
e590: 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
e5a0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
e5b0: 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
e5c0: 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
e5d0: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
e5e0: 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
e5f0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
e600: 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
e610: 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
e620: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
e630: 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
e640: 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
e650: 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
e660: 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
e670: 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
e680: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
e690: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
e6a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e6b0: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
e6c0: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
e6d0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
e6e0: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
e6f0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
e700: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
e710: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
e720: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
e730: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
e740: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
e750: 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
e760: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63  t( 0!=pFile->loc
e770: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20  ktype );.    if 
e780: 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53  (locktype >= RES
e790: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
e7a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20  ile->locktype < 
e7b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
e7c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
e7d0: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
e7e0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
e7f0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e800: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e810: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
e820: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
e830: 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
e840: 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
e850: 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
e860: 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
e870: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
e880: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
e890: 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
e8a0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e8b0: 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
e8c0: 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
e8d0: 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
e8e0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
e8f0: 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
e900: 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
e910: 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
e920: 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
e930: 0a 20 20 20 20 20 20 69 66 20 28 21 28 66 61 69  .      if (!(fai
e940: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
e950: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
e960: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  ePath, pFile, SH
e970: 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
e9a0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
e9b0: 2c 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20 20  , 0))) {.       
e9c0: 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
e9d0: 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
e9e0: 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
e9f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
ea00: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
ea10: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
ea20: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
ea30: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
ea60: 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
ea70: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20 26      if (failed &
ea80: 26 20 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  & (failed = _AFP
ea90: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
eaa0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
eab0: 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
ead0: 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65  ED_FIRST + conte
eae0: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
eaf0: 74 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a 20 20  te, 1, 1))) {.  
eb00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
eb10: 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
eb20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
eb30: 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
eb40: 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
eb50: 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
eb60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
eb70: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
eb80: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
eb90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
eba0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
ebb0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
ebc0: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
ebd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
ebe0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
ebf0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
ec00: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
ec10: 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65  p_end_lock:.  le
ec20: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
ec30: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
ec40: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
ec50: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
ec60: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
ec70: 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
ec80: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
ec90: 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74  "failed");.  ret
eca0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ecb0: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
ecc0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
ecd0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
ece0: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
ecf0: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
ed00: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ed10: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
ed20: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
ed30: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
ed40: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ed50: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
ed60: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
ed70: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
ed80: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
ed90: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
eda0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
edb0: 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
edc0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
edd0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
ede0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
edf0: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
ee00: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ee10: 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
ee20: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
ee30: 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
ee40: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
ee50: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
ee60: 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  xt;..  assert( p
ee70: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
ee80: 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
ee90: 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
eea0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
eeb0: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
eec0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eed0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
eee0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
eef0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ef00: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
ef10: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
ef20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ef30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ef40: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
ef50: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
ef60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ef70: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74  ISUSE;.  }.  ent
ef80: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 6e 74  erMutex();.  int
ef90: 20 66 61 69 6c 65 64 20 3d 20 53 51 4c 49 54 45   failed = SQLITE
efa0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  _OK;.  if( pFile
efb0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
efc0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66  D_LOCK ){.    if
efd0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
efe0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  ED_LOCK ){..    
eff0: 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65 20    /* unlock the 
f000: 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20  exclusive range 
f010: 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62 6c  - then re-establ
f020: 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
f030: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66 20  ock */.      if 
f040: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
f050: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f060: 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69 6c  ) {.        fail
f070: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
f080: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
f090: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
f0a0: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
f0d0: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
f0e0: 20 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65        if (!faile
f0f0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d) {.          /
f100: 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  * successfully r
f110: 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75  emoved the exclu
f120: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  sive lock */.   
f130: 20 20 20 20 20 20 20 69 66 20 28 28 66 61 69 6c         if ((fail
f140: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
f150: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
f160: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
f170: 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20  RED_FIRST+.     
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
f1a0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
f1b0: 31 2c 20 31 29 29 29 20 7b 0a 20 20 20 20 20 20  1, 1))) {.      
f1c0: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20        /* failed 
f1d0: 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  to re-establish 
f1e0: 6f 75 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  our shared lock 
f1f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
f200: 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
f210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f220: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
f230: 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
f240: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
f250: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
f260: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
f270: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
f280: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
f290: 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 28  K) {.      if ((
f2a0: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
f2b0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
f2c0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
f2d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
f300: 2c 20 31 2c 20 30 29 29 29 7b 0a 20 20 20 20 20  , 1, 0))){.     
f310: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
f320: 72 65 6c 65 61 73 65 20 74 68 65 20 70 65 6e 64  release the pend
f330: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ing lock */.    
f340: 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
f350: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20   .      }.    } 
f360: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
f370: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
f380: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
f390: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
f3a0: 20 20 20 20 69 66 20 28 28 66 61 69 6c 65 64 20      if ((failed 
f3b0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
f3c0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
f3d0: 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45 53               RES
f400: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
f410: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ))) {.        /*
f420: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61   failed to relea
f430: 73 65 20 74 68 65 20 72 65 73 65 72 76 65 64 20  se the reserved 
f440: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
f450: 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a 20  rc = failed;  . 
f460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20       }.    } .  
f470: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
f480: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
f490: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
f4a0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
f4b0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
f4c0: 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
f4f0: 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73 68  ST + context->sh
f500: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
f510: 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   0);.    if (fai
f520: 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
f530: 3d 20 66 61 69 6c 65 64 3b 20 20 0a 20 20 20 20  = failed;  .    
f540: 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d  }.  }.  if (rc =
f550: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  = SQLITE_OK).   
f560: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f570: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 6c   = locktype;.  l
f580: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
f590: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f5a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
f5b0: 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
f5c0: 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
f5d0: 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
f5e0: 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
f5f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f600: 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
f610: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
f620: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f630: 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
f640: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
f650: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f660: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
f670: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72  ontext);.  }.  r
f680: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
f690: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 23 70 72  ile(id);.}...#pr
f6a0: 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28  agma mark flock(
f6b0: 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ) style locking.
f6c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c 6f 63 6b  ./*.** The flock
f6d0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  LockingContext i
f6e0: 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f 0a 74 79  s not used.*/.ty
f6f0: 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b  pedef void flock
f700: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
f710: 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74 79 6c 65 20  ./* flock-style 
f720: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68  reserved lock ch
f730: 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ecking following
f740: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
f750: 20 0a 20 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52   . ** unixCheckR
f760: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65  eservedLock, see
f770: 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65   the unixCheckRe
f780: 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74  servedLock funct
f790: 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  ion comments */.
f7a0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
f7b0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f7c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f7d0: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f7e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f7f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
f800: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
f810: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
f820: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
f830: 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
f840: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
f850: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
f860: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
f870: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
f880: 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
f890: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
f8a0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
f8b0: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
f8c0: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
f8d0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
f8e0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
f8f0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
f900: 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
f910: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
f920: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
f930: 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
f940: 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
f950: 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
f960: 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
f970: 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63    int lrc = floc
f980: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
f990: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
f9a0: 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
f9b0: 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
f9c0: 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
f9d0: 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
f9e0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f9f0: 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
fa00: 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
fa10: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
fa20: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
fa30: 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
fa40: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
fa50: 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
fa60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fa70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fa80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fa90: 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  UNLOCK); .      
faa0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
fab0: 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
fac0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
fad0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
fae0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
faf0: 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
fb00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
fb10: 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
fb20: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fb30: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
fb40: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
fb50: 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
fb60: 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
fb70: 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
fb80: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
fb90: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
fba0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
fbb0: 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
fbc0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
fbd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
fbe0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
fbf0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
fc00: 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
fc10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
fc20: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
fc30: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
fc40: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
fc50: 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70  reserved);..  *p
fc60: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
fc70: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
fc80: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  }..static int fl
fc90: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
fca0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
fcb0: 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
fcc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fcd0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fce0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fcf0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
fd00: 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
fd10: 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
fd20: 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
fd30: 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
fd40: 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
fd50: 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
fd60: 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
fd70: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
fd80: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
fd90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
fda0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
fdb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fdc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
fdd0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
fde0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
fdf0: 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65   if (flock(pFile
fe00: 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
fe10: 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
fe20: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
fe30: 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
fe40: 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
fe50: 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
fe60: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
fe70: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
fe80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
fe90: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
fea0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
feb0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
fec0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
fed0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
fee0: 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
fef0: 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
ff00: 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
ff10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
ff20: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
ff30: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
ff40: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
ff50: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
ff60: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
ff70: 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20  ktype), .       
ff80: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
ff90: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
ffa0: 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
ffb0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
ffc0: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
ffd0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
ffe0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
fff0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10000 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10010 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
10020 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
10030 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
10040 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
10050 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
10060 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
10070 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10080 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  pe, getpid());. 
10090 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
100a0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
100b0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
100c0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
100d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
100e0 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29  type==locktype )
100f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10100 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
10110 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
10120 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
10130 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
10140 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
10150 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65  /.  if (locktype
10160 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
10170 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
10180 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
10190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
101a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
101b0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
101c0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20  nlock. */.  int 
101d0 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
101e0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
101f0 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69   if (rc) {.    i
10200 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65  nt r, tErrno = e
10210 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71  rrno;.    r = sq
10220 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10230 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10240 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10250 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
10260 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29  _LOCK_ERROR(r) )
10270 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
10280 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10290 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
102a0 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20  urn r;.  } else 
102b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
102c0 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
102d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
102f0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
10300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10310 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
10320 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10330 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66   if( id ){.    f
10340 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
10350 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  O_LOCK);.  }.  r
10360 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
10370 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 70 72 61  ile(id);.}..#pra
10380 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68  gma mark Old-Sch
10390 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62  ool .lock file b
103a0 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a  ased locking../*
103b0 20 44 6f 74 6c 6f 63 6b 2d 73 74 79 6c 65 20 72   Dotlock-style r
103c0 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65  eserved lock che
103d0 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
103e0 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
103f0 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73  .** unixCheckRes
10400 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74  ervedLock, see t
10410 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  he unixCheckRese
10420 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f  rvedLock functio
10430 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74  n comments */.st
10440 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10450 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10460 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10470 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
10480 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
10490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
104a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
104b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
104c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
104d0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
104e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
104f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10500 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10510 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10520 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
10530 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
10540 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
10550 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
10560 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
10570 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
10580 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
10590 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
105a0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
105b0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
105c0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
105d0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
105e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 63 68 61  erved ){.    cha
105f0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
10600 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
10610 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
10620 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
10630 61 74 42 75 66 3b 0a 20 20 20 20 0a 20 20 20 20  atBuf;.    .    
10640 69 66 28 20 6c 73 74 61 74 28 7a 4c 6f 63 6b 46  if( lstat(zLockF
10650 69 6c 65 2c 20 26 73 74 61 74 42 75 66 29 3d 3d  ile, &statBuf)==
10660 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 66 69  0 ){.      /* fi
10670 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d 65 6f  le exists, someo
10680 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
10690 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 65  lock */.      re
106a0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
106b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
106c0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
106d0 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61  ist, we could ha
106e0 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
106f0 20 69 74 20 2a 2f 0a 09 09 09 69 6e 74 20 74 45   it */....int tE
10700 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10710 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
10720 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
10730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10740 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10750 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10760 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
10770 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
10780 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10790 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
107a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
107b0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53  .  OSTRACE4("TES
107c0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
107d0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
107e0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
107f0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
10800 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
10810 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
10820 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
10830 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10840 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
10850 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10860 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10870 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  id;.  int fd;.  
10880 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10890 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
108a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
108b0 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c 49 54 45  .  int rc=SQLITE
108c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
108d0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
108e0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
108f0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
10900 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
10910 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
10920 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
10930 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
10940 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
10950 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10960 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10970 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73    .    /* Always
10980 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10990 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
109a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69   file */.    uti
109b0 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
109c0 55 4c 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ULL);.    rc = S
109d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
109e0 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c  to dotlock_end_l
109f0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
10a00 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
10a10 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
10a20 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 73  dy exists */.  s
10a30 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42  truct stat statB
10a40 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74 28  uf;.  if (lstat(
10a50 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73 74 61 74 42  zLockFile,&statB
10a60 75 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72  uf) == 0){.    r
10a70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
10a80 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75 73   /* it does, bus
10a90 79 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 64 6f  y */.    goto do
10aa0 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  tlock_end_lock;.
10ab0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
10ac0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10ad0 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  ck */.  fd = ope
10ae0 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
10af0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
10b00 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
10b10 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
10b20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10b30 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
10b40 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10b50 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10b60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10b70 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10b80 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10b90 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10ba0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10bb0 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10bc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10bd0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10be0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10bf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
10c10 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10c20 7b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  {..pFile->lastEr
10c30 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10c50 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64  goto dotlock_end
10c60 5f 6c 6f 63 6b 3b 0a 20 20 7d 20 0a 20 20 63 6c  _lock;.  } .  cl
10c70 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2a  ose(fd);.  .  /*
10c80 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
10c90 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
10ca0 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
10cb0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
10cc0 79 70 65 3b 0a 0a 20 64 6f 74 6c 6f 63 6b 5f 65  ype;.. dotlock_e
10cd0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
10ce0 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
10cf0 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
10d00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10d10 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10d20 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10d30 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10d40 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
10d50 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
10d60 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
10d70 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
10d80 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10d90 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
10da0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
10db0 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
10dc0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20  >h, locktype,.. 
10dd0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10de0 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  e, getpid());.  
10df0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
10e00 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10e10 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
10e20 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
10e30 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
10e40 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
10e50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10e60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
10e70 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
10e80 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
10e90 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
10ea0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
10eb0 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
10ec0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
10ed0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
10ee0 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
10ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10f10 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
10f20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 75  lock. */.  if (u
10f30 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
10f40 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
10f50 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10f60 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20  .    if( ENOENT 
10f70 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
10f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
10f90 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10fa0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10fb0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
10fc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10fd0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10fe0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10ff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11000 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
11010 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
11020 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
11030 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
11040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11050 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
11060 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
11070 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
11080 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11090 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
110a0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
110b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
110c0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
110d0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
110e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
110f0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11100 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
11110 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c  .  }.  return cl
11120 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
11130 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}...#endif /* S
11140 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11150 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
11160 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c  *.** The nolockL
11170 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
11180 20 76 6f 69 64 0a 2a 2f 0a 74 79 70 65 64 65 66   void.*/.typedef
11190 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   void nolockLock
111a0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61  ingContext;..sta
111b0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68  tic int nolockCh
111c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
111d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
111e0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
111f0 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  {.  *pResOut = 0
11200 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11210 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
11220 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73  int nolockLock(s
11230 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11240 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
11250 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11260 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
11270 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  nt nolockUnlock(
11280 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11290 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
112a0 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
112b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
112c0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
112d0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
112e0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
112f0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
11300 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
11310 65 28 69 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  e(id);.}.../*.**
11320 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
11330 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
11340 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
11350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11360 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
11370 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11380 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
11390 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
113a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
113b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
113c0 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
113d0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
113e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
113f0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
11400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11420 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
11430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11440 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
11450 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
11460 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
11470 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
11480 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
11490 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
114a0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
114b0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
114c0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
114d0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
114e0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
114f0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
11500 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
11510 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
11520 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
11530 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
11540 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
11550 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
11560 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
11570 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
11580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
11590 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
115a0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
115b0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
115c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
115d0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
115e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
115f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11600 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
11610 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
11620 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
11630 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
11640 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54   for the file. T
11650 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 2e  his is always 0.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11670 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
11680 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
11690 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  _file *id){.  re
116a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
116b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
116c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
116d0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
116e0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
116f0 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   pId..**.** When
11700 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69   locking extensi
11710 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c  ons are enabled,
11720 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e   the filepath an
11730 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  d locking style 
11740 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20 74  .** are needed t
11750 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
11760 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f 64  unixFile pMethod
11770 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b   to use for lock
11780 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
11790 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73  ** The locking-s
117a0 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 6c 6f  tyle specific lo
117b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 61 74  ckingContext dat
117c0 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  a structure is c
117d0 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64 20 61  reated .** and a
117e0 73 73 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73  ssigned here als
117f0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
11800 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
11810 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11820 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
11830 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
11840 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
11870 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
11880 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
11890 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20  .  int dirfd,   
118a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
118b0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
118c0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
118d0 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
118e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
118f0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
11900 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
11910 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
11920 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
11930 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
11940 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
11950 69 6e 74 20 6e 6f 4c 6f 63 6b 20 20 20 20 20 20  int noLock      
11960 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20          /* Omit 
11970 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20  locking if true 
11980 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 4c 6f 63  */.){.  int eLoc
11990 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
119a0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
119b0 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
119c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
119d0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 63 72 6f  _OK;..  /* Macro
119e0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 73   to define the s
119f0 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73 20 6f  tatic contents o
11a00 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6f 5f  f an sqlite3_io_
11a10 6d 65 74 68 6f 64 73 20 0a 20 20 2a 2a 20 73 74  methods .  ** st
11a20 72 75 63 74 75 72 65 20 66 6f 72 20 61 20 75 6e  ructure for a un
11a30 69 78 20 62 61 63 6b 65 6e 64 20 66 69 6c 65 2e  ix backend file.
11a40 20 44 69 66 66 65 72 65 6e 74 20 6c 6f 63 6b 69   Different locki
11a50 6e 67 20 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20  ng methods.  ** 
11a60 72 65 71 75 69 72 65 20 64 69 66 66 65 72 65 6e  require differen
11a70 74 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  t functions for 
11a80 74 68 65 20 78 43 6c 6f 73 65 2c 20 78 4c 6f 63  the xClose, xLoc
11a90 6b 2c 20 78 55 6e 6c 6f 63 6b 20 61 6e 64 0a 20  k, xUnlock and. 
11aa0 20 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   ** xCheckReserv
11ab0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 73 2e 0a  edLock methods..
11ac0 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 49    */.  #define I
11ad0 4f 4d 45 54 48 4f 44 53 28 78 43 6c 6f 73 65 2c  OMETHODS(xClose,
11ae0 20 78 4c 6f 63 6b 2c 20 78 55 6e 6c 6f 63 6b 2c   xLock, xUnlock,
11af0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
11b00 6f 63 6b 29 20 7b 20 20 20 20 5c 0a 20 20 20 20  ock) {    \.    
11b10 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
11b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
11b30 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 20 20 20 5c 0a 20 20 20 20 78 43 6c 6f 73       \.    xClos
11b60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11b70 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
11b80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 5c 0a 20 20 20 20 75 6e 69 78 52 65 61 64 2c 20  \.    unixRead, 
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
11bf0 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c10 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
11c40 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
11c50 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
11c60 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 5c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c   \.    unixSync,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
11cd0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 4c 6f         \.    xLo
11d20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
11d30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
11d40 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 5c 0a 20 20 20 20 78 55 6e 6c 6f 63 6b 2c    \.    xUnlock,
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
11d90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
11db0 20 20 20 78 43 68 65 63 6b 52 65 73 65 72 76 65     xCheckReserve
11dc0 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 2f  dLock,         /
11dd0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
11de0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
11df0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
11e00 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
11e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
11e20 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 65 63     \.    unixSec
11e50 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
11e60 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
11e70 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
11e90 20 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68      unixDeviceCh
11ea0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20 20  aracteristics   
11eb0 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
11ec0 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
11ed0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 20           \.  }. 
11ee0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
11ef0 69 6f 5f 6d 65 74 68 6f 64 73 20 61 49 6f 4d 65  io_methods aIoMe
11f00 74 68 6f 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 49  thod[] = {.    I
11f10 4f 4d 45 54 48 4f 44 53 28 75 6e 69 78 43 6c 6f  OMETHODS(unixClo
11f20 73 65 2c 20 75 6e 69 78 4c 6f 63 6b 2c 20 75 6e  se, unixLock, un
11f30 69 78 55 6e 6c 6f 63 6b 2c 20 75 6e 69 78 43 68  ixUnlock, unixCh
11f40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29  eckReservedLock)
11f50 20 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28   .   ,IOMETHODS(
11f60 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 6e 6f 6c  nolockClose, nol
11f70 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b 55  ockLock, nolockU
11f80 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b 43 68 65  nlock, nolockChe
11f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a  ckReservedLock).
11fa0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
11fb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
11fc0 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28 64 6f     ,IOMETHODS(do
11fd0 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 64 6f 74 6c  tlockClose, dotl
11fe0 6f 63 6b 4c 6f 63 6b 2c 20 64 6f 74 6c 6f 63 6b  ockLock, dotlock
11ff0 55 6e 6c 6f 63 6b 2c 64 6f 74 6c 6f 63 6b 43 68  Unlock,dotlockCh
12000 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29  eckReservedLock)
12010 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28 66  .   ,IOMETHODS(f
12020 6c 6f 63 6b 43 6c 6f 73 65 2c 20 66 6c 6f 63 6b  lockClose, flock
12030 4c 6f 63 6b 2c 20 66 6c 6f 63 6b 55 6e 6c 6f 63  Lock, flockUnloc
12040 6b 2c 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  k, flockCheckRes
12050 65 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20 2c 49  ervedLock).   ,I
12060 4f 4d 45 54 48 4f 44 53 28 61 66 70 43 6c 6f 73  OMETHODS(afpClos
12070 65 2c 20 61 66 70 4c 6f 63 6b 2c 20 61 66 70 55  e, afpLock, afpU
12080 6e 6c 6f 63 6b 2c 20 61 66 70 43 68 65 63 6b 52  nlock, afpCheckR
12090 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6e  eservedLock).#en
120a0 64 69 66 0a 20 20 7d 3b 0a 20 20 2f 2a 20 54 68  dif.  };.  /* Th
120b0 65 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 49  e order of the I
120c0 4f 4d 45 54 48 4f 44 53 20 6d 61 63 72 6f 73 20  OMETHODS macros 
120d0 61 62 6f 76 65 20 69 73 20 69 6d 70 6f 72 74 61  above is importa
120e0 6e 74 2e 20 20 49 74 20 6d 75 73 74 20 62 65 20  nt.  It must be 
120f0 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6f 72  the.  ** same or
12100 64 65 72 20 61 73 20 74 68 65 20 4c 4f 43 4b 49  der as the LOCKI
12110 4e 47 5f 53 54 59 4c 45 20 6e 75 6d 62 65 72 73  NG_STYLE numbers
12120 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 4c  .  */.  assert(L
12130 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53  OCKING_STYLE_POS
12140 49 58 3d 3d 31 29 3b 0a 20 20 61 73 73 65 72 74  IX==1);.  assert
12150 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e  (LOCKING_STYLE_N
12160 4f 4e 45 3d 3d 32 29 3b 0a 20 20 61 73 73 65 72  ONE==2);.  asser
12170 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  t(LOCKING_STYLE_
12180 44 4f 54 46 49 4c 45 3d 3d 33 29 3b 0a 20 20 61  DOTFILE==3);.  a
12190 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54  ssert(LOCKING_ST
121a0 59 4c 45 5f 46 4c 4f 43 4b 3d 3d 34 29 3b 0a 20  YLE_FLOCK==4);. 
121b0 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f   assert(LOCKING_
121c0 53 54 59 4c 45 5f 41 46 50 3d 3d 35 29 3b 0a 0a  STYLE_AFP==5);..
121d0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
121e0 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20  pLock==NULL );. 
121f0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
12200 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  Open==NULL );.. 
12210 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20   OSTRACE3("OPEN 
12220 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
12230 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20  , zFilename);   
12240 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b   .  pNew->h = h;
12250 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
12260 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48   dirfd;.  SET_TH
12270 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20  READID(pNew);.. 
12280 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
12290 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     eLockingStyle
122a0 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45   = LOCKING_STYLE
122b0 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
122c0 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c      eLockingStyl
122d0 65 20 3d 20 64 65 74 65 63 74 4c 6f 63 6b 69 6e  e = detectLockin
122e0 67 53 74 79 6c 65 28 70 56 66 73 2c 20 7a 46 69  gStyle(pVfs, zFi
122f0 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 7d 0a  lename, h);.  }.
12300 0a 20 20 73 77 69 74 63 68 28 20 65 4c 6f 63 6b  .  switch( eLock
12310 69 6e 67 53 74 79 6c 65 20 29 7b 0a 0a 20 20 20  ingStyle ){..   
12320 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
12330 59 4c 45 5f 50 4f 53 49 58 3a 20 7b 0a 20 20 20  YLE_POSIX: {.   
12340 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b     enterMutex();
12350 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
12360 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65  LockInfo(h, &pNe
12370 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
12380 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6c  >pOpen);.      l
12390 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
123a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
123b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
123c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
123d0 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e  .    case LOCKIN
123e0 47 5f 53 54 59 4c 45 5f 41 46 50 3a 20 7b 0a 20  G_STYLE_AFP: {. 
123f0 20 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b       /* AFP lock
12400 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
12410 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
12420 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
12430 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  d in.      ** th
12440 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
12450 65 78 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ext..      */.  
12460 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
12470 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
12480 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
12490 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
124a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
124b0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
124c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  ;.      if( pCtx
124d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
124e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
124f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12500 20 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46         /* NB: zF
12510 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
12520 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
12530 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
12540 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
12550 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
12560 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
12570 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
12580 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
12590 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f   a.        ** co
125a0 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
125b0 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  me. */.        p
125c0 43 74 78 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20  Ctx->filePath = 
125d0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
125e0 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
125f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12600 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
12610 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
12620 59 4c 45 5f 44 4f 54 46 49 4c 45 3a 20 7b 0a 20  YLE_DOTFILE: {. 
12630 20 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20       /* Dotfile 
12640 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
12650 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
12660 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
12670 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  luded in.      *
12680 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
12690 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
126a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
126b0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
126c0 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
126d0 3b 0a 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d  ;.      nFilenam
126e0 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
126f0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 20  name) + 6;.     
12700 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
12710 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
12720 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
12730 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46        if( zLockF
12740 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
12750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12760 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
12770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12780 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
12790 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
127a0 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c   "%s.lock", zFil
127b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ename);.      }.
127c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
127d0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
127e0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 20 20 62 72  ckFile;.      br
127f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
12800 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  case LOCKING_STY
12810 4c 45 5f 46 4c 4f 43 4b 3a 20 0a 20 20 20 20 63  LE_FLOCK: .    c
12820 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ase LOCKING_STYL
12830 45 5f 4e 4f 4e 45 3a 20 0a 20 20 20 20 20 20 62  E_NONE: .      b
12840 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  reak;.#endif.  }
12850 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
12860 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 69 66 28  Errno = 0;.  if(
12870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12880 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64 3e  {.    if( dirfd>
12890 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64  =0 ) close(dirfd
128a0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b  );.    close(h);
128b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
128c0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 61  ew->pMethod = &a
128d0 49 6f 4d 65 74 68 6f 64 5b 65 4c 6f 63 6b 69 6e  IoMethod[eLockin
128e0 67 53 74 79 6c 65 2d 31 5d 3b 0a 20 20 20 20 4f  gStyle-1];.    O
128f0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
12900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
12920 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12930 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
12940 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
12950 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
12960 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
12970 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
12980 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
12990 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
129a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
129b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
129c0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
129d0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
129e0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
129f0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
12a00 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
12a10 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
12a20 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
12a30 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
12a40 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
12a50 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
12a60 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
12a70 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
12a80 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
12a90 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
12aa0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
12ab0 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
12ac0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
12ad0 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
12ae0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
12af0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
12b00 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
12b10 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
12b20 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
12b30 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
12b40 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
12b50 3b 0a 20 20 66 6f 72 28 69 69 3d 73 74 72 6c 65  ;.  for(ii=strle
12b60 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e  n(zDirname); ii>
12b70 3d 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  =0 && zDirname[i
12b80 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
12b90 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
12ba0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
12bb0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
12bc0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
12bd0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
12be0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
12bf0 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44  >=0 ){.#ifdef FD
12c00 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66  _CLOEXEC.      f
12c10 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
12c20 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
12c30 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
12c40 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
12c50 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50      OSTRACE3("OP
12c60 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
12c70 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  , fd, zDirname);
12c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
12c90 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
12ca0 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
12cb0 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  K:SQLITE_CANTOPE
12cc0 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  N);.}../*.** Cre
12cd0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
12ce0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
12cf0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
12d00 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
12d10 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
12d20 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
12d30 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
12d40 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
12d50 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12d60 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
12d70 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
12d80 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
12d90 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
12da0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
12db0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
12dc0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
12dd0 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
12de0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
12df0 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b  ,.     ".",.  };
12e00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
12e10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
12e20 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
12e30 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
12e40 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
12e50 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
12e60 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
12e70 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69  0123456789";.  i
12e80 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
12e90 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
12ea0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
12eb0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   ".";..  /* It's
12ec0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
12ed0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
12ee0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
12ef0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
12f00 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
12f10 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
12f20 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
12f30 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
12f40 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
12f50 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
12f60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12f70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12f80 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44  _IOERR );..  azD
12f90 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
12fa0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
12fb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
12fc0 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
12fd0 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
12fe0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
12ff0 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
13000 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
13010 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
13020 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
13030 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
13040 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
13050 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13060 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
13070 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
13080 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
13090 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
130a0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
130b0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
130c0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
130d0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
130e0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
130f0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
13100 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
13110 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13120 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
13130 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
13140 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
13150 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
13160 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  17) >= nBuf ){. 
13170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
13190 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
131a0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c  nprintf(nBuf-17,
131b0 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
131c0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
131d0 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
131e0 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
131f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
13200 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
13210 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
13220 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
13230 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
13240 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
13250 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
13260 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
13270 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
13280 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
13290 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
132a0 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c  le( access(zBuf,
132b0 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
132c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
132d0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
132e0 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
132f0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
13300 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
13310 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
13320 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
13330 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
13340 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
13350 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
13360 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
13370 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
13380 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
13390 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
133a0 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
133b0 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
133c0 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
133d0 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
133e0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
133f0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
13400 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
13410 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
13420 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
13430 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
13440 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
13450 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
13460 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
13470 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
13480 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
13490 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
134a0 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
134b0 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
134c0 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
134d0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
134e0 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
134f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
13500 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
13510 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
13520 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
13530 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
13540 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
13550 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
13560 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
13570 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
13580 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
13590 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
135a0 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
135b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
135c0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
135d0 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
135e0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
135f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
13600 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
13610 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
13620 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20  ags.){.  int fd 
13630 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13640 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
13650 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
13660 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
13670 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d  .  int dirfd = -
13680 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
13690 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
136a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
136b0 2f 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d  /.  int oflags =
136c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
136d0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
136e0 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
136f0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
13700 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
13710 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
13720 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
13730 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13750 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
13760 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
13770 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
13780 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
13790 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
137a0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
137b0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
137c0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
137d0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
137e0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
137f0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
13800 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
13810 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
13820 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
13830 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13840 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
13850 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
13860 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
13870 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
13880 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  );..  /* If crea
13890 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
138a0 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
138b0 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
138c0 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
138d0 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
138e0 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
138f0 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
13900 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
13910 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
13920 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
13930 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13940 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
13950 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
13960 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65    */.  int isOpe
13970 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73  nDirectory = (is
13980 43 72 65 61 74 65 20 26 26 20 0a 20 20 20 20 20  Create && .     
13990 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f   (eType==SQLITE_
139a0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
139b0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
139c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
139d0 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20  OURNAL).  );..  
139e0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
139f0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
13a00 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
13a10 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
13a20 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
13a30 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
13a40 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
13a50 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
13a60 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
13a70 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
13a80 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
13a90 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
13aa0 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
13ab0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
13ac0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
13ad0 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
13ae0 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
13af0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
13b00 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
13b10 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
13b20 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
13b30 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
13b40 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
13b50 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
13b60 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
13b70 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
13b80 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
13b90 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
13ba0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
13bb0 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
13bc0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
13bd0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
13be0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
13bf0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
13c00 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
13c10 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
13c20 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
13c30 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
13c40 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
13c50 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
13c60 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
13c70 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
13c80 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
13c90 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
13ca0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
13cb0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
13cc0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
13cd0 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  al, and master j
13ce0 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
13cf0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
13d00 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f   ** deleted.  */
13d10 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
13d20 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
13d30 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65  IN_DB || !isDele
13d40 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
13d50 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
13d60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
13d70 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
13d80 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
13d90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
13da0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21  TER_JOURNAL || !
13db0 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  isDelete );..  /
13dc0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
13dd0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
13de0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
13df0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
13e00 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
13e10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
13e20 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
13e30 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
13e40 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
13e50 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
13e60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
13e70 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
13e80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
13e90 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
13ea0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
13eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
13ec0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
13ed0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
13ee0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
13ef0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
13f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
13f10 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
13f20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
13f30 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
13f40 29 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d  ));..  if( !zNam
13f50 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
13f60 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
13f70 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44  lete && !isOpenD
13f80 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72  irectory);.    r
13f90 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
13fa0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
13fb0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
13fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13fd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13fe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
13ff0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
14000 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
14010 61 64 6f 6e 6c 79 20 29 20 20 6f 66 6c 61 67 73  adonly )  oflags
14020 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
14030 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
14040 29 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  ) oflags |= O_RD
14050 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
14060 74 65 20 29 20 20 20 20 6f 66 6c 61 67 73 20 7c  te )    oflags |
14070 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
14080 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
14090 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  flags |= (O_EXCL
140a0 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
140b0 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  oflags |= (O_LAR
140c0 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
140d0 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  ;..  fd = open(z
140e0 4e 61 6d 65 2c 20 6f 66 6c 61 67 73 2c 20 69 73  Name, oflags, is
140f0 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49  Delete?0600:SQLI
14100 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
14110 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
14120 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
14130 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
14140 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
14150 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
14160 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
14170 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
14180 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
14190 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
141a0 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   */.    flags &=
141b0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
141c0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
141d0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
141e0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
141f0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
14200 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
14210 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68  Open(pVfs, zPath
14220 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  , pFile, flags, 
14230 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pOutFlags);.  }.
14240 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
14250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14260 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
14270 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
14280 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
14290 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 75  );.  }.  if( pOu
142a0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
142b0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
142c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
142d0 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73  fd!=0);.  if( is
142e0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
142f0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 70  .    int rc = op
14300 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
14310 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
14320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14330 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  K ){.      close
14340 28 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (fd);.      retu
14350 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
14360 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  ..#ifdef FD_CLOE
14370 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20  XEC.  fcntl(fd, 
14380 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
14390 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
143a0 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
143b0 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
143c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
143d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 72  PEN_MAIN_DB;.  r
143e0 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  eturn fillInUnix
143f0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64  File(pVfs, fd, d
14400 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
14410 74 68 2c 20 6e 6f 4c 6f 63 6b 29 3b 0a 7d 0a 0a  th, noLock);.}..
14420 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
14430 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
14440 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
14450 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
14460 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
14470 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
14480 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
14490 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
144a0 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71 6c 69   unixDelete(sqli
144b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
144c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
144d0 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a  , int dirSync){.
144e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
144f0 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61 74 65  E_OK;.  Simulate
14500 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
14510 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
14520 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50  TE);.  unlink(zP
14530 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ath);.#ifndef SQ
14540 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
14550 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79  SYNC.  if( dirSy
14560 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  nc ){.    int fd
14570 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  ;.    rc = openD
14580 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
14590 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
145a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
145b0 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
145c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
145d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
145e0 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20  DIR_FSYNC;.     
145f0 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66   }.      close(f
14600 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  d);.    }.  }.#e
14610 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
14620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
14630 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
14640 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
14650 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
14660 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
14670 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
14680 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
14690 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
146a0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
146b0 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
146c0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
146d0 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
146e0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
146f0 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
14700 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
14710 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
14720 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
14730 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
14740 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
14750 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
14760 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
14770 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
14780 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
14790 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
147a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63  _vfs *pVfs, .  c
147b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
147c0 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  , .  int flags, 
147d0 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a  .  int *pResOut.
147e0 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
147f0 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   0;.  SimulateIO
14800 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
14810 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
14820 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
14830 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
14840 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
14850 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
14860 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
14870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14880 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
14890 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
148a0 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
148b0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
148c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
148d0 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
148e0 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
148f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
14900 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
14910 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
14920 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
14930 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
14940 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28 7a  sOut = (access(z
14950 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
14960 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14970 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14980 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
14990 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
149a0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
149b0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
149c0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
149d0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
149e0 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
149f0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
14a00 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
14a10 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
14a20 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
14a30 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
14a40 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
14a50 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
14a60 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
14a70 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
14a80 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
14a90 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
14aa0 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
14ab0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
14ac0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
14ad0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
14ae0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
14b00 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
14b10 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
14b20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
14b30 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
14b40 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
14b50 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
14b60 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
14b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
14b80 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
14b90 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
14ba0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
14bd0 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
14be0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
14bf0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
14c00 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
14c10 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
14c20 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
14c30 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
14c40 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
14c50 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
14c60 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
14c70 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
14c80 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
14c90 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
14ca0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
14cb0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
14cc0 72 65 63 74 6c 79 20 68 61 73 20 62 65 65 6e 20  rectly has been 
14cd0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
14ce0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14cf0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
14d00 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65  ERROR );..  asse
14d10 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
14d20 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
14d30 4d 45 20 29 3b 0a 20 20 7a 4f 75 74 5b 6e 4f 75  ME );.  zOut[nOu
14d40 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
14d50 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
14d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14d70 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
14d80 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
14d90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14da0 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
14db0 28 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  ( getcwd(zOut, n
14dc0 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
14dd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14de0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
14df0 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c  .    nCwd = strl
14e00 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
14e10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
14e20 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
14e30 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
14e40 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
14e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23  rn SQLITE_OK;..#
14e60 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52  if 0.  /*.  ** R
14e70 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74 68  emove "/./" path
14e80 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f   elements and co
14e90 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61  nvert "/A/./" pa
14ea0 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  th elements.  **
14eb0 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20   to just "/"..  
14ec0 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20 29  */.  if( zFull )
14ed0 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
14ee0 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a      for(i=j=0; z
14ef0 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Full[i]; i++){. 
14f00 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69       if( zFull[i
14f10 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
14f20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d    if( zFull[i+1]
14f30 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
14f40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
14f50 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ull[i+1]=='.' &&
14f60 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27   zFull[i+2]=='/'
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20   ){.          i 
14f80 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  += 1;.          
14f90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14fb0 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20  zFull[i+1]=='.' 
14fc0 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27  && zFull[i+2]=='
14fd0 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d  .' && zFull[i+3]
14fe0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
14ff0 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
15000 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27   zFull[j-1]!='/'
15010 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
15020 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20       i += 3;.   
15030 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15050 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a   }.      zFull[j
15060 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a  ++] = zFull[i];.
15070 20 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b      }.    zFull[
15080 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  j] = 0;.  }.#end
15090 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  if.}...#ifndef S
150a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
150b0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
150c0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
150d0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
150e0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
150f0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
15100 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
15110 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
15120 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
15130 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
15140 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
15150 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
15160 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
15170 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
15180 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
15190 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c  me){.  return dl
151a0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
151b0 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
151c0 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
151d0 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
151e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
151f0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
15200 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
15210 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
15220 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
15230 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
15240 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
15250 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
15260 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
15270 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
15280 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
15290 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
152a0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
152b0 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
152c0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
152d0 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
152e0 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
152f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
15300 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
15310 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
15320 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
15330 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
15340 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a  ufOut){.  char *
15350 7a 45 72 72 3b 0a 20 20 65 6e 74 65 72 4d 75 74  zErr;.  enterMut
15360 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
15370 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
15380 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
15390 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
153a0 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
153b0 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 6c  , zErr);.  }.  l
153c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
153d0 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
153e0 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
153f0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
15400 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
15410 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20  ar *zSymbol){.  
15420 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61  return dlsym(pHa
15430 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
15440 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
15450 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
15460 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
15470 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 64  d *pHandle){.  d
15480 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
15490 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
154a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
154b0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
154c0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
154d0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
154e0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
154f0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
15500 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
15510 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
15520 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
15530 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
15540 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
15550 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
15560 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
15570 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
15580 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
15590 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
155a0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
155b0 61 72 20 2a 7a 42 75 66 29 7b 0a 0a 20 20 61 73  ar *zBuf){..  as
155c0 73 65 72 74 28 6e 42 75 66 3e 3d 28 73 69 7a 65  sert(nBuf>=(size
155d0 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
155e0 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
155f0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
15600 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
15610 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
15620 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
15630 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
15640 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
15650 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
15660 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
15670 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
15680 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
15690 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
156a0 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
156b0 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
156c0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
156d0 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
156e0 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
156f0 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
15700 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
15710 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
15720 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
15730 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
15740 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
15750 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
15760 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
15770 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
15780 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
15790 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
157a0 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
157b0 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
157c0 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
157d0 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
157e0 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
157f0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
15800 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
15810 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
15820 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
15830 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
15840 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
15850 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
15860 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
15870 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  Buf);.#if !defin
15880 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
15890 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c    {.    int pid,
158a0 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70   fd;.    fd = op
158b0 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
158c0 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  ", O_RDONLY);.  
158d0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
158e0 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
158f0 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
15900 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
15910 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
15920 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
15930 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
15940 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
15950 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  (t)], &pid, size
15960 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20  of(pid));.      
15970 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
15980 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 6e  )+sizeof(pid)<=n
15990 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
159a0 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
159b0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
159c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42   }else{.      nB
159d0 75 66 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42  uf = read(fd, zB
159e0 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20  uf, nBuf);.     
159f0 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
15a00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
15a10 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
15a20 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
15a30 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
15a40 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
15a50 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
15a60 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
15a70 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
15a80 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
15a90 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
15aa0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
15ab0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
15ac0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
15ad0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
15ae0 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
15af0 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
15b00 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
15b10 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
15b20 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
15b30 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
15b40 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
15b50 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
15b60 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
15b70 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
15b80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
15b90 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
15ba0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
15bb0 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
15bc0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
15bd0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
15be0 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
15bf0 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65  roseconds);.  re
15c00 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
15c10 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
15c20 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
15c30 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
15c40 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
15c50 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75  seconds);.  retu
15c60 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
15c70 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
15c80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
15c90 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
15ca0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
15cb0 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
15cc0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
15cd0 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
15ce0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
15cf0 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
15d00 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
15d10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15d20 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
15d30 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
15d40 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
15d50 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
15d60 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
15d70 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
15d80 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
15d90 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
15da0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
15db0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
15dc0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
15dd0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
15de0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
15df0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
15e00 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
15e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
15e20 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
15e30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
15e40 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
15e50 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f  .#ifdef NO_GETTO
15e60 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  D.  time_t t;.  
15e70 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e  time(&t);.  *prN
15e80 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b  ow = t/86400.0 +
15e90 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73   2440587.5;.#els
15ea0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
15eb0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
15ec0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
15ed0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
15ee0 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
15ef0 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
15f00 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
15f10 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
15f20 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
15f30 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
15f40 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
15f50 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
15f60 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
15f70 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
15f80 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
15f90 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
15fa0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
15fb0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
15fc0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
15fd0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
15fe0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74  ar *zBuf){.  ret
15ff0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16000 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
16010 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
16020 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
16030 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
16040 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 4d  t(void){ .  /* M
16050 61 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74  acro to define t
16060 68 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  he static conten
16070 74 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  ts of an sqlite3
16080 5f 76 66 73 20 73 74 72 75 63 74 75 72 65 20 66  _vfs structure f
16090 6f 72 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69 78  or.  ** the unix
160a0 20 62 61 63 6b 65 6e 64 2e 20 54 68 65 20 74 77   backend. The tw
160b0 6f 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  o parameters are
160c0 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 75   the values to u
160d0 73 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  se for.  ** the 
160e0 73 71 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61 6d  sqlite3_vfs.zNam
160f0 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 76 66  e and sqlite3_vf
16100 73 2e 70 41 70 70 44 61 74 61 20 66 69 65 6c 64  s.pAppData field
16110 73 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  s, respectively.
16120 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23 64  .  ** .  */.  #d
16130 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 7a 56  efine UNIXVFS(zV
16140 66 73 4e 61 6d 65 2c 20 70 56 66 73 41 70 70 44  fsName, pVfsAppD
16150 61 74 61 29 20 7b 20 20 20 20 20 20 20 20 20 20  ata) {          
16160 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c          \.    1,
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
16190 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
161a0 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65        \.    size
161b0 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20  of(unixFile),   
161c0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41      \.    MAX_PA
161f0 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20  THNAME,         
16200 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20    \.    0,      
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16240 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20   pNext */       
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 5c 0a 20 20 20 20 7a 56 66 73 4e 61 6d 65 2c 20  \.    zVfsName, 
16270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
16280 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Name */         
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
162a0 20 20 20 20 28 76 6f 69 64 20 2a 29 70 56 66 73      (void *)pVfs
162b0 41 70 70 44 61 74 61 2c 20 20 2f 2a 20 70 41 70  AppData,  /* pAp
162c0 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20  pData */        
162d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
162e0 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20    unixOpen,     
162f0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
16300 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
16310 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16320 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
16330 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
16340 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
16350 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16360 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  ixAccess,       
16370 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
16380 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16390 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
163a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
163b0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
163c0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
163d0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
163e0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
163f0 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20  /* xDlOpen */   
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72    \.    unixDlEr
16420 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
16430 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20   xDlError */    
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c  \.    unixDlSym,
16460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
16470 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20  DlSym */        
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16490 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c      unixDlClose,
164a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
164b0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
164c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
164d0 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73    unixRandomness
164e0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
164f0 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20  omness */       
16500 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16510 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20  unixSleep,      
16520 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
16530 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
16540 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16550 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  ixCurrentTime,  
16560 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
16570 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ime */          
16580 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
16590 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20  GetLastError    
165a0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
165b0 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  or */           
165c0 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 73 74 61      \.  }..  sta
165d0 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
165e0 75 6e 69 78 56 66 73 20 3d 20 55 4e 49 58 56 46  unixVfs = UNIXVF
165f0 53 28 22 75 6e 69 78 22 2c 20 30 29 3b 0a 23 69  S("unix", 0);.#i
16600 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16610 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
16620 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
16630 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
16640 5b 5d 20 3d 20 7b 0a 20 20 20 20 55 4e 49 58 56  [] = {.    UNIXV
16650 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c  FS("unix-posix",
16660 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
16670 5f 50 4f 53 49 58 29 2c 20 0a 20 20 20 20 55 4e  _POSIX), .    UN
16680 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
16690 2c 20 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54  ,     LOCKING_ST
166a0 59 4c 45 5f 41 46 50 29 2c 20 0a 20 20 20 20 55  YLE_AFP), .    U
166b0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f  NIXVFS("unix-flo
166c0 63 6b 22 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f 53  ck",   LOCKING_S
166d0 54 59 4c 45 5f 46 4c 4f 43 4b 29 2c 20 0a 20 20  TYLE_FLOCK), .  
166e0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
166f0 64 6f 74 66 69 6c 65 22 2c 20 4c 4f 43 4b 49 4e  dotfile", LOCKIN
16700 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 29  G_STYLE_DOTFILE)
16710 2c 20 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  , .    UNIXVFS("
16720 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 4c  unix-none",    L
16730 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e  OCKING_STYLE_NON
16740 45 29 0a 20 20 7d 3b 0a 20 20 66 6f 72 28 69 3d  E).  };.  for(i=
16750 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66  0; i<(sizeof(aVf
16760 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  s)/sizeof(sqlite
16770 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20  3_vfs)); i++){. 
16780 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
16790 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d  egister(&aVfs[i]
167a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
167b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
167c0 65 67 69 73 74 65 72 28 26 75 6e 69 78 56 66 73  egister(&unixVfs
167d0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
167e0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
167f0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
16800 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
16810 6d 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69  m interface. Thi
16820 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
16830 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71   unix..*/.int sq
16840 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
16850 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51  d){ .  return SQ
16860 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65  LITE_OK; .}. .#e
16870 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16880 53 5f 55 4e 49 58 20 2a 2f 0a                    S_UNIX */.