/ Hex Artifact Content
Login

Artifact 48527028ce548efb23c1e13f2e737eed8ee01444:


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 35 20 32 30 30 38 2f 31 30 2f 31 34 20 31 37  05 2008/10/14 17
01e0: 3a 35 38 3a 33 38 20 64 72 68 20 45 78 70 20 24  :58:38 drh Exp $
01f0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0200: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
0210: 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 20 20  QLITE_OS_UNIX   
0220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0230: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0240: 6f 6e 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a  on unix only */.
0250: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
0260: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0270: 53 54 59 4c 45 20 69 73 20 64 65 66 69 6e 65 64  STYLE is defined
0280: 20 61 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f   and is non-zero
0290: 2c 20 74 68 65 6e 20 73 65 76 65 72 61 6c 0a 2a  , then several.*
02a0: 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6c 6f  * alternative lo
02b0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
02c0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69 64  tions are provid
02d0: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 4f  ed:.**.**   * PO
02e0: 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68 65  SIX locking (the
02f0: 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20 20   default),.**   
0300: 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  * No locking,.**
0310: 20 20 20 2a 20 44 6f 74 2d 66 69 6c 65 20 6c 6f     * Dot-file lo
0320: 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 66 6c  cking,.**   * fl
0330: 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  ock() locking,.*
0340: 2a 20 20 20 2a 20 41 46 50 20 6c 6f 63 6b 69 6e  *   * AFP lockin
0350: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2e 0a 2a 2a  g (OSX only)..**
0360: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  .** SQLITE_ENABL
0370: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0380: 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 61 20  only works on a 
0390: 4d 61 63 2e 20 49 74 20 69 73 20 74 75 72 6e 65  Mac. It is turne
03a0: 64 20 6f 6e 20 62 79 0a 2a 2a 20 64 65 66 61 75  d on by.** defau
03b0: 6c 74 20 6f 6e 20 61 20 4d 61 63 20 61 6e 64 20  lt on a Mac and 
03c0: 64 69 73 61 62 6c 65 64 20 6f 6e 20 61 6c 6c 20  disabled on all 
03d0: 6f 74 68 65 72 20 70 6f 73 69 78 20 70 6c 61 74  other posix plat
03e0: 66 6f 72 6d 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  forms..*/.#if !d
03f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0400: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0410: 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65  LE).#  if define
0420: 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 0a 23 20  d(__DARWIN__).# 
0430: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
0440: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0450: 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a  STYLE 1.#  else.
0460: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0470: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0480: 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64  G_STYLE 0.#  end
0490: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
04a0: 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73 20   These #defines 
04b0: 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e 32  should enable >2
04c0: 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  GB file support 
04d0: 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65 0a  on Posix if the.
04e0: 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  ** underlying op
04f0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
0500: 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66 20  upports it.  If 
0510: 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20  the OS lacks.** 
0520: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
0530: 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c 64  rt, these should
0540: 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a   be no-ops..**.*
0550: 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75 70  * Large file sup
0560: 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73 61  port can be disa
0570: 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d  bled using the -
0580: 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f  DSQLITE_DISABLE_
0590: 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f 6e  LFS switch.** on
05a0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f   the compiler co
05b0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69  mmand line.  Thi
05c0: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 69  s is necessary i
05d0: 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c  f you are compil
05e0: 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65  ing.** on a rece
05f0: 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  nt machine (ex: 
0600: 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74 20  RedHat 7.2) but 
0610: 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63 6f  you want your co
0620: 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e  de to work.** on
0630: 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69 6e   an older machin
0640: 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36 2e  e (ex: RedHat 6.
0650: 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d 70  0).  If you comp
0660: 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37 2e  ile on RedHat 7.
0670: 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 69  2.** without thi
0680: 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69 73  s option, LFS is
0690: 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c 46   enable.  But LF
06a0: 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  S does not exist
06b0: 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a 2a   in the kernel.*
06c0: 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30 2c  * in RedHat 6.0,
06d0: 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f 6e   so the code won
06e0: 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65 2c  't work.  Hence,
06f0: 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69 6e   for maximum bin
0700: 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69  ary.** portabili
0710: 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f 6d  ty you should om
0720: 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e 64  it LFS..*/.#ifnd
0730: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
0740: 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f  E_LFS.# define _
0750: 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20  LARGE_FILE      
0760: 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c   1.# ifndef _FIL
0770: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20  E_OFFSET_BITS.# 
0780: 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f    define _FILE_O
0790: 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20  FFSET_BITS 64.# 
07a0: 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f  endif.# define _
07b0: 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45  LARGEFILE_SOURCE
07c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
07d0: 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64   standard includ
07e0: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63  e files..*/.#inc
07f0: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0800: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0810: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
0820: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63  e <fcntl.h>.#inc
0830: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0840: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
0850: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0860: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
0870: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 23 69 66 20   <errno.h>..#if 
0880: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0890: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 6e 63  CKING_STYLE.#inc
08a0: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
08b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
08c0: 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e 63 6c 75  /param.h>.#inclu
08d0: 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e  de <sys/mount.h>
08e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
08f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0900: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
0910: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
0920: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
0930: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
0940: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
0950: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
0960: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
0970: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
0980: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
0990: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
09a0: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
09b0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
09c0: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
09d0: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
09e0: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
09f0: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
0a00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0a10: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
0a20: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
0a30: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
0a40: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
0a50: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
0a60: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
0a70: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
0a80: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
0a90: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
0aa0: 32 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  2.../*.** The un
0ab0: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
0ac0: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
0ad0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
0ae0: 63 69 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e  cific for the un
0af0: 69 78 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74  ix.** protabilit
0b00: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
0b10: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
0b20: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
0b30: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
0b40: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
0b50: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
0b60: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
0b70: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
0b80: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0b90: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
0ba0: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
0bb0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
0bc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
0bd0: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
0be0: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
0bf0: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
0c00: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
0c10: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
0c20: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
0c30: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 73  [32];.#endif.  s
0c40: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
0c50: 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49 6e 66 6f  Open;    /* Info
0c60: 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20   about all open 
0c70: 66 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  fd's on this ino
0c80: 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  de */.  struct l
0c90: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20  ockInfo *pLock; 
0ca0: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
0cb0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
0cc0: 6f 64 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ode */.#if SQLIT
0cd0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0ce0: 5f 53 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c  _STYLE.  void *l
0cf0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
0d00: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
0d10: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
0d20: 74 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  te */.#endif.  i
0d30: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
0d60: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0d70: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f  ar locktype;   /
0d80: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
0d90: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
0da0: 66 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  fd */.  int dirf
0db0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0dc0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
0dd0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
0de0: 65 63 74 6f 72 79 20 2a 2f 0a 23 69 66 20 53 51  ectory */.#if SQ
0df0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
0e00: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0e20: 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20 22  he thread that "
0e30: 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46  owns" this unixF
0e40: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
0e50: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
0e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e70: 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d   unix errno from
0e80: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0e90: 72 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ror */.};../*.**
0ea0: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
0eb0: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
0ec0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
0ed0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
0ee0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
0ef0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
0f00: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
0f10: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
0f20: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
0f30: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
0f40: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
0f50: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
0f60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f70: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
0f80: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
0f90: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
0fa0: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
0fb0: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
0fc0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
0fd0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
0fe0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
0ff0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
1000: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1010: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
1020: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
1030: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
1040: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
1050: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
1060: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
1070: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
1080: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
1090: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
10a0: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
10b0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
10c0: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
10d0: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
10e0: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
10f0: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
1100: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
1110: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
1120: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
1130: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
1140: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
1150: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
1160: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
1170: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
1180: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
1190: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
11a0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
11b0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
11c0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
11d0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
11e0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
11f0: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
1200: 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63  *.** Set or chec
1210: 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74  k the unixFile.t
1220: 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20  id field.  This 
1230: 66 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65  field is set whe
1240: 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  n an unixFile.**
1250: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
1260: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
1270: 74 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e  t uses of the un
1280: 69 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68  ixFile verify th
1290: 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74  at the.** same t
12a0: 68 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69  hread is operati
12b0: 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69  ng on the unixFi
12c0: 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74  le.  Some operat
12d0: 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a  ing systems do.*
12e0: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b  * not allow lock
12f0: 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64  s to be overridd
1300: 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65  en by other thre
1310: 61 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73  ads and that res
1320: 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e  triction.** mean
1330: 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20  s that sqlite3* 
1340: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
1350: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64   cannot be moved
1360: 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64   from one thread
1370: 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  .** to another. 
1380: 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65   This logic make
1390: 73 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f  s sure a user do
13a0: 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f  es not try to do
13b0: 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74   that.** by mist
13c0: 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69  ake..**.** Versi
13d0: 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30  on 3.3.1 (2006-0
13e0: 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65  1-15):  unixFile
13f0: 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72   can be moved fr
1400: 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f  om one thread to
1410: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c  .** another as l
1420: 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75  ong as we are ru
1430: 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65  nning on a syste
1440: 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20  m that supports 
1450: 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72  threads.** overr
1460: 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72  iding each other
1470: 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e  s locks (which n
1480: 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d  ow the most comm
1490: 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20  on behavior).** 
14a0: 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61  or if no locks a
14b0: 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68  re held.  But th
14c0: 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b  e unixFile.pLock
14d0: 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20   field needs to 
14e0: 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64  be.** recomputed
14f0: 20 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79   because its key
1500: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68   includes the th
1510: 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68  read-id.  See th
1520: 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77  e .** transferOw
1530: 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69  nership() functi
1540: 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64  on below for add
1550: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1560: 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ion.*/.#if SQLIT
1570: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 64  E_THREADSAFE.# d
1580: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
1590: 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64  ID(X)   (X)->tid
15a0: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
15b0: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
15c0: 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68  _THREADID(X) (th
15d0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
15e0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20  hOthersLocks==0 
15f0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  && \.           
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
1620: 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  (X)->tid, pthrea
1630: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
1640: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
1650: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
1660: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
1670: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
1680: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
1690: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
16a0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
16b0: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
16c0: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
16d0: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
16e0: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
16f0: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
1700: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
1710: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
1720: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
1730: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
1740: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
1750: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
1760: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
1770: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
1780: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
1790: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
17a0: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
17b0: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
17c0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
17d0: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
17e0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
17f0: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
1800: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
1810: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
1820: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
1830: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
1840: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
1850: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
1860: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
1870: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
1880: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
1890: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
18a0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
18b0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
18c0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
18d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
18e0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
18f0: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
1900: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
1910: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
1920: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
1930: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
1940: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
1950: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
1960: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
1970: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
1980: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
1990: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
19a0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
19b0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
19c0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
19d0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
19e0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
19f0: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
1a00: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
1a10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1a20: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
1a30: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
1a40: 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20  .**.** Bummer.  
1a50: 49 66 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74  If you ask me, t
1a60: 68 69 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20  his is broken.  
1a70: 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49  Badly broken.  I
1a80: 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  t means.** that 
1a90: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
1aa0: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
1ab0: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
1ac0: 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f  cess among.** co
1ad0: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
1ae0: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
1af0: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
1b00: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
1b10: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
1b20: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
1b30: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
1b40: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
1b50: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
1b60: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
1b70: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1b80: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1b90: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
1ba0: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
1bb0: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
1bc0: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
1bd0: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
1be0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
1bf0: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
1c00: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
1c10: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
1c20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c30: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
1c40: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1c50: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
1c60: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
1c70: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
1c80: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
1c90: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
1ca0: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
1cb0: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
1cc0: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
1cd0: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
1ce0: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
1cf0: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
1d00: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
1d10: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
1d20: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
1d30: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
1d40: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
1d50: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
1d60: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
1d70: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
1d80: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
1d90: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
1da0: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
1db0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
1dc0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
1dd0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
1de0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
1df0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
1e00: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
1e10: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
1e20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1e30: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1e40: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
1e50: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
1e60: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1e70: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
1e80: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
1e90: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
1ea0: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
1eb0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
1ec0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
1ed0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
1ee0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
1ef0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
1f00: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
1f10: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
1f20: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
1f30: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
1f40: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
1f50: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
1f60: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
1f70: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
1f80: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
1f90: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
1fa0: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
1fb0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
1fc0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
1fd0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
1fe0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
1ff0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
2000: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
2010: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
2020: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
2030: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
2040: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
2050: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
2060: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
2070: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
2080: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
2090: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
20a0: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
20b0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
20c0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
20d0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
20e0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
20f0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
2100: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
2110: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32  d state..**.** 2
2120: 30 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d  004-Jan-11:.** M
2130: 6f 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f  ore recent disco
2140: 76 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53  veries about POS
2150: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
2160: 73 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a  s.  (The more.**
2170: 20 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65   I discover, the
2180: 20 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20   more I realize 
2190: 74 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69  the a POSIX advi
21a0: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  sory locks are.*
21b0: 2a 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e  * an abomination
21c0: 2e 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  .).**.** If you 
21d0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
21e0: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
21f0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
2200: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
2210: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
2220: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
2230: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
2240: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
2250: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
2260: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
2270: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
2280: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
2290: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
22a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
22b0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
22c0: 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  re.  There is on
22d0: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  e openCnt struct
22e0: 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20  ure.** per open 
22f0: 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61  inode, which mea
2300: 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  ns that multiple
2310: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f   unixFile can po
2320: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
2330: 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65  ** openCnt.  Whe
2340: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2350: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
2360: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
2370: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
2380: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
2390: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
23a0: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
23b0: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
23c0: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
23d0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23e0: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
23f0: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
2400: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
2410: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
2420: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
2430: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
2440: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
2450: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2460: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2470: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2480: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2490: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
24a0: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
24b0: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
24c0: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
24d0: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
24e0: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
24f0: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
2500: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
2510: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
2520: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
2530: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
2540: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
2550: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2560: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2570: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2580: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2590: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
25a0: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
25b0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
25c0: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
25d0: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
25e0: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
25f0: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
2600: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
2610: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
2620: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
2630: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
2640: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
2650: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2660: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2670: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2680: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2690: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
26a0: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
26b0: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
26c0: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
26d0: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
26e0: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
26f0: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
2700: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
2710: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
2720: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
2730: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
2740: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
2750: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2760: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2770: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2780: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2790: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
27a0: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
27b0: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
27c0: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
27d0: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
27e0: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
27f0: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
2800: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
2810: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
2820: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
2830: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
2840: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
2850: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2860: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2870: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2880: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2890: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
28a0: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
28b0: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
28c0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
28d0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
28e0: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
28f0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
2900: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
2910: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
2920: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
2930: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
2940: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
2950: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2960: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2970: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2980: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2990: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
29a0: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
29b0: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
29c0: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
29d0: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
29e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
29f0: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
2a00: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2a10: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2a20: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2a30: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2a40: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2a50: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2a60: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2a70: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2a80: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2a90: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2aa0: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
2ab0: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
2ac0: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
2ad0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
2ae0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2af0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2b00: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2b10: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2b20: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2b30: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2b40: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2b50: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2b60: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2b70: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2b80: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2b90: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2ba0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2bb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2bc0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2bd0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2be0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2bf0: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2c00: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2c10: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2c20: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2c30: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2c40: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2c50: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2c60: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2c70: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2c80: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2c90: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2ca0: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2cb0: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2cc0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2cd0: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2ce0: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2cf0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2d00: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2d10: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2d20: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2d30: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2d40: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2d50: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2d60: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2d70: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54   */.#if SQLITE_T
2d80: 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68 72  HREADSAFE.  pthr
2d90: 65 61 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20  ead_t tid;   /* 
2da0: 54 68 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72  Thread ID or zer
2db0: 6f 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e  o if threads can
2dc0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
2dd0: 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ther */.#endif.}
2de0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2df0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2e00: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2e10: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
2e20: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
2e30: 6f 64 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65  ode on each thre
2e40: 61 64 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ad with a differ
2e50: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20  ent process ID. 
2e60: 20 28 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a   (Threads have.*
2e70: 2a 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  * different proc
2e80: 65 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78  ess IDs on linux
2e90: 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73  , but not on mos
2ea0: 74 20 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29  t other unixes.)
2eb0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
2ec0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
2ed0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
2ee0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
2ef0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
2f00: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
2f10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2f20: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
2f30: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
2f40: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
2f50: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
2f60: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
2f70: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
2f80: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f  it..*/.struct lo
2f90: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
2fa0: 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20  t lockKey key;  
2fb0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
2fc0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  y */.  int cnt; 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2fe0: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
2ff0: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
3000: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  int locktype;   
3010: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
3020: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
3030: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
3040: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3060: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
3070: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
3080: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
3090: 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 2c 20 2a 70  kInfo *pNext, *p
30a0: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20  Prev;   /* List 
30b0: 6f 66 20 61 6c 6c 20 6c 6f 63 6b 49 6e 66 6f 20  of all lockInfo 
30c0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
30d0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
30e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
30f0: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
3100: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
3110: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
3120: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70 65  a particular ope
3130: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67  nCnt structure g
3140: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20  iven its inode. 
3150: 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20   This.** is the 
3160: 73 61 6d 65 20 61 73 20 74 68 65 20 6c 6f 63 6b  same as the lock
3170: 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74 20  Key except that 
3180: 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69 73  the thread ID is
3190: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72   omitted..*/.str
31a0: 75 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a 20 20  uct openKey {.  
31b0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20  dev_t dev;   /* 
31c0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
31d0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
31e0: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
31f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3200: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3210: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3220: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
3230: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
3240: 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20 73  * inode.  This s
3250: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
3260: 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62  rack of the numb
3270: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74  er of locks on t
3280: 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49  hat.** inode.  I
3290: 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74 74  f a close is att
32a0: 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20 61  empted against a
32b0: 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73 20  n inode that is 
32c0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73  holding.** locks
32d0: 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20 64  , the close is d
32e0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
32f0: 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62 79  l locks clear by
3300: 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66   adding the.** f
3310: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
3320: 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20 74  o be closed to t
3330: 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e  he pending list.
3340: 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 43  .*/.struct openC
3350: 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20 6f 70  nt {.  struct op
3360: 65 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f 2a 20  enKey key;   /* 
3370: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
3380: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33a0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
33b0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
33c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
33d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33e0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
33f0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
3400: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
3410: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3420: 20 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73   of pending clos
3430: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  e() operations *
3440: 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e  /.  int *aPendin
3450: 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c  g;        /* Mal
3460: 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c 64  loced space hold
3470: 69 6e 67 20 66 64 27 73 20 61 77 61 69 74 69 6e  ing fd's awaitin
3480: 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 20  g a close() */. 
3490: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
34a0: 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20  *pNext, *pPrev; 
34b0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
34c0: 20 6f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73   openCnt objects
34d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69   */.};../*.** Li
34e0: 73 74 20 6f 66 20 61 6c 6c 20 6c 6f 63 6b 49 6e  st of all lockIn
34f0: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 6f  fo and openCnt o
3500: 62 6a 65 63 74 73 2e 20 20 54 68 69 73 20 75 73  bjects.  This us
3510: 65 64 20 74 6f 20 62 65 20 61 20 68 61 73 68 0a  ed to be a hash.
3520: 2a 2a 20 74 61 62 6c 65 2e 20 20 42 75 74 20 74  ** table.  But t
3530: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
3540: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
3550: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
3560: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
3570: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
3580: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
3590: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
35a0: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 6f  itical.** path o
35b0: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
35c0: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
35d0: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
35e0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
35f0: 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a 73 74  lockList = 0;.st
3600: 61 74 69 63 20 73 74 72 75 63 74 20 6f 70 65 6e  atic struct open
3610: 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20  Cnt *openList = 
3620: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f  0;../*.** The lo
3630: 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61 72 65  cking styles are
3640: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3650: 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 66   the different f
3660: 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
3670: 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 70 70  apabilities supp
3680: 6f 72 74 65 64 20 62 79 20 64 69 66 66 65 72 65  orted by differe
3690: 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  nt file systems.
36a0: 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c    .**.** POSIX l
36b0: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66 75 6c  ocking style ful
36c0: 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68 61 72  ly supports shar
36d0: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
36e0: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
36f0: 73 20 0a 2a 2a 20 41 46 50 20 6c 6f 63 6b 69 6e  s .** AFP lockin
3700: 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  g only supports 
3710: 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
3720: 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c  ange locks.** FL
3730: 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  OCK only support
3740: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d  s a single file-
3750: 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69 76 65  global exclusive
3760: 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b   lock.** DOTLOCK
3770: 20 69 73 6e 27 74 20 61 20 74 72 75 65 20 6c 6f   isn't a true lo
3780: 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69 74 20  cking style, it 
3790: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 75 73  refers to the us
37a0: 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c 0a 2a  e of a special.*
37b0: 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64 20 74  *   file named t
37c0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64  he same as the d
37d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
37e0: 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65  h a '.lock' exte
37f0: 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20  nsion, this.**  
3800: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
3810: 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61  file systems tha
3820: 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61  t do not offer a
3830: 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69 6c 65  ny reliable file
3840: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c   locking.** NO l
3850: 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74 68 61  ocking means tha
3860: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
3870: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3880: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3890: 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d  d for.**   read-
38a0: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
38b0: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55  s currently.** U
38c0: 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61 6e 73  NSUPPORTED means
38d0: 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67   that no locking
38e0: 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74   will be attempt
38f0: 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  ed, this is only
3900: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66   used for.**   f
3910: 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61 74  ile systems that
3920: 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   are known to be
3930: 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a   unsupported.*/.
3940: 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f  #define LOCKING_
3950: 53 54 59 4c 45 5f 50 4f 53 49 58 20 20 20 20 20  STYLE_POSIX     
3960: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4c 4f 43     1.#define LOC
3970: 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20  KING_STYLE_NONE 
3980: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
3990: 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  e LOCKING_STYLE_
39a0: 44 4f 54 46 49 4c 45 20 20 20 20 20 20 33 0a 23  DOTFILE      3.#
39b0: 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53  define LOCKING_S
39c0: 54 59 4c 45 5f 46 4c 4f 43 4b 20 20 20 20 20 20  TYLE_FLOCK      
39d0: 20 20 34 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b    4.#define LOCK
39e0: 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 20 20  ING_STYLE_AFP   
39f0: 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20         5../*.** 
3a00: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
3a10: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
3a20: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
3a30: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
3a40: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
3a50: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
3a60: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
3a70: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
3a80: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
3a90: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
3aa0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
3ab0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
3ac0: 53 59 29 29 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  SY))../*.** Help
3ad0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
3ae0: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
3af0: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
3b00: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
3b10: 63 20 76 6f 69 64 20 65 6e 74 65 72 4d 75 74 65  c void enterMute
3b20: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
3b30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
3b40: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
3b50: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
3b60: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
3b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61  .static void lea
3b80: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
3b90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3ba0: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
3bb0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
3bc0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
3bd0: 52 29 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  R));.}..#if SQLI
3be0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 2f 2a  TE_THREADSAFE./*
3bf0: 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c  .** This variabl
3c00: 65 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  e records whethe
3c10: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
3c20: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
3c30: 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63  ch others.** loc
3c40: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ks..**.**    0: 
3c50: 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61   No.  Threads ca
3c60: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
3c70: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
3c80: 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20  .**    1:  Yes. 
3c90: 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   Threads can ove
3ca0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3cb0: 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31  s locks..**   -1
3cc0: 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77  :  We don't know
3cd0: 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73   yet..**.** On s
3ce0: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20  ome systems, we 
3cf0: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
3d00: 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20  time if threads 
3d10: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
3d20: 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b  h.** others lock
3d30: 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73  s.  On those sys
3d40: 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45  tems, the SQLITE
3d50: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3d60: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77  _LOCK macro.** w
3d70: 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f  ill be set appro
3d80: 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74  priately.  On ot
3d90: 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20  her systems, we 
3da0: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74  have to check at
3db0: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e  .** runtime.  On
3dc0: 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79   these latter sy
3dd0: 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48  stems, SQLTIE_TH
3de0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
3df0: 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e  CK is.** undefin
3e00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
3e10: 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79  ariable normally
3e20: 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20   has file scope 
3e30: 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e  only.  But durin
3e40: 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61  g testing, we ma
3e50: 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61  ke.** it a globa
3e60: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65  l so that the te
3e70: 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e  st code can chan
3e80: 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20  ge its value in 
3e90: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a  order to verify.
3ea0: 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ** that the righ
3eb0: 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20  t stuff happens 
3ec0: 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a  in either case..
3ed0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3ee0: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
3ef0: 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
3f00: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3f10: 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23  ERRIDE_LOCK -1.#
3f20: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3f30: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72  ITE_TEST.int thr
3f40: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
3f50: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51  OthersLocks = SQ
3f60: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3f70: 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65  RIDE_LOCK;.#else
3f80: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65  .static int thre
3f90: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
3fa0: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c  thersLocks = SQL
3fb0: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3fc0: 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  IDE_LOCK;.#endif
3fd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
3fe0: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
3ff0: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
4000: 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  into individual 
4010: 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20  test.** threads 
4020: 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61  by the testThrea
4030: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4040: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
4050: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
4060: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b  Data {.  int fd;
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f  /* File to be lo
4090: 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  cked */.  struct
40a0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20   flock lock;    
40b0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20   /* The locking 
40c0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
40d0: 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20  nt result;      
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
40f0: 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  of the locking o
4100: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  peration */.};..
4110: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
4120: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
4130: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
4140: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
4150: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4160: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
4170: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
4180: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
4190: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
41a0: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
41b0: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
41c0: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
41d0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
41e0: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
41f0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
4200: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
4210: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
4220: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
4230: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
4240: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
4250: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
4260: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
4270: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
4280: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
4290: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
42a0: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
42b0: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
42c0: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
42d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
42e0: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
42f0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
4300: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4310: 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70  s = fcntl(fd, op
4320: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
4330: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4340: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
4350: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
4360: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
4370: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
4380: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
4390: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
43a0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
43b0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
43c0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
43d0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
43e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
43f0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4400: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
4410: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
4420: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4430: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4440: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
4450: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e  SET );.  s = fcn
4460: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
4470: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
4480: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
4490: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
44a0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
44b0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
44c0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
44d0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
44e0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
44f0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
4500: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
4510: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
4520: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
4530: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
4540: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
4550: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
4560: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
4570: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
4580: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74  2 = *p;.    fcnt
4590: 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  l(fd, F_GETLK, &
45a0: 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e  l2);.    if( l2.
45b0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
45c0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
45d0: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "RDLCK";.    }e
45e0: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
45f0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
4600: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
4610: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
4620: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4630: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  UNLCK ){.      z
4640: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
4650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4660: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
4670: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4680: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4690: 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e  l-failure-reason
46a0: 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22  : %s %d %d %d\n"
46b0: 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20  ,.       zType, 
46c0: 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c  (int)l2.l_start,
46d0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20   (int)l2.l_len, 
46e0: 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a  (int)l2.l_pid);.
46f0: 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61    }.  errno = sa
4700: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75  vedErrno;.  retu
4710: 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  rn s;.}.#define 
4720: 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  fcntl lockTrace.
4730: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4740: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
4750: 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74 54 68  /*.** The testTh
4760: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4770: 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 6c 61  ior() routine la
4780: 75 6e 63 68 65 73 20 74 77 6f 20 73 65 70 61 72  unches two separ
4790: 61 74 65 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f  ate.** threads o
47a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  n this routine. 
47b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
47c0: 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61  tempts to lock a
47d0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
47e0: 74 6f 72 20 74 68 65 6e 20 72 65 74 75 72 6e 73  tor then returns
47f0: 2e 20 20 54 68 65 20 73 75 63 63 65 73 73 20 6f  .  The success o
4800: 72 20 66 61 69 6c 75 72 65 20 6f 66 20 74 68 61  r failure of tha
4810: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c  t attempt.** all
4820: 6f 77 73 20 74 68 65 20 74 65 73 74 54 68 72 65  ows the testThre
4830: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
4840: 72 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  r() procedure to
4850: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
4860: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
4870: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
4880: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
4890: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
48a0: 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69  oid *threadLocki
48b0: 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41 72  ngTest(void *pAr
48c0: 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68 72  g){.  struct thr
48d0: 65 61 64 54 65 73 74 44 61 74 61 20 2a 70 44 61  eadTestData *pDa
48e0: 74 61 20 3d 20 28 73 74 72 75 63 74 20 74 68 72  ta = (struct thr
48f0: 65 61 64 54 65 73 74 44 61 74 61 2a 29 70 41 72  eadTestData*)pAr
4900: 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73 75  g;.  pData->resu
4910: 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74 61  lt = fcntl(pData
4920: 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  ->fd, F_SETLK, &
4930: 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20  pData->lock);.  
4940: 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a  return pArg;.}..
4950: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65  /*.** This proce
4960: 64 75 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f  dure attempts to
4970: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
4980: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
4990: 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64  s.** can overrid
49a0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
49b0: 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20 74 68  cks then sets th
49c0: 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65  e .** threadsOve
49d0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
49e0: 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70  ocks variable ap
49f0: 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a  propriately..*/.
4a00: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
4a10: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
4a20: 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69  avior(int fd_ori
4a30: 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  g){.  int fd;.  
4a40: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
4a50: 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74  tData d[2];.  pt
4a60: 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20  hread_t t[2];.. 
4a70: 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69   fd = dup(fd_ori
4a80: 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  g);.  if( fd<0 )
4a90: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
4aa0: 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  t(d, 0, sizeof(d
4ab0: 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20  ));.  d[0].fd = 
4ac0: 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e  fd;.  d[0].lock.
4ad0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
4ae0: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
4af0: 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e  len = 1;.  d[0].
4b00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30  lock.l_start = 0
4b10: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
4b20: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
4b30: 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d  T;.  d[1] = d[0]
4b40: 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[1].lock.l_
4b50: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
4b60: 20 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65    pthread_create
4b70: 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61  (&t[0], 0, threa
4b80: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64  dLockingTest, &d
4b90: 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f  [0]);.  pthread_
4ba0: 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c  create(&t[1], 0,
4bb0: 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65   threadLockingTe
4bc0: 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74  st, &d[1]);.  pt
4bd0: 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c  hread_join(t[0],
4be0: 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a   0);.  pthread_j
4bf0: 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20  oin(t[1], 0);.  
4c00: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74 68 72  close(fd);.  thr
4c10: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
4c20: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64  OthersLocks =  d
4c30: 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26  [0].result==0 &&
4c40: 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b   d[1].result==0;
4c50: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4c60: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a  ITE_THREADSAFE *
4c70: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  /../*.** Release
4c80: 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75   a lockInfo stru
4c90: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
4ca0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
4cb0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f  ndLockInfo()..*/
4cc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
4cd0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72  easeLockInfo(str
4ce0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
4cf0: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 70 4c 6f 63  ock){.  if( pLoc
4d00: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
4d10: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
4d20: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
4d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  {.      if( pLoc
4d40: 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  k->pPrev ){.    
4d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
4d60: 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  k->pPrev->pNext=
4d70: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
4d80: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e    pLock->pPrev->
4d90: 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pNext = pLock->p
4da0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
4db0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4dc0: 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f  t( lockList==pLo
4dd0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f  ck );.        lo
4de0: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e  ckList = pLock->
4df0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
4e00: 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e       if( pLock->
4e10: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
4e20: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
4e30: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c  pNext->pPrev==pL
4e40: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ock );.        p
4e50: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
4e60: 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65  ev = pLock->pPre
4e70: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
4e80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
4e90: 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock);.    }.  }.
4ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
4eb0: 20 61 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63   a openCnt struc
4ec0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4ed0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4ee0: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4ef0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4f00: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
4f10: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
4f20: 29 7b 0a 20 20 69 66 28 20 70 4f 70 65 6e 20 29  ){.  if( pOpen )
4f30: 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65  {.    pOpen->nRe
4f40: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  f--;.    if( pOp
4f50: 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  en->nRef==0 ){. 
4f60: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e       if( pOpen->
4f70: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
4f80: 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e   assert( pOpen->
4f90: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f  pPrev->pNext==pO
4fa0: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pen );.        p
4fb0: 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Open->pPrev->pNe
4fc0: 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  xt = pOpen->pNex
4fd0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
4fe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4ff0: 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20  openList==pOpen 
5000: 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 4c  );.        openL
5010: 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65  ist = pOpen->pNe
5020: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
5030: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65    if( pOpen->pNe
5040: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
5050: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65  sert( pOpen->pNe
5060: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e  xt->pPrev==pOpen
5070: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65   );.        pOpe
5080: 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  n->pNext->pPrev 
5090: 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a  = pOpen->pPrev;.
50a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
50b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e  lite3_free(pOpen
50c0: 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20  ->aPending);.   
50d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
50e0: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pOpen);.    }.  
50f0: 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  }.}..#if SQLITE_
5100: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
5110: 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74 73  TYLE./*.** Tests
5120: 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f   a byte-range lo
5130: 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20 73  cking query to s
5140: 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67 65  ee if byte range
5150: 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20 73   locks are .** s
5160: 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f 74  upported, if not
5170: 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   we fall back to
5180: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53   dotlockLockingS
5190: 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tyle..*/.static 
51a0: 69 6e 74 20 74 65 73 74 4c 6f 63 6b 69 6e 67 53  int testLockingS
51b0: 74 79 6c 65 28 69 6e 74 20 66 64 29 7b 0a 20 20  tyle(int fd){.  
51c0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
51d0: 6b 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 54 65 73  kInfo;..  /* Tes
51e0: 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
51f0: 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
5200: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
5210: 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
5220: 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
5230: 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
5240: 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
5250: 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
5260: 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
5270: 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
5280: 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
5290: 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
52a0: 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
52b0: 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
52c0: 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74  DLCK;.  if( fcnt
52d0: 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  l(fd, F_GETLK, &
52e0: 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
52f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 43  {.    return LOC
5300: 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58  KING_STYLE_POSIX
5310: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 65  ;.  }.  .  /* Te
5320: 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 28  sting for flock(
5330: 29 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73 65  ) can give false
5340: 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f 20   positives.  So 
5350: 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65 20  if if the above 
5360: 0a 20 20 2a 2a 20 74 65 73 74 20 66 61 69 6c 73  .  ** test fails
5370: 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62  , then we fall b
5380: 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74  ack to using dot
5390: 2d 66 69 6c 65 20 73 74 79 6c 65 20 6c 6f 63 6b  -file style lock
53a0: 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65  ing..  */  .  re
53b0: 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  turn LOCKING_STY
53c0: 4c 45 5f 44 4f 54 46 49 4c 45 3b 0a 7d 0a 23 65  LE_DOTFILE;.}.#e
53d0: 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 49 66 20  ndif../* .** If 
53e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
53f0: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 64  CKING_STYLE is d
5400: 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  efined, this fun
5410: 63 74 69 6f 6e 20 45 78 61 6d 69 6e 65 73 20 74  ction Examines t
5420: 68 65 20 0a 2a 2a 20 66 5f 66 73 74 79 70 65 6e  he .** f_fstypen
5430: 61 6d 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ame entry in the
5440: 20 73 74 61 74 66 73 20 73 74 72 75 63 74 75 72   statfs structur
5450: 65 20 61 73 20 72 65 74 75 72 6e 65 64 20 62 79  e as returned by
5460: 20 73 74 61 74 28 29 20 66 6f 72 20 0a 2a 2a 20   stat() for .** 
5470: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
5480: 68 6f 73 74 69 6e 67 20 74 68 65 20 64 61 74 61  hosting the data
5490: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
54a0: 6c 65 63 74 73 20 20 74 68 65 20 61 70 70 72 6f  lects  the appro
54b0: 70 72 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  priate.** lockin
54c0: 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f 6e  g style based on
54d0: 20 69 74 73 20 76 61 6c 75 65 2e 20 20 54 68 65   its value.  The
54e0: 73 65 20 76 61 6c 75 65 73 20 61 6e 64 20 61 73  se values and as
54f0: 73 69 67 6e 6d 65 6e 74 73 20 61 72 65 20 0a 2a  signments are .*
5500: 2a 20 62 61 73 65 64 20 6f 6e 20 44 61 72 77 69  * based on Darwi
5510: 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f 72 20 61  n/OSX behavior a
5520: 6e 64 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  nd have not been
5530: 20 74 68 6f 72 6f 75 67 68 6c 79 20 74 65 73 74   thoroughly test
5540: 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20  ed on .** other 
5550: 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 49  systems..**.** I
5560: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5570: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
5580: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68   not defined, th
5590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
55a0: 79 73 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4c 4f  ys.** returns LO
55b0: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49  CKING_STYLE_POSI
55c0: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
55d0: 20 64 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74   detectLockingSt
55e0: 79 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  yle(.  sqlite3_v
55f0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
5600: 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
5610: 2c 20 0a 20 20 69 6e 74 20 66 64 0a 29 7b 0a 23  , .  int fd.){.#
5620: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
5630: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
5640: 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
5650: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
5660: 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 0a 20   *zFilesystem;. 
5670: 20 20 20 69 6e 74 20 65 4c 6f 63 6b 69 6e 67 53     int eLockingS
5680: 74 79 6c 65 3b 0a 20 20 7d 20 61 4d 61 70 5b 5d  tyle;.  } aMap[]
5690: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
56a0: 2c 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  ,    LOCKING_STY
56b0: 4c 45 5f 50 4f 53 49 58 20 7d 2c 0a 20 20 20 20  LE_POSIX },.    
56c0: 7b 20 22 75 66 73 22 2c 20 20 20 20 4c 4f 43 4b  { "ufs",    LOCK
56d0: 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 20  ING_STYLE_POSIX 
56e0: 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
56f0: 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ,  LOCKING_STYLE
5700: 5f 41 46 50 20 7d 2c 0a 23 69 66 64 65 66 20 53  _AFP },.#ifdef S
5710: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50  QLITE_ENABLE_AFP
5720: 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20  _LOCKING_SMB.   
5730: 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 4c 4f 43   { "smbfs",  LOC
5740: 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 7d  KING_STYLE_AFP }
5750: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
5760: 6d 62 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f  mbfs",  LOCKING_
5770: 53 54 59 4c 45 5f 46 4c 4f 43 4b 20 7d 2c 0a 23  STYLE_FLOCK },.#
5780: 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 6d 73 64  endif.    { "msd
5790: 6f 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54  os",  LOCKING_ST
57a0: 59 4c 45 5f 44 4f 54 46 49 4c 45 20 7d 2c 0a 20  YLE_DOTFILE },. 
57b0: 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 4c     { "webdav", L
57c0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e  OCKING_STYLE_NON
57d0: 45 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  E },.    { 0, 0 
57e0: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
57f0: 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
5800: 66 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  fsInfo;..  if( !
5810: 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
5820: 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53  return LOCKING_S
5830: 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  TYLE_NONE;.  }. 
5840: 20 69 66 28 20 70 56 66 73 2d 3e 70 41 70 70 44   if( pVfs->pAppD
5850: 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ata ){.    retur
5860: 6e 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  n SQLITE_PTR_TO_
5870: 49 4e 54 28 70 56 66 73 2d 3e 70 41 70 70 44 61  INT(pVfs->pAppDa
5880: 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ta);.  }..  if( 
5890: 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
58a0: 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
58b0: 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
58c0: 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
58d0: 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
58e0: 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53  return LOCKING_S
58f0: 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  TYLE_NONE;.    }
5900: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
5910: 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
5920: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
5930: 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
5940: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
5950: 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
5960: 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
5970: 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
5980: 2e 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  .eLockingStyle;.
5990: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
59a0: 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
59b0: 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
59c0: 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
59d0: 6e 66 73 22 2e 20 2a 2f 0a 20 20 72 65 74 75 72  nfs". */.  retur
59e0: 6e 20 74 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79  n testLockingSty
59f0: 6c 65 28 66 64 29 3b 20 20 0a 23 65 6e 64 69 66  le(fd);  .#endif
5a00: 0a 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e  .  return LOCKIN
5a10: 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 3b 0a 7d  G_STYLE_POSIX;.}
5a20: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
5a30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
5a40: 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f   locate lockInfo
5a50: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72   and openCnt str
5a60: 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20  uctures that.** 
5a70: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
5a80: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5a90: 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73   Create new ones
5aa0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
5ab0: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
5ac0: 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e  lues might be un
5ad0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
5ae0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
5af0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
5b00: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
5b10: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
5b20: 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e  c int findLockIn
5b30: 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20  fo(.  int fd,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
5b60: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 69  escriptor used i
5b70: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  n the key */.  s
5b80: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
5b90: 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52  *ppLock,    /* R
5ba0: 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e  eturn the lockIn
5bb0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72  fo structure her
5bc0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70  e */.  struct op
5bd0: 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20  enCnt **ppOpen  
5be0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
5bf0: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  e openCnt struct
5c00: 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ure here */.){. 
5c10: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
5c20: 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a  t lockKey key1;.
5c30: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79    struct openKey
5c40: 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20   key2;.  struct 
5c50: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5c60: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5c70: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
5c80: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
5c90: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64  .  rc = fstat(fd
5ca0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
5cb0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 23 69 66 64  f( rc!=0 ){.#ifd
5cc0: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
5cd0: 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4f 56 45   if( errno==EOVE
5ce0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
5cf0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
5d00: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
5d10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
5d20: 0a 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  ..  /* On OS X o
5d30: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
5d40: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
5d50: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
5d60: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
5d70: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
5d80: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
5d90: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
5da0: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
5db0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
5dc0: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
5dd0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
5de0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
5df0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
5e00: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
5e10: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
5e20: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
5e30: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
5e40: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
5e50: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
5e60: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
5e70: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
5e80: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
5e90: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
5ea0: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
5eb0: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
5ec0: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
5ed0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5ee0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
5ef0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
5f00: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
5f10: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
5f20: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
5f30: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
5f40: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
5f50: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
5f60: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
5f70: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
5f80: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
5f90: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 72  ize==0 ){.    wr
5fa0: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
5fb0: 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74 28  .    rc = fstat(
5fc0: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
5fd0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
5fe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5ff0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
6000: 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26  .  }..  memset(&
6010: 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28  key1, 0, sizeof(
6020: 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64  key1));.  key1.d
6030: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
6040: 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20  dev;.  key1.ino 
6050: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
6060: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ;.#if SQLITE_THR
6070: 45 41 44 53 41 46 45 0a 20 20 69 66 28 20 74 68  EADSAFE.  if( th
6080: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
6090: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29  hOthersLocks<0 )
60a0: 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64  {.    testThread
60b0: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
60c0: 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e  fd);.  }.  key1.
60d0: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
60e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
60f0: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
6100: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
6110: 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32  f.  memset(&key2
6120: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  , 0, sizeof(key2
6130: 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d  ));.  key2.dev =
6140: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
6150: 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74  .  key2.ino = st
6160: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20  atbuf.st_ino;.  
6170: 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74  pLock = lockList
6180: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b  ;.  while( pLock
6190: 20 26 26 20 6d 65 6d 63 6d 70 28 26 6b 65 79 31   && memcmp(&key1
61a0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73  , &pLock->key, s
61b0: 69 7a 65 6f 66 28 6b 65 79 31 29 29 20 29 7b 0a  izeof(key1)) ){.
61c0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63      pLock = pLoc
61d0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  k->pNext;.  }.  
61e0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
61f0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69      pLock = sqli
6200: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
6210: 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20  of(*pLock) );.  
6220: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
6230: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6240: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6250: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
6260: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20  ockinfo;.    }. 
6270: 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20     pLock->key = 
6280: 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  key1;.    pLock-
6290: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
62a0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  Lock->cnt = 0;. 
62b0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
62c0: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63  pe = 0;.    pLoc
62d0: 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c  k->pNext = lockL
62e0: 69 73 74 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ist;.    pLock->
62f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
6300: 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c 6f  f( lockList ) lo
6310: 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  ckList->pPrev = 
6320: 70 4c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 4c  pLock;.    lockL
6330: 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ist = pLock;.  }
6340: 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  else{.    pLock-
6350: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
6360: 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  ppLock = pLock;.
6370: 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20    if( ppOpen!=0 
6380: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f  ){.    pOpen = o
6390: 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  penList;.    whi
63a0: 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d  le( pOpen && mem
63b0: 63 6d 70 28 26 6b 65 79 32 2c 20 26 70 4f 70 65  cmp(&key2, &pOpe
63c0: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b  n->key, sizeof(k
63d0: 65 79 32 29 29 20 29 7b 0a 20 20 20 20 20 20 70  ey2)) ){.      p
63e0: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Open = pOpen->pN
63f0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
6400: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
6410: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c       pOpen = sql
6420: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
6430: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
6440: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
6450: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
6460: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
6470: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
6480: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6490: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
64a0: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
64b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
64c0: 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b  pen->key = key2;
64d0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
64e0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ef = 1;.      pO
64f0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a  pen->nLock = 0;.
6500: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
6510: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
6520: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
6530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
6540: 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c  n->pNext = openL
6550: 69 73 74 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ist;.      pOpen
6560: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
6570: 20 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20     if( openList 
6580: 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65  ) openList->pPre
6590: 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20  v = pOpen;.     
65a0: 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65   openList = pOpe
65b0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
65c0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b      pOpen->nRef+
65d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  +;.    }.    *pp
65e0: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Open = pOpen;.  
65f0: 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  }..exit_findlock
6600: 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72  info:.  return r
6610: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
6620: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6630: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
6640: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
6650: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
6660: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
6670: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
6680: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
6690: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
66a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
66b0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
66c0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
66d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
66e0: 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e  *locktypeName(in
66f0: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73  t locktype){.  s
6700: 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20  witch( locktype 
6710: 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43  ){.  case NO_LOC
6720: 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22  K: return "NONE"
6730: 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f  ;.  case SHARED_
6740: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
6750: 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45  ARED";.  case RE
6760: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SERVED_LOCK: ret
6770: 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a  urn "RESERVED";.
6780: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
6790: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
67a0: 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58  DING";.  case EX
67b0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
67c0: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
67d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
67e0: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
67f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
6800: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  e currently in a
6810: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
6820: 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61  d than the threa
6830: 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e  d that the.** un
6840: 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20  ixFile argument 
6850: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e  belongs to, then
6860: 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73   transfer owners
6870: 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46  hip of the unixF
6880: 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74  ile.** over to t
6890: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
68a0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46  d..**.** A unixF
68b0: 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65  ile is only owne
68c0: 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e  d by a thread on
68d0: 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f   systems where o
68e0: 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20  ne thread is.** 
68f0: 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69  unable to overri
6900: 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64  de locks created
6910: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
6920: 74 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39  thread.  RedHat9
6930: 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c   is.** an exampl
6940: 65 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74  e of such a syst
6950: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73  em..**.** Owners
6960: 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20  hip transfer is 
6970: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20  only allowed if 
6980: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20  the unixFile is 
6990: 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
69a0: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e  ed..** If the un
69b0: 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  ixFile is locked
69c0: 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69   and an ownershi
69d0: 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e  p is wrong, then
69e0: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
69f0: 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54  E_MISUSE.  SQLIT
6a00: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6a10: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
6a20: 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  orks..*/.#if SQL
6a30: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73  ITE_THREADSAFE.s
6a40: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66  tatic int transf
6a50: 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78  erOwnership(unix
6a60: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
6a70: 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
6a80: 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28  d_t hSelf;.  if(
6a90: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
6aa0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
6ab0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73  ){.    /* Owners
6ac0: 68 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f  hip transfers no
6ad0: 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73  t needed on this
6ae0: 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72   system */.    r
6af0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b00: 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70  .  }.  hSelf = p
6b10: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
6b20: 20 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75   if( pthread_equ
6b30: 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68  al(pFile->tid, h
6b40: 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Self) ){.    /* 
6b50: 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  We are still in 
6b60: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20  the same thread 
6b70: 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28  */.    OSTRACE1(
6b80: 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61  "No-transfer, sa
6b90: 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20  me thread\n");. 
6ba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6bb0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
6bc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
6bd0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
6be0: 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e  * We cannot chan
6bf0: 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69  ge ownership whi
6c00: 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  le we are holdin
6c10: 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20  g a lock! */.   
6c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6c30: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54  ISUSE;.  }.  OST
6c40: 52 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20  RACE4("Transfer 
6c50: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20  ownership of %d 
6c60: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
6c70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ,.            pF
6c80: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74  ile->h, pFile->t
6c90: 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46  id, hSelf);.  pF
6ca0: 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66  ile->tid = hSelf
6cb0: 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70  ;.  if (pFile->p
6cc0: 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Lock != NULL) {.
6cd0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
6ce0: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
6cf0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
6d00: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
6d10: 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  h, &pFile->pLock
6d20: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
6d30: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
6d40: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
6d50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
6d60: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
6d70: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
6d80: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
6d90: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
6da0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
6db0: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
6dc0: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
6dd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
6de0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
6df0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6e00: 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e  .}.#else.  /* On
6e10: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
6e20: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
6e30: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
6e40: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
6e50: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
6e60: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
6e70: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
6e80: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
6e90: 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
6ea0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6eb0: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
6ec0: 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
6ed0: 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
6ee0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6ef0: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
6f00: 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
6f10: 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
6f20: 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
6f30: 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
6f40: 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
6f50: 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
6f60: 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
6f70: 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
6f80: 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
6f90: 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
6fa0: 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
6fb0: 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
6fc0: 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
6fd0: 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
6fe0: 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
6ff0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
7000: 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
7010: 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
7020: 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
7030: 36 38 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  681..*/.static i
7040: 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
7050: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
7060: 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
7070: 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
7080: 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
7090: 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  ot;.  i64 newOff
70a0: 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  set;.  TIMER_STA
70b0: 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
70c0: 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74  USE_PREAD).  got
70d0: 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20   = pread(id->h, 
70e0: 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
70f0: 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  t);.  SimulateIO
7100: 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
7110: 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
7120: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
7130: 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64  got = pread64(id
7140: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
7150: 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c  offset);.  Simul
7160: 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
7170: 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
7180: 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
7190: 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
71a0: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69   SEEK_SET);.  Si
71b0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
71c0: 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
71d0: 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
71e0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74  ffset ){.    ret
71f0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f  urn -1;.  }.  go
7200: 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20  t = read(id->h, 
7210: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
7220: 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
7230: 20 20 4f 53 54 52 41 43 45 35 28 22 52 45 41 44    OSTRACE5("READ
7240: 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
7250: 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
7260: 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
7270: 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
7280: 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
7290: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
72a0: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
72b0: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
72c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
72d0: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
72e0: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
72f0: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
7300: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
7310: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
7320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
7330: 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
7340: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
7350: 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
7360: 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
7370: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
7380: 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  {.  int got;.  a
7390: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 67  ssert( id );.  g
73a0: 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
73b0: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
73c0: 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
73d0: 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
73e0: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
73f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
7400: 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
7410: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7420: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
7430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
7440: 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
7450: 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
7460: 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
7470: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
7480: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
7490: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
74a0: 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
74b0: 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
74c0: 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
74d0: 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
74e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
74f0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
7500: 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
7510: 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ffset..*/.static
7520: 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
7530: 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
7540: 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
7550: 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
7560: 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
7570: 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
7580: 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
7590: 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
75a0: 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
75b0: 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20  = pwrite(id->h, 
75c0: 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
75d0: 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  t);.#elif define
75e0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
75f0: 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28   got = pwrite64(
7600: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
7610: 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65  , offset);.#else
7620: 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
7630: 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
7640: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
7650: 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
7660: 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65  offset ){.    re
7670: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
7680: 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68  ot = write(id->h
7690: 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
76a0: 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
76b0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57 52  ;.  OSTRACE5("WR
76c0: 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
76d0: 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
76e0: 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
76f0: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
7700: 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
7710: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
7720: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
7730: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
7740: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7750: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
7760: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
7770: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
7780: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
7790: 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
77a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
77b0: 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
77c0: 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
77d0: 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
77e0: 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
77f0: 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
7800: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
7810: 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
7820: 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ;.  while( amt>0
7830: 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
7840: 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46  kAndWrite((unixF
7850: 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c  ile*)id, offset,
7860: 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
7870: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
7880: 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
7890: 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
78a0: 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
78b0: 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
78c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
78d0: 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
78e0: 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
78f0: 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
7900: 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
7910: 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e  1 ));.  if( amt>
7920: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
7930: 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  te<0 ){.      re
7940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7950: 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
7960: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
7970: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
7980: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
79a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
79b0: 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
79c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
79d0: 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
79e0: 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
79f0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
7a00: 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
7a10: 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
7a20: 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
7a30: 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
7a40: 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
7a50: 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
7a60: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
7a70: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
7a80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ../*.** Use the 
7a90: 66 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20  fdatasync() API 
7aa0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45  only if the HAVE
7ab0: 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f  _FDATASYNC macro
7ac0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20   is defined..** 
7ad0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73  Otherwise use fs
7ae0: 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61  ync() in its pla
7af0: 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48  ce..*/.#ifndef H
7b00: 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
7b10: 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
7b20: 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
7b30: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
7b40: 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
7b50: 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
7b60: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
7b70: 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
7b80: 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
7b90: 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
7ba0: 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
7bb0: 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
7bc0: 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
7bd0: 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
7be0: 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
7bf0: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
7c00: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
7c10: 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
7c20: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
7c30: 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
7c40: 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
7c50: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
7c60: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
7c70: 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
7c80: 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
7c90: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
7ca0: 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
7cb0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
7cc0: 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
7cd0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
7ce0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
7cf0: 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
7d00: 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
7d10: 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
7d20: 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
7d30: 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
7d40: 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
7d50: 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
7d60: 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
7d70: 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
7d80: 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
7d90: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
7da0: 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
7db0: 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
7dc0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
7dd0: 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
7de0: 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
7df0: 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
7e00: 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
7e10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
7e20: 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
7e30: 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
7e40: 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
7e50: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
7e60: 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72   rc;..  /* Recor
7e70: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7e80: 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
7e90: 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
7ea0: 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
7eb0: 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
7ec0: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
7ed0: 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
7ee0: 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
7ef0: 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
7f00: 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
7f10: 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
7f20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7f30: 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
7f40: 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
7f50: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
7f60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
7f70: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
7f80: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
7f90: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
7fa0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
7fb0: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
7fc0: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
7fd0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
7fe0: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
7ff0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
8000: 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c  se..#if HAVE_FUL
8010: 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
8020: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
8030: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
8040: 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
8050: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
8060: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
8070: 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
8080: 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
8090: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
80a0: 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49 74 20  sync()..   * It 
80b0: 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
80c0: 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
80d0: 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
80e0: 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66  he local .   * f
80f0: 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
8100: 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
8110: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
8120: 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20 69 73  ULLFSYNC.   * is
8130: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
8140: 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
8150: 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
8160: 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a 20 61  an fsync .   * a
8170: 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
8180: 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
8190: 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
81a0: 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
81b0: 20 20 20 2a 20 49 74 27 64 20 62 65 20 62 65 74     * It'd be bet
81c0: 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
81d0: 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
81e0: 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
81f0: 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c 20 63     * the fcntl c
8200: 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
8210: 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
8220: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
8230: 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
8240: 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20 64 61  .#else .  if( da
8250: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
8260: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
8270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8280: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
8290: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56   }.#endif /* HAV
82a0: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 23  E_FULLFSYNC */.#
82b0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
82c0: 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
82d0: 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   */..  return rc
82e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
82f0: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
8300: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
8310: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
8320: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
8330: 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
8340: 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
8350: 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
8360: 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
8370: 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
8380: 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
8390: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
83a0: 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
83b0: 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
83c0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
83d0: 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
83e0: 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
83f0: 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
8400: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
8410: 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
8420: 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
8430: 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
8440: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
8450: 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
8460: 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
8470: 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
8480: 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
8490: 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
84a0: 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
84b0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
84c0: 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
84d0: 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
84e0: 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
84f0: 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
8500: 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
8510: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
8520: 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
8530: 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
8540: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
8550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
8560: 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
8570: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
8580: 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
8590: 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
85a0: 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
85b0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
85c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
85d0: 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
85e0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
85f0: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
8600: 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
8610: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
8620: 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
8630: 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
8640: 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
8650: 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
8660: 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
8670: 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
8680: 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
8690: 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
86a0: 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
86b0: 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
86c0: 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
86d0: 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
86e0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
86f0: 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
8700: 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
8710: 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
8720: 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
8730: 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
8740: 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
8750: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
8760: 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
8770: 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
8780: 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
8790: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
87a0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
87b0: 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
87c0: 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
87d0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
87e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
87f0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  le );.  OSTRACE2
8800: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
8810: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
8820: 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
8830: 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
8840: 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
8850: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
8860: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
8870: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
8880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8890: 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69  R_FSYNC;.  }.  i
88a0: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
88b0: 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
88c0: 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E4("DIRSYNC %-3d
88d0: 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
88e0: 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
88f0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
8900: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  d,.            H
8910: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
8920: 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e  sFullsync);.#ifn
8930: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
8940: 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f  LE_DIRSYNC.    /
8950: 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
8960: 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74  sync is only att
8970: 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66  empted if full_f
8980: 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74  sync is.    ** t
8990: 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61  urned off or una
89a0: 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20  vailable.  If a 
89b0: 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72  full_fsync occur
89c0: 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a  red above,.    *
89d0: 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63  * then the direc
89e0: 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70  tory sync is sup
89f0: 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f  erfluous..    */
8a00: 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f  .    if( (!HAVE_
8a10: 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73  FULLFSYNC || !is
8a20: 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c  Fullsync) && ful
8a30: 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64  l_fsync(pFile->d
8a40: 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  irfd,0,0) ){.   
8a50: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a      /*.       **
8a60: 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65   We have receive
8a70: 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72  d multiple repor
8a80: 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65  ts of fsync() re
8a90: 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a  turning.       *
8aa0: 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70  * errors when ap
8ab0: 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f  plied to directo
8ac0: 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20  ries on certain 
8ad0: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20  file systems..  
8ae0: 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64       ** A failed
8af0: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
8b00: 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61  is not a big dea
8b10: 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a  l.  So it seems.
8b20: 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72         ** better
8b30: 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65   to ignore the e
8b40: 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31  rror.  Ticket #1
8b50: 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  657.       */.  
8b60: 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
8b70: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
8b80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8b90: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
8ba0: 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e  rfd);  /* Only n
8bb0: 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
8bc0: 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  , so close the d
8bd0: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
8be0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
8bf0: 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65  1;    /* when we
8c00: 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20   are done. */.  
8c10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8c20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8c30: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
8c40: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
8c50: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
8c60: 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
8c70: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
8c80: 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
8c90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
8ca0: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69  sert( id );.  Si
8cb0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
8cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8cd0: 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20  RR_TRUNCATE );. 
8ce0: 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
8cf0: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
8d00: 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
8d10: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
8d20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d30: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
8d40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
8d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
8d70: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
8d80: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
8d90: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
8da0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
8db0: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
8dc0: 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
8dd0: 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
8de0: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
8df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
8e00: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28  ;.  rc = fstat((
8e10: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
8e20: 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
8e30: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
8e40: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
8e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8e60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
8e70: 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
8e80: 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
8e90: 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
8ea0: 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
8eb0: 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
8ec0: 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65  LockInfo() proce
8ed0: 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
8ee0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
8ef0: 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
8f00: 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
8f10: 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
8f20: 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
8f30: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
8f40: 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
8f50: 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
8f60: 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
8f70: 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
8f80: 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
8f90: 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
8fa0: 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
8fb0: 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
8fc0: 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
8fd0: 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
8fe0: 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
8ff0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
9000: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
9010: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
9020: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
9030: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
9040: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
9050: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
9060: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
9070: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
9080: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
9090: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
90a0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
90b0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
90c0: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
90d0: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
90e0: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
90f0: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
9100: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
9110: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
9120: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
9130: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
9140: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
9150: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
9160: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
9170: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
9180: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
9190: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
91a0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
91b0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
91c0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
91d0: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
91e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
91f0: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
9200: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
9210: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
9220: 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30  rror) {.  case 0
9230: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
9240: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
9250: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
9260: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
9270: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
9280: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
9290: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
92a0: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
92b0: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
92c0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
92d0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
92e0: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
92f0: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
9300: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
9310: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
9320: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9330: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
9340: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
9350: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
9360: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
9370: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
9380: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
9390: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
93a0: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
93b0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
93c0: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  R_LOCK) || ..(sq
93d0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
93e0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
93f0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
9400: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
9410: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09  ERR_RDLOCK) ||..
9420: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
9430: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
9440: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
9450: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9460: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9470: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
9480: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
9490: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
94a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94b0: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73  PERM;.    .  cas
94c0: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
94d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
94e0: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  RR_BLOCKED;.    
94f0: 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21  .#if EOPNOTSUPP!
9500: 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20  =ENOTSUP.  case 
9510: 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20  EOPNOTSUPP: .   
9520: 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   /* something we
9530: 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79  nt terribly awry
9540: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
9550: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
9560: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
9570: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
9580: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
9590: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
95a0: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ys */.#endif.#if
95b0: 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61  def ENOTSUP.  ca
95c0: 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20  se ENOTSUP: .   
95d0: 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20   /* invalid fd, 
95e0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
95f0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
9600: 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  t introspection,
9610: 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20   in which .     
9620: 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  * it actually me
9630: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
9640: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73   */.#endif.  cas
9650: 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42  e EIO:.  case EB
9660: 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56  ADF:.  case EINV
9670: 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43  AL:.  case ENOTC
9680: 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44  ONN:.  case ENOD
9690: 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f  EV:.  case ENXIO
96a0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a  :.  case ENOENT:
96b0: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
96c0: 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20    case ENOSYS:. 
96d0: 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75     /* these shou
96e0: 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69  ld force the cli
96f0: 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ent to close the
9700: 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e   file and reconn
9710: 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65  ect */.    .  de
9720: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
9730: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
9740: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9750: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9760: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
9770: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
9780: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
9790: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
97a0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
97b0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
97c0: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
97d0: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
97e0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
97f0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
9800: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
9810: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
9820: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
9830: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
9840: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
9850: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
9860: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
9870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9880: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
9890: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
98a0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
98b0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
98c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
98d0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
98e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
98f0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
9900: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
9910: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
9920: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
9930: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
9940: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
9950: 6c 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74  le );.  enterMut
9960: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
9970: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
9980: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
9990: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
99a0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
99b0: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
99c0: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
99d0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
99e0: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
99f0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
9a00: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
9a10: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
9a20: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
9a30: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9a40: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
9a50: 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
9a60: 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  d ){.    struct 
9a70: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
9a80: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9a90: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
9aa0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
9ab0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
9ac0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
9ad0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9ae0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
9af0: 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70  f (-1 == fcntl(p
9b00: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
9b10: 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20  , &lock)) {.    
9b20: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
9b30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9b40: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
9b50: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
9b60: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
9b70: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
9b80: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
9b90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
9ba0: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
9bb0: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
9bc0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
9bd0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c      }.  }.  .  l
9bf0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
9c00: 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52  STRACE4("TEST WR
9c10: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e  -LOCK %d %d %d\n
9c20: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
9c30: 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a   reserved);..  *
9c40: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
9c50: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
9c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
9c70: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
9c80: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
9c90: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
9ca0: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
9cb0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
9cc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
9cd0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
9ce0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
9cf0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
9d00: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
9d10: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
9d20: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
9d30: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
9d40: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
9d50: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
9d60: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
9d70: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
9d80: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
9d90: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
9da0: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
9db0: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
9dc0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
9dd0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
9de0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
9df0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
9e00: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
9e10: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
9e20: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
9e30: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
9e40: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
9e50: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
9e60: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
9e70: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
9e80: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
9e90: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
9ea0: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
9eb0: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
9ec0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
9ed0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
9ee0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
9ef0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
9f00: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
9f10: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
9f20: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
9f30: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
9f40: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
9f50: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
9f60: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
9f70: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
9f80: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
9f90: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
9fa0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
9fb0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a   locktype){.  /*
9fc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
9fd0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
9fe0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
9ff0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
a000: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
a010: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
a020: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
a030: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
a040: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
a050: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
a060: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
a070: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
a080: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
a090: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
a0a0: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
a0b0: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
a0c0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
a0d0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
a0e0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
a0f0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
a100: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
a110: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
a120: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
a130: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
a140: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
a150: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
a160: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
a170: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
a180: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
a190: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
a1a0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
a1b0: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
a1c0: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
a1d0: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
a1e0: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
a1f0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
a200: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a210: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
a220: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
a230: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
a240: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
a250: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
a260: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
a270: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
a280: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
a290: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
a2a0: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
a2b0: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
a2c0: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
a2d0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
a2e0: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
a2f0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
a300: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
a310: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
a320: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
a330: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
a340: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a350: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
a360: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
a370: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
a380: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
a390: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
a3a0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
a3b0: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
a3c0: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
a3d0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
a3e0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
a3f0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
a400: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
a410: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
a420: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
a430: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
a440: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
a450: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
a460: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
a470: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
a480: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
a490: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
a4a0: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
a4b0: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
a4c0: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
a4d0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
a4e0: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
a4f0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
a500: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
a510: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a520: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
a530: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
a540: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
a550: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
a560: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
a570: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
a580: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
a590: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
a5a0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
a5b0: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
a5c0: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
a5d0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
a5e0: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
a5f0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
a600: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
a610: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
a620: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
a630: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
a640: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
a650: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
a660: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
a670: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
a680: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
a690: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a6a0: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
a6b0: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
a6c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
a6d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
a6e0: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
a6f0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
a700: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
a710: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a720: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
a730: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
a740: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
a750: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
a760: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
a770: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
a780: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
a790: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
a7a0: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
a7b0: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
a7c0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
a7d0: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
a7e0: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
a7f0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
a800: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a810: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
a820: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
a830: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
a840: 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69  nfo *pLock = pFi
a850: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  le->pLock;.  str
a860: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
a870: 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65    int s;..  asse
a880: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
a890: 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20  STRACE7("LOCK   
a8a0: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
a8b0: 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20  ,%d) pid=%d\n", 
a8c0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
a8d0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
a8e0: 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65  ktype), locktype
a8f0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
a900: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63  type),.      loc
a910: 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d  ktypeName(pLock-
a920: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63  >locktype), pLoc
a930: 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28  k->cnt , getpid(
a940: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
a950: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
a960: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
a970: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
a980: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
a990: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
a9a0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
a9b0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
a9c0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
a9d0: 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20  ** enterMutex() 
a9e0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
a9f0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
aa00: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
aa10: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
aa20: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f      OSTRACE3("LO
aa30: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
aa40: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22  already held)\n"
aa50: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
aa60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
aa70: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b  Name(locktype));
aa80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
aa90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
aaa0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
aab0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
aac0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
aad0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
aae0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
aaf0: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
ab00: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ab10: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
ab20: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
ab30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
ab40: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
ab50: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
ab60: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
ab70: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
ab80: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
ab90: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
aba0: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
abb0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
abc0: 0a 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74  .  */.  enterMut
abd0: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
abe0: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
abf0: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
ac00: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
ac10: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
ac20: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
ac30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac40: 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d  OK ){.    leaveM
ac50: 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
ac60: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f  rn rc;.  }.  pLo
ac70: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
ac80: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  k;..  /* If some
ac90: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
aca0: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
acb0: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
acc0: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
acd0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
ace0: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
acf0: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
ad00: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
ad10: 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  f( (pFile->lockt
ad20: 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ype!=pLock->lock
ad30: 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20  type && .       
ad40: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
ad50: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
ad60: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48  K || locktype>SH
ad70: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
ad80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ad90: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
ada0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
adb0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
adc0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
add0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
ade0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
adf0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
ae00: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
ae10: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
ae20: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
ae30: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
ae40: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
ae50: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
ae60: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
ae70: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
ae80: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
ae90: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
aea0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  K || pLock->lock
aeb0: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
aec0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
aed0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  rt( locktype==SH
aee0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
aef0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
af00: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20  locktype==0 );. 
af10: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
af20: 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70  ->cnt>0 );.    p
af30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
af40: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
af50: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a    pLock->cnt++;.
af60: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
af70: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
af80: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
af90: 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  }..  lock.l_len 
afa0: 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  = 1L;..  lock.l_
afb0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
afc0: 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  T;..  /* A PENDI
afd0: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
afe0: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
aff0: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
b000: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
b010: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
b020: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
b030: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
b040: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
b050: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
b060: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
b070: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
b080: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
b090: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
b0a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
b0b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
b0c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
b0d0: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
b0e0: 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53  e = (locktype==S
b0f0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
b100: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
b110: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b120: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
b130: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
b140: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b150: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
b160: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b170: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
b180: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
b190: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b1a0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b1b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
b1c0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
b1d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
b1f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b200: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
b210: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
b220: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
b230: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
b240: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
b250: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
b260: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
b270: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
b280: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
b290: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
b2a0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
b2b0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b2c0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
b2d0: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  int tErrno = 0;.
b2e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
b2f0: 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20  k->cnt==0 );.   
b300: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b310: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a  locktype==0 );..
b320: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
b330: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
b340: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b350: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
b360: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
b370: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b380: 20 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74     if( (s = fcnt
b390: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b3a0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d  TLK, &lock))==(-
b3b0: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
b3c0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b3d0: 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
b3e0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
b3f0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
b400: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b410: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b420: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b430: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b440: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b450: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
b460: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b470: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
b480: 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a   if( s != -1 ){.
b490: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b4a0: 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74  could happen wit
b4b0: 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e  h a network moun
b4c0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72  t */.        tEr
b4d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20  rno = errno; .  
b4e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b4f0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b500: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b510: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b520: 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
b530: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
b540: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b550: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
b560: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
b570: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
b580: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20   end_lock;.     
b590: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b5a0: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
b5b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
b5c0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
b5d0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
b5e0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
b5f0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b600: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b610: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b620: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b640: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b650: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
b660: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  _LOCK;.      pFi
b670: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
b680: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ++;.      pLock-
b690: 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  >cnt = 1;.    }.
b6a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
b6b0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
b6c0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63  LOCK && pLock->c
b6d0: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  nt>1 ){.    /* W
b6e0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
b6f0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
b700: 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
b710: 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
b720: 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
b730: 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
b740: 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
b750: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
b760: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
b770: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
b780: 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
b790: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
b7a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
b7b0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
b7c0: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
b7d0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
b7e0: 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
b7f0: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
b800: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
b810: 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
b820: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
b830: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b840: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77   F_WRLCK;.    sw
b850: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
b860: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
b870: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
b880: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b890: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
b8a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b8b0: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
b8c0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
b8d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b8e0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
b8f0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b900: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
b910: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
b920: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
b930: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b940: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
b950: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
b960: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b970: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
b980: 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  1) ){.      int 
b990: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b9a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b9b0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b9c0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b9d0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
b9e0: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
b9f0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ba00: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
ba10: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ba20: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
ba30: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
ba40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ba50: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
ba60: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
ba70: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
ba80: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
ba90: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
baa0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
bab0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
bac0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
bad0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
bae0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
baf0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
bb00: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
bb10: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
bb20: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
bb30: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
bb40: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
bb50: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
bb60: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
bb70: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
bb80: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
bb90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bba0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
bbb0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
bbc0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
bbd0: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
bbe0: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
bbf0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
bc00: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
bc10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
bc20: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
bc30: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
bc40: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
bc50: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
bc60: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
bc70: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
bc80: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
bc90: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
bca0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
bcb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
bcc0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
bcd0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
bce0: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
bcf0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
bd00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bd10: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
bd20: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
bd30: 2a 29 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a  *)id;.  int h;..
bd40: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
bd50: 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55  );.  OSTRACE7("U
bd60: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
bd70: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
bd80: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
bd90: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
bda0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
bdb0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
bdc0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
bdd0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
bde0: 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
bdf0: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
be00: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
be10: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
be20: 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
be30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
be40: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
be50: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
be60: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
be70: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
be80: 0a 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65  .  }.  enterMute
be90: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
bea0: 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  ->h;.  pLock = p
beb0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
bec0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
bed0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
bee0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
bef0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
bf00: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
bf10: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
bf20: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
bf30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
bf40: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
bf50: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
bf60: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
bf70: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
bf80: 67 6e 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  gn(0);.    if( l
bf90: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
bfa0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
bfb0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
bfc0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
bfd0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
bfe0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
bff0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
c000: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
c010: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
c020: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66  D_SIZE;.      if
c030: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
c040: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
c050: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c060: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c070: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c080: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c090: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c0a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
c0b0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
c0c0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
c0d0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
c0e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c0f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
c100: 20 20 20 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e     }.....goto en
c110: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
c120: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
c130: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
c140: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
c150: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c160: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c170: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
c180: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c190: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
c1a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
c1b0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
c1c0: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68  .    if( fcntl(h
c1d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
c1e0: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
c1f0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
c200: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c220: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
c230: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
c240: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
c250: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
c260: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
c270: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  NLOCK);.      if
c280: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
c290: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
c2a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
c2b0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
c2c0: 7d 0a 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e  }....goto end_un
c2d0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
c2e0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
c2f0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
c300: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
c310: 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  Open;..    /* De
c320: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
c330: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
c340: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
c350: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
c360: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
c370: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
c380: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
c390: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
c3a0: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
c3b0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
c3c0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
c3d0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74    if( pLock->cnt
c3e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
c3f0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
c400: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
c410: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c420: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
c430: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
c440: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
c450: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
c460: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
c470: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c480: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
c490: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
c4a0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
c4b0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
c4c0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
c4d0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  1) ){.        pL
c4e0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
c4f0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
c500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
c510: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
c520: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
c530: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c540: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c550: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
c560: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
c570: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
c580: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
c590: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c5a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
c5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c5c0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09  Lock->cnt = 1;..
c5d0: 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f  ...goto end_unlo
c5e0: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
c5f0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
c600: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
c610: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
c620: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
c630: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
c640: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
c650: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
c660: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
c670: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
c680: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
c690: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
c6a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
c6b0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
c6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c6d0: 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d  ){.      pOpen =
c6e0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c6f0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
c700: 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
c710: 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
c720: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
c730: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
c740: 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  && pOpen->nPendi
c750: 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ng>0 ){.        
c760: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
c770: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d  or(i=0; i<pOpen-
c780: 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b  >nPending; i++){
c790: 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
c7a0: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
c7b0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
c7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c7d0: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
c7e0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70  ding);.        p
c7f0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
c800: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65   0;.        pOpe
c810: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->aPending = 0;
c820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c830: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
c840: 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
c850: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c860: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
c870: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
c880: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
c890: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c8a0: 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
c8b0: 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
c8c0: 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
c8d0: 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
c8e0: 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
c8f0: 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
c900: 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
c910: 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
c920: 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
c930: 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
c940: 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
c950: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
c960: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
c970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c980: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
c990: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
c9a0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
c9b0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
c9c0: 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20  id;.  if( pFile 
c9d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
c9e0: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ->dirfd>=0 ){.  
c9f0: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
ca00: 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 7d 0a 20  >dirfd);.    }. 
ca10: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
ca20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
ca30: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
ca40: 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28   }.    OSTRACE2(
ca50: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
ca60: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  , pFile->h);.   
ca70: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
ca80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  ;.    memset(pFi
ca90: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
caa0: 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20  ixFile));.  }.  
cab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
cad0: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
cae0: 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
caf0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
cb00: 64 29 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  d){.  if( id ){.
cb10: 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
cb20: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
cb30: 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e  *)id;.    unixUn
cb40: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
cb50: 29 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65  );.    enterMute
cb60: 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
cb70: 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69  le->pOpen && pFi
cb80: 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  le->pOpen->nLock
cb90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
cba0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
cbb0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
cbc0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
cbd0: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
cbe0: 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
cbf0: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
cc00: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
cc10: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
cc20: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
cc30: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
cc40: 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
cc50: 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
cc60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
cc70: 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
cc80: 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
cc90: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
cca0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a    */.      int *
ccb0: 61 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75  aNew;.      stru
ccc0: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
ccd0: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
cce0: 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73  ;.      aNew = s
ccf0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
cd00: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20  Open->aPending, 
cd10: 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  (pOpen->nPending
cd20: 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  +1)*sizeof(int) 
cd30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
cd40: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
cd50: 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66  /* If a malloc f
cd60: 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20  ails, just leak 
cd70: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
cd80: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  tor */.      }el
cd90: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  se{.        pOpe
cda0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e  n->aPending = aN
cdb0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  ew;.        pOpe
cdc0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65  n->aPending[pOpe
cdd0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70  n->nPending] = p
cde0: 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20  File->h;.       
cdf0: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
ce00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  ++;.        pFil
ce10: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
ce20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c   }.    }.    rel
ce30: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
ce40: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
ce50: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70  releaseOpenCnt(p
ce60: 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  File->pOpen);.  
ce70: 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
ce80: 69 64 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75  id);.    leaveMu
ce90: 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
cea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ceb0: 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ...#if SQLITE_EN
cec0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
ced0: 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  LE.#pragma mark 
cee0: 41 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a  AFP Support../*.
cef0: 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69   ** The afpLocki
cf00: 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
cf10: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
cf20: 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
cf30: 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70  ic state. */.typ
cf40: 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c  edef struct afpL
cf50: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66  ockingContext af
cf60: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  pLockingContext;
cf70: 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69  .struct afpLocki
cf80: 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
cf90: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
cfa0: 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b   sharedLockByte;
cfb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
cfc0: 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72  ilePath;.};..str
cfd0: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
cfe0: 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
cff0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
d000: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
d010: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
d020: 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
d030: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
d040: 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
d050: 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
d060: 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
d070: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d080: 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
d090: 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
d0a0: 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
d0b0: 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
d0c0: 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
d0d0: 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
d0e0: 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
d0f0: 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
d100: 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
d110: 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
d120: 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
d130: 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
d140: 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
d150: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d170: 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
d180: 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
d190: 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
d1a0: 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
d1b0: 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
d1c0: 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
d1d0: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
d1e0: 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a 20  eLockPB2)../* . 
d1f0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
d200: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
d210: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
d220: 61 69 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74 61 74  ailure.. */.stat
d230: 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74  ic int _AFPFSSet
d240: 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
d250: 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 75 6e 69  ar *path, .  uni
d260: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  xFile *pFile, . 
d270: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
d280: 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 75  ong offset, .  u
d290: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d2a0: 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e 74  g length, .  int
d2b0: 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a   setLockFlag.){.
d2c0: 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
d2d0: 67 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20 20  geLockPB2       
d2e0: 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20  pb;.  int       
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
d300: 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
d310: 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
d320: 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
d330: 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
d340: 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
d350: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
d360: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
d370: 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
d380: 2d 3e 68 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  ->h;.  OSTRACE5(
d390: 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67  "AFPLOCK setting
d3a0: 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64 20   lock %s for %d 
d3b0: 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
d3c0: 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
d3d0: 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
d3e0: 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
d3f0: 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b  offset, length);
d400: 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
d410: 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
d420: 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
d430: 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
d440: 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
d450: 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
d460: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d470: 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50     OSTRACE4("AFP
d480: 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
d490: 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
d4a0: 73 5c 6e 22 2c 20 70 61 74 68 2c 20 74 45 72 72  s\n", path, tErr
d4b0: 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
d4c0: 72 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  rno));.    rc = 
d4d0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d4e0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d4f0: 2c 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  , setLockFlag ? 
d500: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d510: 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
d520: 5f 55 4e 4c 4f 43 4b 29 3b 20 2f 2a 20 65 72 72  _UNLOCK); /* err
d530: 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  or */.    if( IS
d540: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d550: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d560: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
d570: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
d580: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
d590: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
d5a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
d5b0: 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 72 65  ./* AFP-style re
d5c0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65 63  served lock chec
d5d0: 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  king following t
d5e0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 0a  he behavior of .
d5f0: 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  ** unixCheckRese
d600: 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68  rvedLock, see th
d610: 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  e unixCheckReser
d620: 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e  vedLock function
d630: 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61   comments */.sta
d640: 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
d650: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
d660: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
d670: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
d680: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d690: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
d6a0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
d6b0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d6c0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
d6d0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
d6f0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
d700: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
d710: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d720: 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
d730: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
d740: 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
d750: 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
d760: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
d770: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
d780: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
d790: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
d7a0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
d7b0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
d7c0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
d7d0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
d7e0: 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
d7f0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
d800: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
d810: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
d820: 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
d830: 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
d840: 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
d850: 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
d860: 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  rc = _AFPFSSetLo
d870: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
d880: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
d890: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
d8a0: 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ;  .    if( SQLI
d8b0: 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20  TE_OK==lrc ){.  
d8c0: 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63      /* if we suc
d8d0: 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67  ceeded in taking
d8e0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
d8f0: 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f  ck, unlock it to
d900: 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a   restore.      *
d910: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  * the original s
d920: 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72  tate */.      lr
d930: 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  c = _AFPFSSetLoc
d940: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
d950: 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
d960: 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
d970: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
d980: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
d990: 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
d9a0: 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
d9b0: 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
d9c0: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
d9d0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
d9e0: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
d9f0: 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
da00: 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
da10: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52   }.  }.  .  OSTR
da20: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
da30: 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  CK %d %d %d\n", 
da40: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
da50: 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70  served);.  .  *p
da60: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
da70: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
da80: 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20  }../* AFP-style 
da90: 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  locking followin
daa0: 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  g the behavior o
dab0: 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20  f unixLock, see 
dac0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a  the unixLock .**
dad0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e   function commen
dae0: 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f  ts for details o
daf0: 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e  f lock managemen
db00: 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t. */.static int
db10: 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33   afpLock(sqlite3
db20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
db30: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
db40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
db50: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
db60: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
db70: 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
db80: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
db90: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
dba0: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
dbb0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
dbc0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
dbd0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  e );.  OSTRACE5(
dbe0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
dbf0: 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  as %s pid=%d\n",
dc00: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
dc10: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
dc20: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b  (locktype), lock
dc30: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
dc40: 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69  locktype), getpi
dc50: 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  d());..  /* If t
dc60: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
dc70: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
dc80: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
dc90: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
dca0: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
dcb0: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
dcc0: 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
dcd0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
dce0: 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75   as.  ** enterMu
dcf0: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
dd00: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
dd10: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
dd20: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
dd30: 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
dd40: 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E3("LOCK    %d %
dd50: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
dd60: 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
dd70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
dd80: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
dd90: 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pe));.    return
dda0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ddb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
ddc0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
ddd0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
dde0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ddf0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
de00: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
de10: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
de20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
de30: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
de40: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
de50: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
de60: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
de70: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
de80: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
de90: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
dea0: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
deb0: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
dec0: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
ded0: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65  threads.  */.  e
dee0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
def0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
df00: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
df10: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
df20: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
df30: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
df40: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
df50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
df60: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
df70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
df80: 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
df90: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
dfa0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
dfb0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
dfc0: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
dfd0: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
dfe0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
dff0: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
e000: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
e010: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
e020: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
e030: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
e040: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
e050: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
e060: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
e070: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
e080: 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
e090: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
e0a0: 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
e0b0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
e0c0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e0d0: 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
e0e0: 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
e0f0: 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
e100: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
e110: 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
e120: 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
e130: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
e140: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
e150: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
e160: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
e170: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
e180: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
e190: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
e1a0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
e1b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
e1c0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
e1d0: 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  CK ){.    int lk
e1e0: 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  , lrc1, lrc2, lr
e1f0: 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20 20  c1Errno;.    .  
e200: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
e210: 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
e220: 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
e230: 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
e240: 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
e250: 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
e260: 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
e270: 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
e280: 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e  ndom(); .    con
e290: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e2a0: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
e2b0: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
e2c0: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
e2d0: 6c 72 63 31 20 3d 20 5f 41 46 50 46 53 53 65 74  lrc1 = _AFPFSSet
e2e0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e2f0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  lePath, pFile, .
e300: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
e310: 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e  _FIRST+context->
e320: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
e330: 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
e340: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
e350: 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
e360: 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
e370: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
e380: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
e390: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
e3a0: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
e3b0: 63 32 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  c2 = _AFPFSSetLo
e3c0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e3d0: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
e3e0: 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
e3f0: 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
e400: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
e410: 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  1) ) {.      pFi
e420: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e430: 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lrc1Errno;.     
e440: 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
e450: 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
e460: 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
e470: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
e480: 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20  R(lrc2) ){.     
e490: 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20   rc = lrc2;.    
e4a0: 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
e4b0: 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ock;.    } else 
e4c0: 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49  if( lrc1 != SQLI
e4d0: 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
e4e0: 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d  rc = lrc1;.    }
e4f0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46   else {.      pF
e500: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
e510: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
e520: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e530: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
e540: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
e550: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
e560: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
e570: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
e580: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
e590: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
e5a0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
e5b0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
e5c0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
e5d0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
e5e0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
e5f0: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69  ocktype );.    i
e600: 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52  f (locktype >= R
e610: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
e620: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e630: 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
e640: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
e650: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
e660: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
e670: 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53   failed = _AFPFS
e680: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
e690: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
e6a0: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
e6b0: 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   1,1);.    }.   
e6c0: 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
e6d0: 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c  locktype == EXCL
e6e0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
e6f0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
e700: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
e710: 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20   */.        .   
e720: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
e730: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66   shared lock bef
e740: 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72  ore trying the r
e750: 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65  ange.  we'll nee
e760: 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72  d to .      ** r
e770: 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
e780: 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65  hared lock if we
e790: 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20   can't get the  
e7a0: 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  afpUnlock.      
e7b0: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 28 66  */.      if (!(f
e7c0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e7d0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e7e0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
e7f0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
e820: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
e830: 20 31 2c 20 30 29 29 29 20 7b 0a 20 20 20 20 20   1, 0))) {.     
e840: 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
e850: 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
e860: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
e870: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
e880: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
e890: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e8a0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  lePath, pFile, S
e8b0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
e8e0: 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
e8f0: 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 65 64        if (failed
e900: 20 26 26 20 28 66 61 69 6c 65 64 20 3d 20 5f 41   && (failed = _A
e910: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e920: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e930: 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
e950: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
e960: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e970: 42 79 74 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a  Byte, 1, 1))) {.
e980: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
e990: 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
e9a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
e9b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
e9c0: 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
e9d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
e9e0: 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
e9f0: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
ea00: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
ea10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ea30: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
ea40: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
ea50: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
ea60: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
ea70: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
ea80: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
ea90: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
eaa0: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
eab0: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
eac0: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
ead0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
eae0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
eaf0: 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
eb00: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
eb10: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
eb20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eb30: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
eb40: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
eb50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
eb60: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
eb70: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
eb80: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
eb90: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
eba0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
ebb0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
ebc0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
ebd0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
ebe0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
ebf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
ec00: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
ec10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ec20: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
ec30: 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
ec40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
ec50: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
ec60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ec70: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
ec80: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ec90: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
eca0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
ecb0: 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
ecc0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
ecd0: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
ece0: 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  text;..  assert(
ecf0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
ed00: 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
ed10: 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
ed20: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
ed30: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
ed40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
ed50: 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  pe, getpid());..
ed60: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
ed70: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
ed80: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ed90: 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79  locktype<=lockty
eda0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
edb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
edc0: 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45    if( CHECK_THRE
edd0: 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20  ADID(pFile) ){. 
ede0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
edf0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65  _MISUSE;.  }.  e
ee00: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69  nterMutex();.  i
ee10: 6e 74 20 66 61 69 6c 65 64 20 3d 20 53 51 4c 49  nt failed = SQLI
ee20: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46 69  TE_OK;.  if( pFi
ee30: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
ee40: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ee50: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
ee60: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ARED_LOCK ){..  
ee70: 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68      /* unlock th
ee80: 65 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67  e exclusive rang
ee90: 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61  e - then re-esta
eea0: 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
eeb0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69   lock */.      i
eec0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
eed0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
eee0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61  CK) {.        fa
eef0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
ef00: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
ef10: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  lePath, pFile, S
ef20: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
ef50: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
ef60: 20 20 20 20 20 20 20 20 69 66 20 28 21 66 61 69          if (!fai
ef70: 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  led) {.         
ef80: 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   /* successfully
ef90: 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63   removed the exc
efa0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
efb0: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 66 61           if ((fa
efc0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
efd0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
efe0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  lePath, pFile, S
eff0: 48 41 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20  HARED_FIRST+.   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74           context
f020: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
f030: 2c 20 31 2c 20 31 29 29 29 20 7b 0a 20 20 20 20  , 1, 1))) {.    
f040: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
f050: 64 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  d to re-establis
f060: 68 20 6f 75 72 20 73 68 61 72 65 64 20 6c 6f 63  h our shared loc
f070: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
f080: 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
f090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f0a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
f0b0: 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
f0c0: 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
f0d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f0e0: 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  f (rc == SQLITE_
f0f0: 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  OK && pFile->loc
f100: 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
f110: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20  OCK) {.      if 
f120: 28 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46  ((failed = _AFPF
f130: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
f140: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
f150: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
f180: 54 45 2c 20 31 2c 20 30 29 29 29 7b 0a 20 20 20  TE, 1, 0))){.   
f190: 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74       /* failed t
f1a0: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 65  o release the pe
f1b0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
f1c0: 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
f1d0: 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
f1e0: 7d 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d  } .    if (rc ==
f1f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46   SQLITE_OK && pF
f200: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
f210: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
f220: 20 20 20 20 20 20 69 66 20 28 28 66 61 69 6c 65        if ((faile
f230: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
f240: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
f250: 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
f280: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
f290: 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20   0))) {.        
f2a0: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c  /* failed to rel
f2b0: 65 61 73 65 20 74 68 65 20 72 65 73 65 72 76 65  ease the reserve
f2c0: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
f2d0: 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 20    rc = failed;  
f2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a  .      }.    } .
f2f0: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
f300: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe==NO_LOCK ){. 
f310: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
f320: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
f330: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
f340: 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
f370: 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e  IRST + context->
f380: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
f390: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 0);.    if (f
f3a0: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
f3b0: 63 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a 20 20  c = failed;  .  
f3c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 63    }.  }.  if (rc
f3d0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20   == SQLITE_OK). 
f3e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
f3f0: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
f400: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
f410: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f420: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
f430: 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
f440: 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
f450: 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
f460: 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
f470: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f480: 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
f490: 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
f4a0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f4b0: 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c  *)id;.    afpUnl
f4c0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
f4d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f4e0: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
f4f0: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
f500: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
f510: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 23  xFile(id);.}...#
f520: 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63  pragma mark floc
f530: 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e  k() style lockin
f540: 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c 6f  g../*.** The flo
f550: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f560: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f 0a   is not used.*/.
f570: 74 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f  typedef void flo
f580: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f590: 3b 0a 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74 79 6c  ;../* flock-styl
f5a0: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
f5b0: 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69  checking followi
f5c0: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
f5d0: 6f 66 20 0a 20 2a 2a 20 75 6e 69 78 43 68 65 63  of . ** unixChec
f5e0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73  kReservedLock, s
f5f0: 65 65 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b  ee the unixCheck
f600: 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e  ReservedLock fun
f610: 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a  ction comments *
f620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
f630: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
f640: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f650: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
f660: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
f670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
f680: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
f690: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f6a0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
f6b0: 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
f6c0: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
f6d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
f6e0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
f6f0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
f700: 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
f710: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
f720: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
f730: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
f740: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
f750: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
f760: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
f770: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
f780: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
f790: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
f7a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
f7b0: 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
f7c0: 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
f7d0: 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
f7e0: 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
f7f0: 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c      int lrc = fl
f800: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
f810: 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
f820: 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
f830: 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
f840: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
f850: 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
f860: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
f870: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
f880: 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
f890: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
f8a0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f8b0: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
f8c0: 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
f8d0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63  r */.        lrc
f8e0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f8f0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f900: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f910: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
f920: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f930: 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
f940: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f950: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
f960: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
f970: 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
f980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
f990: 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
f9a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f9b0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
f9c0: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
f9d0: 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
f9e0: 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
f9f0: 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
fa00: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
fa10: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
fa20: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
fa30: 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
fa40: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
fa50: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
fa60: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fa70: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
fa80: 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
fa90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
faa0: 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
fab0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
fac0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fad0: 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20  , reserved);..  
fae0: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
faf0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
fb00: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
fb10: 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
fb20: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fb30: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e  locktype) {.  in
fb40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fb50: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fb60: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fb70: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
fb80: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
fb90: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
fba0: 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
fbb0: 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
fbc0: 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
fbd0: 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
fbe0: 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
fbf0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
fc00: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
fc10: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
fc20: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
fc30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fc40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
fc50: 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
fc60: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
fc70: 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69  .  if (flock(pFi
fc80: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
fc90: 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
fca0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
fcb0: 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
fcc0: 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
fcd0: 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
fce0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fcf0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fd00: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fd10: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
fd20: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
fd30: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
fd40: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
fd50: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  rno;.    }.  } e
fd60: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
fd70: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
fd80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
fd90: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
fda0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
fdb0: 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  e;.  }.  OSTRACE
fdc0: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
fdd0: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
fde0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
fdf0: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
fe00: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
fe10: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
fe20: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
fe30: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
fe40: 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
fe50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe60: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
fe70: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fe80: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
fe90: 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
fea0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
feb0: 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
fec0: 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
fed0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
fee0: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
fef0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
ff00: 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
ff10: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
ff20: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
ff30: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
ff40: 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
ff50: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
ff60: 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
ff70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ff80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ff90: 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
ffa0: 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
ffb0: 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
ffc0: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
ffd0: 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79   */.  if (lockty
ffe0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
fff0: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
10000 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10010 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
10020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10030 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
10040 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
10050 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
10060 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
10070 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
10080 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
10090 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
100a0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
100b0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
100c0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
100d0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
100e0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
100f0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10100 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10110 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
10120 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73  eturn r;.  } els
10130 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  e {.    pFile->l
10140 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
10150 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10160 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
10170 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
10180 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
10190 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
101a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
101b0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
101c0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
101d0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
101e0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
101f0 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 70  xFile(id);.}..#p
10200 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53  ragma mark Old-S
10210 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65  chool .lock file
10220 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a   based locking..
10230 2f 2a 20 44 6f 74 6c 6f 63 6b 2d 73 74 79 6c 65  /* Dotlock-style
10240 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63   reserved lock c
10250 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  hecking followin
10260 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  g the behavior o
10270 66 20 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52  f .** unixCheckR
10280 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65  eservedLock, see
10290 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65   the unixCheckRe
102a0 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74  servedLock funct
102b0 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  ion comments */.
102c0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
102d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
102e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
102f0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
10300 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
10310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
10320 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
10330 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10340 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10350 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
10360 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10370 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10380 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
10390 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
103a0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
103b0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
103c0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
103d0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
103e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
103f0 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
10400 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
10410 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
10420 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
10430 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
10440 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
10450 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
10460 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 63  eserved ){.    c
10470 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
10480 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10490 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
104a0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
104b0 73 74 61 74 42 75 66 3b 0a 20 20 20 20 0a 20 20  statBuf;.    .  
104c0 20 20 69 66 28 20 6c 73 74 61 74 28 7a 4c 6f 63    if( lstat(zLoc
104d0 6b 46 69 6c 65 2c 20 26 73 74 61 74 42 75 66 29  kFile, &statBuf)
104e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
104f0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d  file exists, som
10500 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
10510 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  e lock */.      
10520 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
10530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
10540 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  * file does not 
10550 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20  exist, we could 
10560 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
10570 6e 74 20 69 74 20 2a 2f 0a 09 09 09 69 6e 74 20  nt it */....int 
10580 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10590 20 20 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54        if( ENOENT
105a0 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
105b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
105c0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
105d0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
105e0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
105f0 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
10600 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10610 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10630 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54   }.  OSTRACE4("T
10640 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
10650 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
10660 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10670 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
10680 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
10690 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
106a0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
106b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
106c0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
106d0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
106e0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
106f0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
10700 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
10710 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
10720 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10730 74 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c 49  t;.  int rc=SQLI
10740 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
10750 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
10760 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
10770 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
10780 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
10790 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
107a0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
107b0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
107c0 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
107d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
107e0 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
107f0 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61      .    /* Alwa
10800 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
10810 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
10820 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
10830 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
10840 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 63 20 3d   NULL);.    rc =
10850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10860 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64  goto dotlock_end
10870 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
10880 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  /* check to see 
10890 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  if lock file alr
108a0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
108b0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
108c0 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
108d0 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73 74 61  t(zLockFile,&sta
108e0 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20  tBuf) == 0){.   
108f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
10900 59 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62  Y; /* it does, b
10910 75 73 79 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  usy */.    goto 
10920 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b  dotlock_end_lock
10930 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
10940 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
10950 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f  lock */.  fd = o
10960 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f  pen(zLockFile,O_
10970 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
10980 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
10990 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  f( fd<0 ){.    /
109a0 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
109b0 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
109c0 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  , someone else m
109d0 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74  ay have stolen t
109e0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
109f0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10a00 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
10a10 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
10a20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10a30 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
10a40 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
10a50 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10a60 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10a70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
10a80 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
10a90 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10aa0 20 29 7b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74   ){..pFile->last
10ab0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10ad0 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65    goto dotlock_e
10ae0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 20 0a 20 20  nd_lock;.  } .  
10af0 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20  close(fd);.  .  
10b00 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
10b10 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
10b20 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
10b30 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
10b40 6b 74 79 70 65 3b 0a 0a 20 64 6f 74 6c 6f 63 6b  ktype;.. dotlock
10b50 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
10b60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
10b70 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
10b80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10b90 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10ba0 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
10bb0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10bc0 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
10bd0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
10be0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
10bf0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
10c00 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10c10 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
10c20 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
10c30 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
10c40 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
10c50 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
10c60 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
10c70 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
10c80 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
10c90 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
10ca0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
10cb0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
10cc0 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
10cd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10cf0 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
10d00 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
10d10 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
10d20 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
10d30 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
10d40 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
10d50 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10d60 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10d70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10d80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
10d90 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
10da0 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
10db0 28 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c  (unlink(zLockFil
10dc0 65 29 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  e) ) {.    int r
10dd0 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
10de0 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  o;.    if( ENOEN
10df0 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
10e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10e10 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10e20 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10e30 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
10e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10e50 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10e60 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
10e70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10e80 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10e90 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10ea0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10eb0 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
10ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ed0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
10ee0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
10ef0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10f00 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10f10 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
10f20 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
10f30 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10f40 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
10f50 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
10f60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
10f70 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
10f80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10f90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10fa0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
10fb0 29 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  );.}...#endif /*
10fc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10fd0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
10fe0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63  ./*.** The noloc
10ff0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
11000 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79 70 65 64  is void.*/.typed
11010 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f  ef void nolockLo
11020 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73  ckingContext;..s
11030 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
11040 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11050 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11060 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11070 29 20 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  ) {.  *pResOut =
11080 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
11090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
110a0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
110b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
110c0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
110d0 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   {.  return SQLI
110e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
110f0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
11100 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11110 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
11120 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ) {.  return SQL
11130 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11140 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
11150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
11160 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
11170 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
11180 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
11190 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ile(id);.}.../*.
111a0 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
111b0 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
111c0 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
111d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
111e0 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
111f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11200 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
11210 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
11220 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
11230 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
11240 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
11250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
11260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
11270 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
11280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
112a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
112b0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
112c0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
112d0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
112e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
112f0 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
11300 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
11310 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
11320 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
11330 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
11340 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
11350 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
11360 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
11370 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
11380 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
11390 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
113a0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
113b0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
113c0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
113d0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
113e0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
113f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
11400 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
11410 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
11420 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
11430 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
11440 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
11450 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
11460 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11470 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
11480 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
11490 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
114a0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
114b0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
114c0 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
114d0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
114e0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
114f0 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
11500 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
11510 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11520 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11530 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
11540 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11550 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
11560 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
11570 62 79 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  by pId..**.** Wh
11580 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e  en locking exten
11590 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65  sions are enable
115a0 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68 20  d, the filepath 
115b0 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  and locking styl
115c0 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65 64  e .** are needed
115d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
115e0 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68  e unixFile pMeth
115f0 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f  od to use for lo
11600 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
11610 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ..** The locking
11620 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20  -style specific 
11630 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  lockingContext d
11640 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
11650 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64   created .** and
11660 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20 61   assigned here a
11670 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lso..*/.static i
11680 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
11690 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
116a0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
116b0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
116c0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
116d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116e0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
116f0 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
11700 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
11710 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20  */.  int dirfd, 
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11730 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
11740 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
11750 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
11760 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
11770 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
11780 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
11790 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
117a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
117b0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
117c0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
117d0 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 20 20 20 20    int noLock    
117e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
117f0 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75  t locking if tru
11800 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 4c  e */.){.  int eL
11810 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
11820 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
11830 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
11840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11850 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 63  TE_OK;..  /* Mac
11860 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  ro to define the
11870 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73   static contents
11880 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
11890 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 2a 20  o_methods .  ** 
118a0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 20  structure for a 
118b0 75 6e 69 78 20 62 61 63 6b 65 6e 64 20 66 69 6c  unix backend fil
118c0 65 2e 20 44 69 66 66 65 72 65 6e 74 20 6c 6f 63  e. Different loc
118d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 0a 20 20 2a  king methods.  *
118e0 2a 20 72 65 71 75 69 72 65 20 64 69 66 66 65 72  * require differ
118f0 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  ent functions fo
11900 72 20 74 68 65 20 78 43 6c 6f 73 65 2c 20 78 4c  r the xClose, xL
11910 6f 63 6b 2c 20 78 55 6e 6c 6f 63 6b 20 61 6e 64  ock, xUnlock and
11920 0a 20 20 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  .  ** xCheckRese
11930 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 73  rvedLock methods
11940 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ..  */.  #define
11950 20 49 4f 4d 45 54 48 4f 44 53 28 78 43 6c 6f 73   IOMETHODS(xClos
11960 65 2c 20 78 4c 6f 63 6b 2c 20 78 55 6e 6c 6f 63  e, xLock, xUnloc
11970 6b 2c 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  k, xCheckReserve
11980 64 4c 6f 63 6b 29 20 7b 20 20 20 20 5c 0a 20 20  dLock) {    \.  
11990 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119b0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 43 6c         \.    xCl
119e0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
119f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
11a00 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 65 61 64    \.    unixRead
11a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11a40 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
11a70 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a90 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
11ac0 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
11ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
11ae0 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 79 6e     \.    unixSyn
11b10 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
11b20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
11b50 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65      unixFileSize
11b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11b70 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78           \.    x
11ba0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
11bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
11bc0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 5c 0a 20 20 20 20 78 55 6e 6c 6f 63      \.    xUnloc
11bf0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
11c00 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
11c10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11c30 0a 20 20 20 20 78 43 68 65 63 6b 52 65 73 65 72  .    xCheckReser
11c40 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
11c50 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
11c60 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
11c70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
11c80 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11ca0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53       \.    unixS
11cd0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
11ce0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
11cf0 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 5c 0a 20 20 20 20 75 6e 69 78 44 65 76 69 63 65  \.    unixDevice
11d20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
11d30 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
11d40 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
11d50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
11d60 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
11d70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 49 6f  3_io_methods aIo
11d80 4d 65 74 68 6f 64 5b 5d 20 3d 20 7b 0a 20 20 20  Method[] = {.   
11d90 20 49 4f 4d 45 54 48 4f 44 53 28 75 6e 69 78 43   IOMETHODS(unixC
11da0 6c 6f 73 65 2c 20 75 6e 69 78 4c 6f 63 6b 2c 20  lose, unixLock, 
11db0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 75 6e 69 78  unixUnlock, unix
11dc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11dd0 6b 29 20 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44  k) .   ,IOMETHOD
11de0 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 6e  S(nolockClose, n
11df0 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c 6f 63  olockLock, noloc
11e00 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b 43  kUnlock, nolockC
11e10 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11e20 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ).#if SQLITE_ENA
11e30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11e40 45 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28  E.   ,IOMETHODS(
11e50 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 64 6f  dotlockClose, do
11e60 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 64 6f 74 6c 6f  tlockLock, dotlo
11e70 63 6b 55 6e 6c 6f 63 6b 2c 64 6f 74 6c 6f 63 6b  ckUnlock,dotlock
11e80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11e90 6b 29 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53  k).   ,IOMETHODS
11ea0 28 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 66 6c 6f  (flockClose, flo
11eb0 63 6b 4c 6f 63 6b 2c 20 66 6c 6f 63 6b 55 6e 6c  ckLock, flockUnl
11ec0 6f 63 6b 2c 20 66 6c 6f 63 6b 43 68 65 63 6b 52  ock, flockCheckR
11ed0 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20  eservedLock).   
11ee0 2c 49 4f 4d 45 54 48 4f 44 53 28 61 66 70 43 6c  ,IOMETHODS(afpCl
11ef0 6f 73 65 2c 20 61 66 70 4c 6f 63 6b 2c 20 61 66  ose, afpLock, af
11f00 70 55 6e 6c 6f 63 6b 2c 20 61 66 70 43 68 65 63  pUnlock, afpChec
11f10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a 23  kReservedLock).#
11f20 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 2f 2a 20  endif.  };.  /* 
11f30 54 68 65 20 6f 72 64 65 72 20 6f 66 20 74 68 65  The order of the
11f40 20 49 4f 4d 45 54 48 4f 44 53 20 6d 61 63 72 6f   IOMETHODS macro
11f50 73 20 61 62 6f 76 65 20 69 73 20 69 6d 70 6f 72  s above is impor
11f60 74 61 6e 74 2e 20 20 49 74 20 6d 75 73 74 20 62  tant.  It must b
11f70 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  e the.  ** same 
11f80 6f 72 64 65 72 20 61 73 20 74 68 65 20 4c 4f 43  order as the LOC
11f90 4b 49 4e 47 5f 53 54 59 4c 45 20 6e 75 6d 62 65  KING_STYLE numbe
11fa0 72 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  rs.  */.  assert
11fb0 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50  (LOCKING_STYLE_P
11fc0 4f 53 49 58 3d 3d 31 29 3b 0a 20 20 61 73 73 65  OSIX==1);.  asse
11fd0 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  rt(LOCKING_STYLE
11fe0 5f 4e 4f 4e 45 3d 3d 32 29 3b 0a 20 20 61 73 73  _NONE==2);.  ass
11ff0 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ert(LOCKING_STYL
12000 45 5f 44 4f 54 46 49 4c 45 3d 3d 33 29 3b 0a 20  E_DOTFILE==3);. 
12010 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f   assert(LOCKING_
12020 53 54 59 4c 45 5f 46 4c 4f 43 4b 3d 3d 34 29 3b  STYLE_FLOCK==4);
12030 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e  .  assert(LOCKIN
12040 47 5f 53 54 59 4c 45 5f 41 46 50 3d 3d 35 29 3b  G_STYLE_AFP==5);
12050 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
12060 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b  ->pLock==NULL );
12070 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
12080 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a  >pOpen==NULL );.
12090 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45  .  OSTRACE3("OPE
120a0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
120b0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20   h, zFilename); 
120c0 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20     .  pNew->h = 
120d0 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
120e0 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f   = dirfd;.  SET_
120f0 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a  THREADID(pNew);.
12100 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b  .  if( noLock ){
12110 0a 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79  .    eLockingSty
12120 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  le = LOCKING_STY
12130 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  LE_NONE;.  }else
12140 7b 0a 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74  {.    eLockingSt
12150 79 6c 65 20 3d 20 64 65 74 65 63 74 4c 6f 63 6b  yle = detectLock
12160 69 6e 67 53 74 79 6c 65 28 70 56 66 73 2c 20 7a  ingStyle(pVfs, z
12170 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20  Filename, h);.  
12180 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 4c 6f  }..  switch( eLo
12190 63 6b 69 6e 67 53 74 79 6c 65 20 29 7b 0a 0a 20  ckingStyle ){.. 
121a0 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f     case LOCKING_
121b0 53 54 59 4c 45 5f 50 4f 53 49 58 3a 20 7b 0a 20  STYLE_POSIX: {. 
121c0 20 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28       enterMutex(
121d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
121e0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70  ndLockInfo(h, &p
121f0 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
12200 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20  w->pOpen);.     
12210 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
12220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12230 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
12240 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12250 4c 45 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b  LE.    case LOCK
12260 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 3a 20 7b  ING_STYLE_AFP: {
12270 0a 20 20 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  .      /* AFP lo
12280 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
12290 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
122a0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
122b0 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ded in.      ** 
122c0 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
122d0 6e 74 65 78 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ntext..      */.
122e0 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
122f0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
12300 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
12310 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
12320 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
12330 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
12340 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
12350 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  tx==0 ){.       
12360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
12370 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
12380 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  .        /* NB: 
12390 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
123a0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
123b0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
123c0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
123d0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
123e0 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
123f0 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
12400 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
12410 6b 65 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  ke a.        ** 
12420 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
12430 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  name. */.       
12440 20 70 43 74 78 2d 3e 66 69 6c 65 50 61 74 68 20   pCtx->filePath 
12450 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
12460 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
12470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12480 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
12490 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f     case LOCKING_
124a0 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 3a 20 7b  STYLE_DOTFILE: {
124b0 0a 20 20 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  .      /* Dotfil
124c0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
124d0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
124e0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
124f0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20  ncluded in.     
12500 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
12510 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
12520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
12530 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
12540 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12550 6d 65 3b 0a 20 20 20 20 20 20 6e 46 69 6c 65 6e  me;.      nFilen
12560 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  ame = strlen(zFi
12570 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
12580 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
12590 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
125a0 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
125b0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 63  ;.      if( zLoc
125c0 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
125d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
125e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
125f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12600 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
12610 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
12620 65 2c 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46  e, "%s.lock", zF
12630 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
12640 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  }.      pNew->lo
12650 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
12660 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 20 20  LockFile;.      
12670 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
12680 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53    case LOCKING_S
12690 54 59 4c 45 5f 46 4c 4f 43 4b 3a 20 0a 20 20 20  TYLE_FLOCK: .   
126a0 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
126b0 59 4c 45 5f 4e 4f 4e 45 3a 20 0a 20 20 20 20 20  YLE_NONE: .     
126c0 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20   break;.#endif. 
126d0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61   }.  .  pNew->la
126e0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 69  stErrno = 0;.  i
126f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12700 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66   ){.    if( dirf
12710 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72  d>=0 ) close(dir
12720 66 64 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 68  fd);.    close(h
12730 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12740 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
12750 26 61 49 6f 4d 65 74 68 6f 64 5b 65 4c 6f 63 6b  &aIoMethod[eLock
12760 69 6e 67 53 74 79 6c 65 2d 31 5d 3b 0a 20 20 20  ingStyle-1];.   
12770 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
12780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12790 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
127a0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
127b0 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
127c0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
127d0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
127e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
127f0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
12800 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
12810 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
12820 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
12830 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
12840 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
12850 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
12860 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
12870 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
12880 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
12890 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
128a0 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
128b0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
128c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
128d0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
128e0 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
128f0 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
12900 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
12910 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
12920 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
12930 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
12940 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12950 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
12960 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
12970 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
12980 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
12990 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
129a0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
129b0 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
129c0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
129d0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 73 74 72  e);.  for(ii=str
129e0 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
129f0 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61 6d 65  i>=0 && zDirname
12a00 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
12a10 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
12a20 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
12a30 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
12a40 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  = open(zDirname,
12a50 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
12a60 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
12a70 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
12a80 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
12a90 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
12aa0 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
12ab0 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
12ac0 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
12ad0 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22        OSTRACE3("
12ae0 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
12af0 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
12b00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
12b10 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
12b20 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
12b30 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f  _OK:SQLITE_CANTO
12b40 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  PEN);.}../*.** C
12b50 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
12b60 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
12b70 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
12b80 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
12b90 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
12ba0 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
12bb0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
12bc0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
12bd0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
12be0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
12bf0 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
12c00 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
12c10 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
12c20 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
12c30 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
12c40 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
12c50 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
12c60 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
12c70 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
12c80 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
12c90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12ca0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
12cb0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
12cc0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
12cd0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
12ce0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
12cf0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
12d00 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
12d10 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
12d20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
12d30 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74   = ".";..  /* It
12d40 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
12d50 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
12d60 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
12d70 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
12d80 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
12d90 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
12da0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
12db0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
12dc0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
12dd0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
12de0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
12df0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12e00 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61  TE_IOERR );..  a
12e10 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
12e20 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
12e30 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
12e40 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
12e50 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
12e60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12e70 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
12e80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
12e90 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
12ea0 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
12eb0 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
12ec0 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
12ed0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12ee0 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
12ef0 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
12f00 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
12f10 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
12f20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12f30 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
12f40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
12f50 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
12f60 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
12f70 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
12f80 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
12f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12fa0 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
12fb0 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
12fc0 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
12fd0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
12fe0 2b 20 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b  + 17) >= nBuf ){
12ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13000 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
13010 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
13020 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
13030 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
13040 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
13050 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
13060 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
13070 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
13080 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
13090 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
130a0 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
130b0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
130c0 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
130d0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
130e0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
130f0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
13100 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
13110 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
13120 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75  hile( access(zBu
13130 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
13140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13150 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
13160 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
13170 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
13180 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
13190 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
131a0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
131b0 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
131c0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
131d0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
131e0 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
131f0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
13200 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
13210 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
13220 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
13230 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
13240 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
13250 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
13260 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
13270 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
13280 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
13290 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
132a0 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
132b0 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
132c0 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
132d0 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
132e0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
132f0 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
13300 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
13310 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
13320 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
13330 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
13340 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
13350 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
13360 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
13370 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13380 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
13390 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
133a0 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
133b0 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
133c0 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
133d0 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
133e0 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
133f0 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
13400 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
13410 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
13420 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
13430 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
13440 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13450 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
13460 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
13470 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
13480 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c  *pFile,.  int fl
13490 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74  ags,.  int *pOut
134a0 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 66  Flags.){.  int f
134b0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
134c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
134d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
134e0 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
134f0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  */.  int dirfd =
13500 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
13510 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
13520 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13530 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73   */.  int oflags
13540 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13550 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
13560 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
13570 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
13580 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
13590 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
135a0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
135b0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
135e0 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
135f0 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  es */..  int isE
13600 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
13610 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13620 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
13630 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
13640 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
13650 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
13660 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
13670 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
13680 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13690 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
136a0 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
136b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
136c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
136d0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
136e0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
136f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13700 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72  TE);..  /* If cr
13710 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
13720 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
13730 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
13740 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
13750 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
13760 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
13770 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
13780 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
13790 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
137a0 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
137b0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
137c0 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
137d0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
137e0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ..  */.  int isO
137f0 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28  penDirectory = (
13800 69 73 43 72 65 61 74 65 20 26 26 20 0a 20 20 20  isCreate && .   
13810 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54     (eType==SQLIT
13820 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
13830 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
13840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
13850 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a  _JOURNAL).  );..
13860 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
13870 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
13880 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
13890 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
138a0 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
138b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
138c0 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
138d0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
138e0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
138f0 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
13900 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
13910 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
13920 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
13930 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
13940 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
13950 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
13960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
13970 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
13980 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
13990 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
139a0 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
139b0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
139c0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
139d0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
139e0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
139f0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
13a00 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
13a10 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
13a20 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
13a30 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
13a40 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
13a50 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
13a60 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
13a70 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
13a80 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
13a90 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
13aa0 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
13ab0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
13ac0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
13ad0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
13ae0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
13af0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
13b00 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
13b10 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
13b20 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
13b30 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
13b40 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
13b50 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72  rnal, and master
13b60 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
13b70 65 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  er automatically
13b80 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20  .  ** deleted.  
13b90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
13ba0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
13bb0 4d 41 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65  MAIN_DB || !isDe
13bc0 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  lete );.  assert
13bd0 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  ( eType!=SQLITE_
13be0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
13bf0 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29  L || !isDelete )
13c00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
13c10 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
13c20 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  ASTER_JOURNAL ||
13c30 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20   !isDelete );.. 
13c40 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
13c50 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
13c60 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
13c70 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
13c80 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
13c90 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
13ca0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
13cb0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
13cc0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
13cd0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
13ce0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
13cf0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
13d00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
13d10 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
13d20 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
13d30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
13d40 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
13d50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
13d60 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
13d70 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
13d80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
13d90 4e 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a  NSIENT_DB.  );..
13da0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
13db0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
13dc0 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e  le));..  if( !zN
13dd0 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ame ){.    int r
13de0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  c;.    assert(is
13df0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
13e00 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
13e10 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
13e20 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
13e30 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
13e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
13e60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
13e70 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
13e80 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  e;.  }..  if( is
13e90 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 66 6c 61  Readonly )  ofla
13ea0 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
13eb0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
13ec0 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f  e ) oflags |= O_
13ed0 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
13ee0 65 61 74 65 20 29 20 20 20 20 6f 66 6c 61 67 73  eate )    oflags
13ef0 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
13f00 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
13f10 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58   oflags |= (O_EX
13f20 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
13f30 20 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c    oflags |= (O_L
13f40 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
13f50 59 29 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e  Y);..  fd = open
13f60 28 7a 4e 61 6d 65 2c 20 6f 66 6c 61 67 73 2c 20  (zName, oflags, 
13f70 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51  isDelete?0600:SQ
13f80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
13f90 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
13fa0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
13fb0 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
13fc0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
13fd0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
13fe0 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
13ff0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
14000 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
14010 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
14020 79 2e 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  y. */.    flags 
14030 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
14040 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
14050 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
14060 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
14070 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
14080 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  Y;.    return un
14090 69 78 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50 61  ixOpen(pVfs, zPa
140a0 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73  th, pFile, flags
140b0 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
140c0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
140d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
140e0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
140f0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
14100 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61  {.    unlink(zNa
14110 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  me);.  }.  if( p
14120 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
14130 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
14140 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  gs;.  }..  asser
14150 74 28 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20  t(fd!=0);.  if( 
14160 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
14170 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
14180 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
14190 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
141a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
141b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  _OK ){.      clo
141c0 73 65 28 66 64 29 3b 0a 20 20 20 20 20 20 72 65  se(fd);.      re
141d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
141e0 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c   }..#ifdef FD_CL
141f0 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64  OEXEC.  fcntl(fd
14200 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
14210 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
14220 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
14230 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
14240 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
14250 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20  _OPEN_MAIN_DB;. 
14260 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e   return fillInUn
14270 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
14280 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
14290 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 29 3b 0a 7d  Path, noLock);.}
142a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
142b0 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
142c0 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
142d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
142e0 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
142f0 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
14300 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
14310 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
14320 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71  nt unixDelete(sq
14330 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14340 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
14350 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
14360 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14370 49 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61  ITE_OK;.  Simula
14380 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14390 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
143a0 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
143b0 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20 64 69  zPath);.  if( di
143c0 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74  rSync ){.    int
143d0 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70   fd;.    rc = op
143e0 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
143f0 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
14400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14410 7b 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  {.      if( fsyn
14420 63 28 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  c(fd) ){.       
14430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
14440 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20  RR_DIR_FSYNC;.  
14450 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
14460 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
14470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14480 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
14490 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
144a0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
144b0 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
144c0 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
144d0 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
144e0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
144f0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
14500 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
14510 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
14520 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
14530 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
14540 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
14550 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
14560 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
14570 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
14580 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
14590 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
145a0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
145b0 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
145c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
145d0 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
145e0 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
145f0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
14600 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
14610 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
14620 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
14630 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
14640 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a   int amode = 0;.
14650 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14660 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
14670 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
14680 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
14690 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
146a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
146b0 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
146c0 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
146d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case 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 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
14700 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
14710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14720 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
14730 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
14740 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
14750 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
14760 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
14770 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
14780 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
14790 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
147a0 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68   = (access(zPath
147b0 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
147c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
147d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
147e0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
147f0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
14800 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
14810 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
14820 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
14830 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
14840 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
14850 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
14860 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
14870 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
14880 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
14890 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
148a0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
148b0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
148c0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
148d0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
148e0 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
148f0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
14900 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
14910 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
14920 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
14930 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
14940 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
14950 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14960 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
14970 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14980 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
14990 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
149a0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
149b0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
149c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
149d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
149e0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
149f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
14a00 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
14a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14a20 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
14a30 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
14a40 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
14a50 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
14a60 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
14a70 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
14a80 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
14a90 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
14aa0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
14ab0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
14ac0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
14ad0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
14ae0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
14af0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
14b00 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
14b10 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
14b20 6c 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ly has been unli
14b30 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
14b40 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
14b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14b60 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
14b70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
14b80 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
14b90 3b 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ;.  zOut[nOut-1]
14ba0 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
14bb0 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
14bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
14bd0 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
14be0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
14bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
14c00 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65  nCwd;.    if( ge
14c10 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
14c20 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
14c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
14c40 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
14c50 20 6e 43 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a   nCwd = strlen(z
14c60 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
14c70 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
14c80 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
14c90 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
14ca0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30  QLITE_OK;..#if 0
14cc0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76  .  /*.  ** Remov
14cd0 65 20 22 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65  e "/./" path ele
14ce0 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e 76 65 72  ments and conver
14cf0 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74 68 20 65  t "/A/./" path e
14d00 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 6f 20  lements.  ** to 
14d10 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20  just "/"..  */. 
14d20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b 0a 20 20   if( zFull ){.  
14d30 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
14d40 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c  for(i=j=0; zFull
14d50 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
14d60 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27   if( zFull[i]=='
14d70 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  /' ){.        if
14d80 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f  ( zFull[i+1]=='/
14d90 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
14da0 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
14db0 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+1]=='.' && zFu
14dc0 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  ll[i+2]=='/' ){.
14dd0 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31            i += 1
14de0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
14df0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
14e00 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c          if( zFul
14e10 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a  l[i+1]=='.' && z
14e20 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  Full[i+2]=='.' &
14e30 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f  & zFull[i+3]=='/
14e40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  ' ){.          w
14e50 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 46 75  hile( j>0 && zFu
14e60 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20  ll[j-1]!='/' ){ 
14e70 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  j--; }.         
14e80 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20   i += 3;.       
14e90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14eb0 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20       zFull[j++] 
14ec0 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = zFull[i];.    
14ed0 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d  }.    zFull[j] =
14ee0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
14ef0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
14f00 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
14f10 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
14f20 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
14f30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
14f40 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
14f50 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
14f60 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
14f70 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
14f80 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
14f90 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
14fa0 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
14fb0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
14fc0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
14fd0 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
14fe0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
14ff0 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
15000 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
15010 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
15020 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
15030 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
15040 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
15050 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
15060 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
15070 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
15080 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
15090 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
150a0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
150b0 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
150c0 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
150d0 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
150e0 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
150f0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
15100 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
15110 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
15120 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
15130 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
15140 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
15150 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
15160 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
15170 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
15180 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
15190 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
151a0 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t){.  char *zErr
151b0 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ;.  enterMutex()
151c0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
151d0 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
151e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
151f0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
15200 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
15210 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65  rr);.  }.  leave
15220 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
15230 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79  c void *unixDlSy
15240 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
15250 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
15260 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
15270 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75  zSymbol){.  retu
15280 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65  rn dlsym(pHandle
15290 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74  , zSymbol);.}.st
152a0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
152b0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
152c0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
152d0 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f  Handle){.  dlclo
152e0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
152f0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
15300 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
15310 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
15320 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
15330 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
15340 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
15350 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
15360 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
15370 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
15380 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
15390 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
153a0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
153b0 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
153c0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
153d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
153e0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
153f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
15400 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
15410 7a 42 75 66 29 7b 0a 0a 20 20 61 73 73 65 72 74  zBuf){..  assert
15420 28 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  (nBuf>=(sizeof(t
15430 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
15440 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
15450 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
15460 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
15470 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
15480 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
15490 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
154a0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
154b0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
154c0 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
154d0 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
154e0 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
154f0 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
15500 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
15510 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
15520 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
15530 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
15540 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
15550 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
15560 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
15570 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
15580 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
15590 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
155a0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
155b0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
155c0 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
155d0 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
155e0 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
155f0 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
15600 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
15610 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
15620 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
15630 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
15640 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
15650 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
15660 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
15670 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
15680 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
15690 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
156a0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
156b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
156c0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
156d0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
156e0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
156f0 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
15700 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
15710 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
15720 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
15730 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
15740 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
15750 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
15760 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
15770 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
15780 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
15790 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
157a0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
157b0 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
157c0 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
157d0 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
157e0 7a 65 6f 66 28 70 69 64 29 3c 3d 6e 42 75 66 20  zeof(pid)<=nBuf 
157f0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
15800 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
15810 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
15820 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d  se{.      nBuf =
15830 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20   read(fd, zBuf, 
15840 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f  nBuf);.      clo
15850 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
15860 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
15870 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
15880 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
15890 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
158a0 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
158b0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
158c0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
158d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
158e0 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
158f0 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
15900 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15910 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
15920 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
15930 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
15940 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
15950 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
15960 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
15970 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
15980 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
15990 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
159a0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
159b0 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
159c0 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
159d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
159e0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
159f0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
15a00 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
15a10 63 6f 6e 64 73 29 7b 0a 23 69 66 20 64 65 66 69  conds){.#if defi
15a20 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
15a30 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
15a40 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
15a50 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e  conds);.  return
15a60 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
15a70 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
15a80 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
15a90 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
15aa0 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
15ab0 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  nds);.  return s
15ac0 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
15ad0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15ae0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
15af0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
15b00 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
15b10 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
15b20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
15b30 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
15b40 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
15b50 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
15b60 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
15b70 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
15b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
15b90 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
15ba0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
15bb0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
15bc0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
15bd0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
15be0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
15bf0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
15c00 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
15c10 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
15c20 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
15c30 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
15c40 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
15c50 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
15c60 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
15c70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
15c80 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
15c90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
15ca0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66  ble *prNow){.#if
15cb0 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20  def NO_GETTOD.  
15cc0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
15cd0 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
15ce0 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
15cf0 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20  0587.5;.#else.  
15d00 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
15d10 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
15d20 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
15d30 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
15d40 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
15d50 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
15d60 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30  .tv_usec/8640000
15d70 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23  0000.0;.#endif.#
15d80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15d90 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
15da0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
15db0 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c      *prNow = sql
15dc0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15dd0 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  e/86400.0 + 2440
15de0 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69  587.5;.  }.#endi
15df0 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
15e00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
15e10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
15e20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
15e30 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
15e40 7a 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20  zBuf){.  return 
15e50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
15e60 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
15e70 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
15e80 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
15e90 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
15ea0 69 64 29 7b 20 0a 20 20 2f 2a 20 4d 61 63 72 6f  id){ .  /* Macro
15eb0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 73   to define the s
15ec0 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73 20 6f  tatic contents o
15ed0 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  f an sqlite3_vfs
15ee0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 0a 20   structure for. 
15ef0 20 2a 2a 20 74 68 65 20 75 6e 69 78 20 62 61 63   ** the unix bac
15f00 6b 65 6e 64 2e 20 54 68 65 20 74 77 6f 20 70 61  kend. The two pa
15f10 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
15f20 20 76 61 6c 75 65 73 20 74 6f 20 75 73 65 20 66   values to use f
15f30 6f 72 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  or.  ** the sqli
15f40 74 65 33 5f 76 66 73 2e 7a 4e 61 6d 65 20 61 6e  te3_vfs.zName an
15f50 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 41  d sqlite3_vfs.pA
15f60 70 70 44 61 74 61 20 66 69 65 6c 64 73 2c 20 72  ppData fields, r
15f70 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
15f80 2a 20 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  * .  */.  #defin
15f90 65 20 55 4e 49 58 56 46 53 28 7a 56 66 73 4e 61  e UNIXVFS(zVfsNa
15fa0 6d 65 2c 20 70 56 66 73 41 70 70 44 61 74 61 29  me, pVfsAppData)
15fb0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
15fc0 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
16010 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
16020 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
16050 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
16060 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16080 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
16090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
160a0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
160b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
160c0 20 20 7a 56 66 73 4e 61 6d 65 2c 20 20 20 20 20    zVfsName,     
160d0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
160e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
160f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16100 28 76 6f 69 64 20 2a 29 70 56 66 73 41 70 70 44  (void *)pVfsAppD
16110 61 74 61 2c 20 20 2f 2a 20 70 41 70 70 44 61 74  ata,  /* pAppDat
16120 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
16130 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16140 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
16150 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
16180 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
16190 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
161c0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
161d0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
16200 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
16210 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
16220 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16230 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
16240 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
16250 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16270 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
16280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
16290 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
162a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
162b0 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
162c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
162d0 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
162e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
162f0 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
16300 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
16310 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
16320 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16330 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
16340 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
16350 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
16360 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
16370 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
16380 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
163b0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
163c0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
163d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
163e0 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
163f0 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a  astError      /*
16400 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
16410 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16420 5c 0a 20 20 7d 0a 0a 20 20 73 74 61 74 69 63 20  \.  }..  static 
16430 73 71 6c 69 74 65 33 5f 76 66 73 20 75 6e 69 78  sqlite3_vfs unix
16440 56 66 73 20 3d 20 55 4e 49 58 56 46 53 28 22 75  Vfs = UNIXVFS("u
16450 6e 69 78 22 2c 20 30 29 3b 0a 23 69 66 20 53 51  nix", 0);.#if SQ
16460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
16470 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
16480 69 3b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  i;.  static sqli
16490 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
164a0 20 7b 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22   {.    UNIXVFS("
164b0 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 4c  unix-posix",   L
164c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53  OCKING_STYLE_POS
164d0 49 58 29 2c 20 0a 20 20 20 20 55 4e 49 58 56 46  IX), .    UNIXVF
164e0 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20  S("unix-afp",   
164f0 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f    LOCKING_STYLE_
16500 41 46 50 29 2c 20 0a 20 20 20 20 55 4e 49 58 56  AFP), .    UNIXV
16510 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c  FS("unix-flock",
16520 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
16530 5f 46 4c 4f 43 4b 29 2c 20 0a 20 20 20 20 55 4e  _FLOCK), .    UN
16540 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66  IXVFS("unix-dotf
16550 69 6c 65 22 2c 20 4c 4f 43 4b 49 4e 47 5f 53 54  ile", LOCKING_ST
16560 59 4c 45 5f 44 4f 54 46 49 4c 45 29 2c 20 0a 20  YLE_DOTFILE), . 
16570 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
16580 2d 6e 6f 6e 65 22 2c 20 20 20 20 4c 4f 43 4b 49  -none",    LOCKI
16590 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 29 0a 20  NG_STYLE_NONE). 
165a0 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   };.  for(i=0; i
165b0 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
165c0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
165d0 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
165e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
165f0 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 30 29  ter(&aVfs[i], 0)
16600 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
16610 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
16620 74 65 72 28 26 75 6e 69 78 56 66 73 2c 20 31 29  ter(&unixVfs, 1)
16630 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16640 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
16650 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65  Shutdown the ope
16660 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
16670 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 69 73  terface. This is
16680 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
16690 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
166a0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
166b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
166c0 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
166d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
166e0 49 58 20 2a 2f 0a                                IX */.