/ Hex Artifact Content
Login

Artifact 88cfaa018b62a708bee91a984a48a59e56df2bc4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  tems..**.** $Id:
01c0: 20 6f 73 5f 75 6e 69 78 2e 63 2c 76 20 31 2e 32   os_unix.c,v 1.2
01d0: 31 34 20 32 30 30 38 2f 31 31 2f 31 39 20 31 33  14 2008/11/19 13
01e0: 3a 35 32 3a 33 30 20 64 61 6e 69 65 6c 6b 31 39  :52:30 danielk19
01f0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0200: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0210: 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  h".#if SQLITE_OS
0220: 5f 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20  _UNIX           
0230: 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20     /* This file 
0240: 69 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20  is used on unix 
0250: 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  only */../*.** I
0260: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0270: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
0280: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73 20   defined and is 
0290: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 73  non-zero, then s
02a0: 65 76 65 72 61 6c 0a 2a 2a 20 61 6c 74 65 72 6e  everal.** altern
02b0: 61 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  ative locking im
02c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 72  plementations ar
02d0: 65 20 70 72 6f 76 69 64 65 64 3a 0a 2a 2a 0a 2a  e provided:.**.*
02e0: 2a 20 20 20 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  *   * POSIX lock
02f0: 69 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74  ing (the default
0300: 29 2c 0a 2a 2a 20 20 20 2a 20 4e 6f 20 6c 6f 63  ),.**   * No loc
0310: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 44 6f 74  king,.**   * Dot
0320: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
0330: 2a 20 20 20 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  *   * flock() lo
0340: 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 41 46  cking,.**   * AF
0350: 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f  P locking (OSX o
0360: 6e 6c 79 29 2c 0a 2a 2a 20 20 20 2a 20 4e 61 6d  nly),.**   * Nam
0370: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
0380: 72 65 73 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c  res (VXWorks onl
0390: 79 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  y)..**.** SQLITE
03a0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
03b0: 53 54 59 4c 45 20 6f 6e 6c 79 20 77 6f 72 6b 73  STYLE only works
03c0: 20 6f 6e 20 61 20 4d 61 63 2e 20 49 74 20 69 73   on a Mac. It is
03d0: 20 74 75 72 6e 65 64 20 6f 6e 20 62 79 0a 2a 2a   turned on by.**
03e0: 20 64 65 66 61 75 6c 74 20 6f 6e 20 61 20 4d 61   default on a Ma
03f0: 63 20 61 6e 64 20 64 69 73 61 62 6c 65 64 20 6f  c and disabled o
0400: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 70 6f 73 69  n all other posi
0410: 78 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2f 0a  x platforms..*/.
0420: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0430: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0440: 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20  NG_STYLE).#  if 
0450: 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
0460: 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  __).#    define 
0470: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0480: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20  CKING_STYLE 1.# 
0490: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
04a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
04b0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a  LOCKING_STYLE 0.
04c0: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
04d0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68  ./*.** Define th
04e0: 65 20 49 53 5f 56 58 57 4f 52 4b 53 20 70 72 65  e IS_VXWORKS pre
04f0: 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f  -processor macro
0500: 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64 69 6e   to 1 if buildin
0510: 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72 6b 73  g on .** vxworks
0520: 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
0530: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
0540: 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66  (__RTP__) || def
0550: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
0560: 29 0a 23 20 20 64 65 66 69 6e 65 20 49 53 5f 56  ).#  define IS_V
0570: 58 57 4f 52 4b 53 20 31 0a 23 65 6c 73 65 0a 23  XWORKS 1.#else.#
0580: 20 20 64 65 66 69 6e 65 20 49 53 5f 56 58 57 4f    define IS_VXWO
0590: 52 4b 53 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RKS 0.#endif../*
05a0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
05b0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
05c0: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
05d0: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
05e0: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
05f0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0600: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0610: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0620: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0630: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0640: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0650: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0660: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0670: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0680: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0690: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
06a0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
06b0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
06c0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
06d0: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
06e0: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
06f0: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0700: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0710: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0720: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0730: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0740: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0750: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0760: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0770: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0780: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0790: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
07a0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
07b0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
07c0: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
07d0: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
07e0: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
07f0: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0800: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0810: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0820: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69   omit LFS..*/.#i
0830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
0840: 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e  ABLE_LFS.# defin
0850: 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20  e _LARGE_FILE   
0860: 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f      1.# ifndef _
0870: 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53  FILE_OFFSET_BITS
0880: 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c  .#   define _FIL
0890: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34  E_OFFSET_BITS 64
08a0: 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e  .# endif.# defin
08b0: 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55  e _LARGEFILE_SOU
08c0: 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RCE 1.#endif../*
08d0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63  .** standard inc
08e0: 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23  lude files..*/.#
08f0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
0900: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
0910: 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63  sys/stat.h>.#inc
0920: 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23  lude <fcntl.h>.#
0930: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0940: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  h>.#include <tim
0950: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
0960: 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  ys/time.h>.#incl
0970: 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 23  ude <errno.h>..#
0980: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
0990: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
09a0: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f   include <sys/io
09b0: 63 74 6c 2e 68 3e 0a 23 20 69 66 20 49 53 5f 56  ctl.h>.# if IS_V
09c0: 58 57 4f 52 4b 53 0a 23 20 20 64 65 66 69 6e 65  XWORKS.#  define
09d0: 20 6c 73 74 61 74 20 73 74 61 74 0a 23 20 20 69   lstat stat.#  i
09e0: 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72  nclude <semaphor
09f0: 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20  e.h>.#  include 
0a00: 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73  <limits.h>.# els
0a10: 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  e.#  include <sy
0a20: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 20 69 6e  s/param.h>.#  in
0a30: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0a40: 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  .h>.# endif.#end
0a50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
0a60: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0a70: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77  E */../*.** If w
0a80: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
0a90: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
0aa0: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
0ab0: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
0ac0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
0ad0: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
0ae0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0af0: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
0b00: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
0b10: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0b20: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
0b30: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0b40: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
0b50: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
0b60: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
0b70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
0b80: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
0b90: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
0ba0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
0bb0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
0bc0: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  644.#endif../*.*
0bd0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
0be0: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
0bf0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
0c00: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f  PATHNAME 512.../
0c10: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
0c20: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
0c30: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
0c40: 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63  e3_file specific
0c50: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a 2a   for the unix.**
0c60: 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61 79   protability lay
0c70: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c80: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75  truct unixFile u
0c90: 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  nixFile;.struct 
0ca0: 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c  unixFile {.  sql
0cb0: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
0cc0: 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20  const *pMethod; 
0cd0: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
0ce0: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 23 69  irst entry */.#i
0cf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0d00: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
0d10: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
0d20: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
0d30: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
0d40: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
0d50: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
0d60: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
0d70: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
0d80: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
0d90: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
0da0: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0db0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
0dc0: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
0dd0: 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20  t all open fd's 
0de0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
0df0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
0e00: 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20  fo *pLock;   /* 
0e10: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
0e20: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
0e30: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
0e40: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0e50: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
0e60: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
0e70: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
0e80: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
0e90: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 68 3b  .#endif.  int h;
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
0ec0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
0ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f  unsigned char lo
0ee0: 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54 68 65  cktype;   /* The
0ef0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
0f00: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
0f10: 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20 20  .  int dirfd;   
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f30: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
0f40: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
0f50: 79 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  y */.#if SQLITE_
0f60: 54 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68  THREADSAFE.  pth
0f70: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0f90: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0fa0: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
0fb0: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6c  /.#endif.  int l
0fc0: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
0fd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78       /* The unix
0fe0: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
0ff0: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1000: 2f 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53  /.#if IS_VXWORKS
1010: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1030: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
1040: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 63 68 61  if true */.  cha
1050: 72 20 2a 7a 52 65 61 6c 70 61 74 68 3b 0a 23 65  r *zRealpath;.#e
1060: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
1070: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
1080: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
1090: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
10a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
10b0: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
10c0: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
10d0: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
10e0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
10f0: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
1100: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
1110: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
1120: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
1130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
1140: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
1150: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
1160: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
1170: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
1180: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
1190: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
11a0: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
11b0: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
11c0: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
11d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
11e0: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
11f0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
1200: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
1210: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
1220: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
1230: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
1240: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
1250: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
1260: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
1270: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
1280: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
1290: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
12a0: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
12b0: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
12c0: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
12d0: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
12e0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20  def __DJGPP__.# 
12f0: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42  define fcntl(A,B
1300: 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,C) 0.#endif../*
1310: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
1320: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
1330: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
1340: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
1350: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
1360: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
1370: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
1380: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
1390: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
13a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
13b0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
13c0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
13d0: 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20  ** Set or check 
13e0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64  the unixFile.tid
13f0: 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69   field.  This fi
1400: 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20  eld is set when 
1410: 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69  an unixFile.** i
1420: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
1430: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1440: 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78  uses of the unix
1450: 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61 74  File verify that
1460: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72   the.** same thr
1470: 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ead is operating
1480: 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65   on the unixFile
1490: 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  .  Some operatin
14a0: 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20  g systems do.** 
14b0: 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20  not allow locks 
14c0: 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  to be overridden
14d0: 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61 64   by other thread
14e0: 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74 72  s and that restr
14f0: 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20  iction.** means 
1500: 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61  that sqlite3* da
1510: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63  tabase handles c
1520: 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66  annot be moved f
1530: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a  rom one thread.*
1540: 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 54  * to another.  T
1550: 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73 20  his logic makes 
1560: 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65 73  sure a user does
1570: 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20 74   not try to do t
1580: 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61 6b  hat.** by mistak
1590: 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e  e..**.** Version
15a0: 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d   3.3.1 (2006-01-
15b0: 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63  15):  unixFile c
15c0: 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d  an be moved from
15d0: 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a   one thread to.*
15e0: 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  * another as lon
15f0: 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e  g as we are runn
1600: 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20  ing on a system 
1610: 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74 68  that supports th
1620: 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64  reads.** overrid
1630: 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73 20  ing each others 
1640: 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f 77  locks (which now
1650: 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   the most common
1660: 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72   behavior).** or
1670: 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   if no locks are
1680: 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20   held.  But the 
1690: 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66  unixFile.pLock f
16a0: 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65  ield needs to be
16b0: 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62  .** recomputed b
16c0: 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69  ecause its key i
16d0: 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65  ncludes the thre
16e0: 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20  ad-id.  See the 
16f0: 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  .** transferOwne
1700: 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e  rship() function
1710: 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74   below for addit
1720: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1730: 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  n.*/.#if SQLITE_
1740: 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65 66  THREADSAFE.# def
1750: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1760: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
1770: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
1780: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
1790: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
17a0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
17b0: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
17c0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
17e0: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
17f0: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
1800: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
1810: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
1820: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
1830: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
1840: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
1850: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64  ** Here is the d
1860: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76  irt on POSIX adv
1870: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e  isory locks:  AN
1880: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
1890: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
18a0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
18b0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
18c0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
18d0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
18e0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
18f0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
1900: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
1910: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
1920: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
1930: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
1940: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
1950: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
1960: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
1970: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
1980: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
1990: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
19a0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
19b0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
19c0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
19d0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 20  s test case:.** 
19e0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
19f0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
1a00: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
1a10: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
1a20: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
1a30: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
1a40: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
1a50: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
1a60: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
1a70: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
1a80: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
1a90: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
1aa0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1ab0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
1ac0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
1ad0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
1ae0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
1af0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
1b00: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
1b10: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
1b20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
1b30: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
1b40: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
1b50: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
1b60: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
1b70: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
1b80: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
1b90: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
1ba0: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
1bb0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
1bc0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
1bd0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1be0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
1bf0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
1c00: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
1c10: 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66  *.** Bummer.  If
1c20: 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69   you ask me, thi
1c30: 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61  s is broken.  Ba
1c40: 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20  dly broken.  It 
1c50: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
1c60: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
1c70: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
1c80: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
1c90: 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70  ss among.** comp
1ca0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
1cb0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1cc0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
1cd0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
1ce0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
1cf0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
1d00: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
1d10: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
1d20: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
1d30: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
1d40: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
1d50: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
1d60: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
1d70: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
1d80: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
1d90: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
1da0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
1db0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
1dc0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
1dd0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
1de0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
1df0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e00: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
1e10: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e20: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
1e30: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
1e40: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
1e50: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
1e60: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
1e70: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
1e80: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
1e90: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
1ea0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
1eb0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
1ec0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
1ed0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
1ee0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
1ef0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
1f00: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
1f10: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
1f20: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
1f30: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
1f40: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
1f50: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
1f60: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
1f70: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
1f80: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
1f90: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
1fa0: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
1fb0: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
1fc0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
1fd0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
1fe0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
1ff0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
2000: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2010: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
2020: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
2030: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2040: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
2050: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
2060: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
2070: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
2080: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
2090: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
20a0: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
20b0: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
20c0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
20d0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
20e0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
20f0: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
2100: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2110: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
2120: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
2130: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
2140: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
2150: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
2160: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
2170: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
2180: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
2190: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
21a0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
21b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
21c0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
21d0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
21e0: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
21f0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
2200: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
2210: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
2220: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
2230: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
2240: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
2250: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
2260: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
2270: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
2280: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
2290: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
22a0: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
22b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
22c0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
22d0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
22e0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  state..**.** 200
22f0: 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72  4-Jan-11:.** Mor
2300: 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76 65  e recent discove
2310: 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49 58  ries about POSIX
2320: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
2330: 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49    (The more.** I
2340: 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20 6d   discover, the m
2350: 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74 68  ore I realize th
2360: 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73 6f  e a POSIX adviso
2370: 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  ry locks are.** 
2380: 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29  an abomination.)
2390: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
23a0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
23b0: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
23c0: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
23d0: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
23e0: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
23f0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
2400: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
2410: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
2420: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
2430: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
2440: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
2450: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2460: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
2470: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2480: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2490: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
24a0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
24b0: 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e  e.** per open in
24c0: 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ode, which means
24d0: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75   that multiple u
24e0: 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e  nixFile can poin
24f0: 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  t to a single.**
2500: 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20   openCnt.  When 
2510: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2520: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
2530: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
2540: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
2550: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
2560: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
2570: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
2580: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
2590: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
25a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
25b0: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
25c0: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
25d0: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
25e0: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
25f0: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
2600: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
2610: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
2620: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
2630: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
2640: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
2650: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
2660: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
2670: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c  rs..**.** First,
2680: 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72   under Linux thr
2690: 65 61 64 73 2c 20 62 65 63 61 75 73 65 20 65 61  eads, because ea
26a0: 63 68 20 74 68 72 65 61 64 20 68 61 73 20 61 20  ch thread has a 
26b0: 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63  separate.** proc
26c0: 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65  ess ID, lock ope
26d0: 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74  rations in one t
26e0: 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65  hread do not ove
26f0: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74  rride locks.** t
2700: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
2710: 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  in other threads
2720: 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73  .  Linux threads
2730: 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20   behave like.** 
2740: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
2750: 65 73 20 69 6e 20 74 68 69 73 20 72 65 73 70 65  es in this respe
2760: 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75  ct.  But, if you
2770: 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a   close a file.**
2780: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c   descriptor in l
2790: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c  inux threads, al
27a0: 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61  l locks are clea
27b0: 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a  red, even locks.
27c0: 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65  ** on other thre
27d0: 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f  ads and even tho
27e0: 75 67 68 20 74 68 65 20 6f 74 68 65 72 20 74 68  ugh the other th
27f0: 72 65 61 64 73 20 68 61 76 65 20 64 69 66 66 65  reads have diffe
2800: 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20  rent.** process 
2810: 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65  IDs.  Linux thre
2820: 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  ads is inconsist
2830: 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73 70  ent in this resp
2840: 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67  ect..** (I'm beg
2850: 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20  inning to think 
2860: 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61  that linux threa
2870: 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61  ds is an abomina
2880: 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68  tion too.).** Th
2890: 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66  e consequence of
28a0: 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61   this all is tha
28b0: 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  t the hash table
28c0: 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66   for the lockInf
28d0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68  o.** structure h
28e0: 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  as to include th
28f0: 65 20 70 72 6f 63 65 73 73 20 69 64 20 61 73 20  e process id as 
2900: 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20  part of its key 
2910: 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73  because.** locks
2920: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68   in different th
2930: 72 65 61 64 73 20 61 72 65 20 74 72 65 61 74 65  reads are treate
2940: 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20  d as distinct.  
2950: 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e  But the .** open
2960: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 73 68  Cnt structure sh
2970: 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65  ould not include
2980: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20   the process id 
2990: 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65  in its.** key be
29a0: 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c  cause close() cl
29b0: 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c  ears lock on all
29c0: 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75   threads, not ju
29d0: 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  st the current.*
29e0: 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72 65 20  * thread.  Were 
29f0: 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20  it not for this 
2a00: 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e  goofiness in lin
2a10: 75 78 20 74 68 72 65 61 64 73 2c 20 77 65 20 63  ux threads, we c
2a20: 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20  ould.** combine 
2a30: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64  the lockInfo and
2a40: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
2a50: 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  res into a singl
2a60: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
2a70: 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a  ** 2004-Jun-28:.
2a80: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69  ** On some versi
2a90: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68  ons of linux, th
2aa0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
2ab0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
2ac0: 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65  ocks..** On othe
2ad0: 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d  rs not.  Sometim
2ae0: 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e 67  es you can chang
2af0: 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  e the behavior o
2b00: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79  n the same.** sy
2b10: 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67 20  stem by setting 
2b20: 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45  the LD_ASSUME_KE
2b30: 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  RNEL environment
2b40: 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65 0a   variable.  The.
2b50: 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61 72  ** POSIX standar
2b60: 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20 74  d is silent as t
2b70: 6f 20 77 68 69 63 68 20 62 65 68 61 76 69 6f 72  o which behavior
2b80: 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73 20   is correct, as 
2b90: 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20  far.** as I can 
2ba0: 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76  tell, so other v
2bb0: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20  ersions of unix 
2bc0: 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65 20 73  might show the s
2bd0: 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74  ame.** inconsist
2be0: 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73 20  ency.  There is 
2bf0: 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74 20  no little doubt 
2c00: 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74 20  in my mind that 
2c10: 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72  posix.** advisor
2c20: 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75  y locks and linu
2c30: 78 20 74 68 72 65 61 64 73 20 61 72 65 20 70 72  x threads are pr
2c40: 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e  ofoundly broken.
2c50: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
2c60: 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73  round the incons
2c70: 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68 61  istencies, we ha
2c80: 76 65 20 74 6f 20 74 65 73 74 20 61 74 20 72 75  ve to test at ru
2c90: 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65  ntime .** whethe
2ca0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
2cb0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2cc0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
2cd0: 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20 69    This test.** i
2ce0: 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20  s run once, the 
2cf0: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
2d00: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
2d10: 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a 20  .  A static .** 
2d20: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
2d30: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72 65  to record the re
2d40: 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74 65  sults of this te
2d50: 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a  st for future.**
2d60: 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20   use..*/../*.** 
2d70: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2d80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2d90: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
2da0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
2db0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
2dc0: 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f  ticular lockInfo
2dd0: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
2de0: 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a   its inode..**.*
2df0: 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e  * If threads can
2e00: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
2e10: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20  h others locks, 
2e20: 74 68 65 6e 20 77 65 20 73 65 74 20 74 68 65 0a  then we set the.
2e30: 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66  ** lockKey.tid f
2e40: 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65  ield to the thre
2e50: 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65 61  ad ID.  If threa
2e60: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a  ds can override.
2e70: 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  ** each others l
2e80: 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69 73  ocks then tid is
2e90: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2ea0: 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d 69  ero.  tid is omi
2eb0: 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f  tted.** if we co
2ec0: 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68  mpile without th
2ed0: 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e  reading support.
2ee0: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b  .*/.struct lockK
2ef0: 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  ey {.  dev_t dev
2f00: 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63  ;       /* Devic
2f10: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
2f20: 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 76 6f 69  IS_VXWORKS.  voi
2f30: 64 20 2a 72 6e 61 6d 3b 20 20 20 20 20 20 2f 2a  d *rnam;      /*
2f40: 20 52 65 61 6c 6e 61 6d 65 20 73 69 6e 63 65 20   Realname since 
2f50: 69 6e 6f 64 65 20 75 6e 75 73 61 62 6c 65 20 2a  inode unusable *
2f60: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
2f70: 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ino;       /* In
2f80: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
2f90: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
2fa0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68  THREADSAFE.  pth
2fb0: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a  read_t tid;   /*
2fc0: 20 54 68 72 65 61 64 20 49 44 20 6f 72 20 7a 65   Thread ID or ze
2fd0: 72 6f 20 69 66 20 74 68 72 65 61 64 73 20 63 61  ro if threads ca
2fe0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
2ff0: 6f 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  other */.#endif.
3000: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
3010: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3020: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3030: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
3040: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
3050: 6e 6f 64 65 20 6f 6e 20 65 61 63 68 20 74 68 72  node on each thr
3060: 65 61 64 20 77 69 74 68 20 61 20 64 69 66 66 65  ead with a diffe
3070: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 2e  rent process ID.
3080: 20 20 28 54 68 72 65 61 64 73 20 68 61 76 65 0a    (Threads have.
3090: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  ** different pro
30a0: 63 65 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75  cess IDs on linu
30b0: 78 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f  x, but not on mo
30c0: 73 74 20 6f 74 68 65 72 20 75 6e 69 78 65 73 2e  st other unixes.
30d0: 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ).**.** A single
30e0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
30f0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
3100: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
3110: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
3120: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
3130: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3150: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
3160: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
3170: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
3180: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
3190: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
31a0: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c   it..*/.struct l
31b0: 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  ockInfo {.  stru
31c0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20  ct lockKey key; 
31d0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
31e0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  ey */.  int cnt;
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3200: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
3210: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
3220: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
3230: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3240: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
3250: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
3260: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3280: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
3290: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
32a0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f  e */.  struct lo
32b0: 63 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 2c 20 2a  ckInfo *pNext, *
32c0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74  pPrev;   /* List
32d0: 20 6f 66 20 61 6c 6c 20 6c 6f 63 6b 49 6e 66 6f   of all lockInfo
32e0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
32f0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3300: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3310: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
3320: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
3330: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
3340: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70   a particular op
3350: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
3360: 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e  given its inode.
3370: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65    This.** is the
3380: 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c 6f 63   same as the loc
3390: 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74  kKey except that
33a0: 20 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69   the thread ID i
33b0: 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  s omitted..*/.st
33c0: 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a 20  ruct openKey {. 
33d0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a   dev_t dev;   /*
33e0: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
33f0: 2f 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53  /.#if IS_VXWORKS
3400: 0a 20 20 76 6f 69 64 20 2a 72 6e 61 6d 3b 20 20  .  void *rnam;  
3410: 2f 2a 20 52 65 61 6c 6e 61 6d 65 20 73 69 6e 63  /* Realname sinc
3420: 65 20 69 6e 6f 64 65 20 75 6e 75 73 61 62 6c 65  e inode unusable
3430: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
3440: 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64  t ino;   /* Inod
3450: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
3460: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
3470: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3480: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3490: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
34a0: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
34b0: 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20 73  * inode.  This s
34c0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
34d0: 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62  rack of the numb
34e0: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74  er of locks on t
34f0: 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49  hat.** inode.  I
3500: 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74 74  f a close is att
3510: 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20 61  empted against a
3520: 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73 20  n inode that is 
3530: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73  holding.** locks
3540: 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20 64  , the close is d
3550: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
3560: 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62 79  l locks clear by
3570: 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66   adding the.** f
3580: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
3590: 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20 74  o be closed to t
35a0: 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e  he pending list.
35b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 43  .*/.struct openC
35c0: 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20 6f 70  nt {.  struct op
35d0: 65 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f 2a 20  enKey key;   /* 
35e0: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
35f0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3610: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
3620: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
3630: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
3640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3650: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
3660: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
3670: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
3680: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3690: 20 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73   of pending clos
36a0: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  e() operations *
36b0: 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e  /.  int *aPendin
36c0: 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c  g;        /* Mal
36d0: 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c 64  loced space hold
36e0: 69 6e 67 20 66 64 27 73 20 61 77 61 69 74 69 6e  ing fd's awaitin
36f0: 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 23  g a close() */.#
3700: 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if IS_VXWORKS.  
3710: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
3720: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
3730: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
3740: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
3750: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
3760: 5d 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ];   /* Name of 
3770: 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a  that semaphore *
3780: 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63  /.#endif.  struc
3790: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74  t openCnt *pNext
37a0: 2c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  , *pPrev;   /* L
37b0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 43  ist of all openC
37c0: 6e 74 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b  nt objects */.};
37d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66 20  ../*.** List of 
37e0: 61 6c 6c 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64  all lockInfo and
37f0: 20 6f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73   openCnt objects
3800: 2e 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  .  This used to 
3810: 62 65 20 61 20 68 61 73 68 0a 2a 2a 20 74 61 62  be a hash.** tab
3820: 6c 65 2e 20 20 42 75 74 20 74 68 65 20 6e 75 6d  le.  But the num
3830: 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 69  ber of objects i
3840: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
3850: 61 6e 20 61 20 64 6f 7a 65 6e 20 61 6e 64 0a 2a  an a dozen and.*
3860: 2a 20 6e 65 76 65 72 20 65 78 63 65 65 64 73 20  * never exceeds 
3870: 61 20 66 65 77 20 74 68 6f 75 73 61 6e 64 2e 20  a few thousand. 
3880: 20 41 6e 64 20 6c 6f 6f 6b 75 70 20 69 73 20 6e   And lookup is n
3890: 6f 74 20 6f 6e 20 61 20 63 72 69 74 69 63 61 6c  ot on a critical
38a0: 0a 2a 2a 20 70 61 74 68 20 6f 6f 20 61 20 73 69  .** path oo a si
38b0: 6d 70 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74  mple linked list
38c0: 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 0a 2a   will suffice..*
38d0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
38e0: 6c 6f 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69  lockInfo *lockLi
38f0: 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73  st = 0;.static s
3900: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 6f  truct openCnt *o
3910: 70 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 23 69  penList = 0;..#i
3920: 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a  f IS_VXWORKS./*.
3930: 2a 2a 20 54 68 69 73 20 68 61 73 68 20 74 61 62  ** This hash tab
3940: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 62 69  le is used to bi
3950: 6e 64 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  nd the canonical
3960: 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 61 0a   file name to a.
3970: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  ** unixFile stru
3980: 63 74 75 72 65 20 61 6e 64 20 75 73 65 20 74 68  cture and use th
3990: 65 20 68 61 73 68 20 6b 65 79 20 28 3d 20 63 61  e hash key (= ca
39a0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 29 0a 2a 2a  nonical name).**
39b0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
39c0: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 6f 66 20  Inode number of 
39d0: 74 68 65 20 66 69 6c 65 20 74 6f 20 66 69 6e 64  the file to find
39e0: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 2a 2a   the matching.**
39f0: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
3a00: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3a10: 2e 20 49 74 20 61 6c 73 6f 20 68 65 6c 70 73 20  . It also helps 
3a20: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 6e  to make the.** n
3a30: 61 6d 65 20 6f 66 20 74 68 65 20 73 65 6d 61 70  ame of the semap
3a40: 68 6f 72 65 20 77 68 65 6e 20 4c 4f 43 4b 49 4e  hore when LOCKIN
3a50: 47 5f 53 54 59 4c 45 5f 4e 41 4d 45 44 53 45 4d  G_STYLE_NAMEDSEM
3a60: 20 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20   is used.** for 
3a70: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
3a80: 74 69 63 20 48 61 73 68 20 6e 61 6d 65 48 61 73  tic Hash nameHas
3a90: 68 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h;.#endif../*.**
3aa0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79   The locking sty
3ab0: 6c 65 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  les are associat
3ac0: 65 64 20 77 69 74 68 20 74 68 65 20 64 69 66 66  ed with the diff
3ad0: 65 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63 6b 69  erent file locki
3ae0: 6e 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69 74 69  ng.** capabiliti
3af0: 65 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  es supported by 
3b00: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 73  different file s
3b10: 79 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  ystems.  .**.** 
3b20: 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 73 74  POSIX locking st
3b30: 79 6c 65 20 66 75 6c 6c 79 20 73 75 70 70 6f 72  yle fully suppor
3b40: 74 73 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ts shared and ex
3b50: 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
3b60: 67 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41 46 50  ge locks .** AFP
3b70: 20 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20 73 75   locking only su
3b80: 70 70 6f 72 74 73 20 65 78 63 6c 75 73 69 76 65  pports exclusive
3b90: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
3ba0: 73 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c 79 20  s.** FLOCK only 
3bb0: 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c  supports a singl
3bc0: 65 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20 65 78  e file-global ex
3bd0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
3be0: 44 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20 61 20  DOTLOCK isn't a 
3bf0: 74 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  true locking sty
3c00: 6c 65 2c 20 69 74 20 72 65 66 65 72 73 20 74 6f  le, it refers to
3c10: 20 74 68 65 20 75 73 65 20 6f 66 20 61 20 73 70   the use of a sp
3c20: 65 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c 65 20  ecial.**   file 
3c30: 6e 61 6d 65 64 20 74 68 65 20 73 61 6d 65 20 61  named the same a
3c40: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
3c50: 69 6c 65 20 77 69 74 68 20 61 20 27 2e 6c 6f 63  ile with a '.loc
3c60: 6b 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68  k' extension, th
3c70: 69 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65 20 75  is.**   can be u
3c80: 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 79 73 74  sed on file syst
3c90: 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ems that do not 
3ca0: 6f 66 66 65 72 20 61 6e 79 20 72 65 6c 69 61 62  offer any reliab
3cb0: 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  le file locking.
3cc0: 2a 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20 6d 65  ** NO locking me
3cd0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b  ans that no lock
3ce0: 69 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65  ing will be atte
3cf0: 6d 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f  mpted, this is o
3d00: 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
3d10: 20 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65    read-only file
3d20: 20 73 79 73 74 65 6d 73 20 63 75 72 72 65 6e 74   systems current
3d30: 6c 79 0a 2a 2a 20 4e 41 4d 45 44 53 45 4d 20 69  ly.** NAMEDSEM i
3d40: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 44 4f 54  s similar to DOT
3d50: 4c 4f 43 4b 20 62 75 74 20 75 73 65 73 20 61 20  LOCK but uses a 
3d60: 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
3d70: 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
3d80: 20 20 20 69 6e 64 69 63 61 74 6f 72 20 66 69 6c     indicator fil
3d90: 65 2e 0a 2a 2a 20 55 4e 53 55 50 50 4f 52 54 45  e..** UNSUPPORTE
3da0: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  D means that no 
3db0: 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20  locking will be 
3dc0: 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
3dd0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
3de0: 0a 2a 2a 20 20 20 66 69 6c 65 20 73 79 73 74 65  .**   file syste
3df0: 6d 73 20 74 68 61 74 20 61 72 65 20 6b 6e 6f 77  ms that are know
3e00: 6e 20 74 6f 20 62 65 20 75 6e 73 75 70 70 6f 72  n to be unsuppor
3e10: 74 65 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ted.*/.#define L
3e20: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53  OCKING_STYLE_POS
3e30: 49 58 20 20 20 20 20 20 20 20 31 0a 23 64 65 66  IX        1.#def
3e40: 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ine LOCKING_STYL
3e50: 45 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 32  E_NONE         2
3e60: 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47  .#define LOCKING
3e70: 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 20 20  _STYLE_DOTFILE  
3e80: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4c 4f      3.#define LO
3e90: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43  CKING_STYLE_FLOC
3ea0: 4b 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69  K        4.#defi
3eb0: 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ne LOCKING_STYLE
3ec0: 5f 41 46 50 20 20 20 20 20 20 20 20 20 20 35 0a  _AFP          5.
3ed0: 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f  #define LOCKING_
3ee0: 53 54 59 4c 45 5f 4e 41 4d 45 44 53 45 4d 20 20  STYLE_NAMEDSEM  
3ef0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79     6../*.** Only
3f00: 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72   set the lastErr
3f10: 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  no if the error 
3f20: 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65  code is a real e
3f30: 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a  rror and not .**
3f40: 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74   a normal expect
3f50: 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f  ed return code o
3f60: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  f SQLITE_BUSY or
3f70: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64   SQLITE_OK.*/.#d
3f80: 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52  efine IS_LOCK_ER
3f90: 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53  ROR(x)  ((x != S
3fa0: 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20  QLITE_OK) && (x 
3fb0: 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29  != SQLITE_BUSY))
3fc0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
3fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
3fe0: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
3ff0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
4000: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
4010: 69 64 20 65 6e 74 65 72 4d 75 74 65 78 28 76 6f  id enterMutex(vo
4020: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
4030: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
4040: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
4050: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
4060: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
4070: 74 69 63 20 76 6f 69 64 20 6c 65 61 76 65 4d 75  tic void leaveMu
4080: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
4090: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
40a0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
40b0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
40c0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
40d0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .}..#if SQLITE_T
40e0: 48 52 45 41 44 53 41 46 45 0a 2f 2a 0a 2a 2a 20  HREADSAFE./*.** 
40f0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65  This variable re
4100: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f 72  cords whether or
4110: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
4120: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4130: 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a  thers.** locks..
4140: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e  **.**    0:  No.
4150: 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74    Threads cannot
4160: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4170: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
4180: 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72     1:  Yes.  Thr
4190: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
41a0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
41b0: 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20 57  cks..**   -1:  W
41c0: 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74  e don't know yet
41d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ..**.** On some 
41e0: 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77  systems, we know
41f0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
4200: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
4210: 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a  override each.**
4220: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
4230: 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  On those systems
4240: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  , the SQLITE_THR
4250: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
4260: 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20  K macro.** will 
4270: 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  be set appropria
4280: 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20  tely.  On other 
4290: 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65  systems, we have
42a0: 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20   to check at.** 
42b0: 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65  runtime.  On the
42c0: 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d  se latter system
42d0: 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44  s, SQLTIE_THREAD
42e0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69  _OVERRIDE_LOCK i
42f0: 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s.** undefined..
4300: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  **.** This varia
4310: 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73  ble normally has
4320: 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79   file scope only
4330: 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65  .  But during te
4340: 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a  sting, we make.*
4350: 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f  * it a global so
4360: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63   that the test c
4370: 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69  ode can change i
4380: 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ts value in orde
4390: 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74  r to verify.** t
43a0: 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74  hat the right st
43b0: 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65  uff happens in e
43c0: 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23  ither case..*/.#
43d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48  ifndef SQLITE_TH
43e0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
43f0: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
4400: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
4410: 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64 69  DE_LOCK -1.#endi
4420: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4430: 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64 73  TEST.int threads
4440: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
4450: 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45  rsLocks = SQLITE
4460: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
4470: 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74 61  _LOCK;.#else.sta
4480: 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f  tic int threadsO
4490: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
44a0: 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f  sLocks = SQLITE_
44b0: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
44c0: 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK;.#endif../*
44d0: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
44e0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
44f0: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
4500: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
4510: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
4520: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
4530: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
4540: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
4550: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4560: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4580: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
4590: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
45a0: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
45b0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
45c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
45d0: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
45e0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
45f0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
4600: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
4610: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
4620: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
4630: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
4640: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
4650: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
4660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4670: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
4680: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
4690: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
46a0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
46b0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
46c0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
46d0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
46e0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
46f0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
4700: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
4710: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
4720: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
4730: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
4740: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
4750: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
4760: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
4770: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
4780: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
4790: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
47a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
47b0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
47c0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
47d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
47e0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
47f0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
4800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
4810: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
4830: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
4840: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
4850: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
4860: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
4870: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
4880: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
4890: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
48a0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
48b0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
48c0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
48d0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
48e0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
48f0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
4900: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
4910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4920: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
4930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
4940: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
4950: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
4960: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
4970: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
4980: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4990: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
49a0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
49b0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
49c0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
49d0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
49e0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
49f0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
4a00: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
4a10: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
4a20: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
4a30: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
4a40: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
4a50: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
4a60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
4a70: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
4a80: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
4a90: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
4aa0: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
4ab0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
4ac0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
4ad0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
4ae0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
4af0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
4b00: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
4b10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
4b20: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
4b30: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4b40: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
4b50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
4b60: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
4b70: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4b80: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
4b90: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
4ba0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4bb0: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
4bc0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
4bd0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
4be0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
4bf0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
4c00: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
4c10: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
4c20: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
4c30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
4c40: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 23 69 66 64  K_TRACE */..#ifd
4c50: 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a  ef __linux__./*.
4c60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4c70: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
4c80: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
4c90: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
4ca0: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
4cb0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
4cc0: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
4cd0: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
4ce0: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
4cf0: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
4d00: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
4d10: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
4d20: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
4d30: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
4d40: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
4d50: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
4d60: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
4d70: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
4d80: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
4d90: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
4da0: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
4db0: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
4dc0: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
4dd0: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
4de0: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
4df0: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
4e00: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
4e10: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
4e20: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
4e30: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4e40: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
4e50: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
4e60: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
4e70: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
4e80: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
4e90: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
4ea0: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
4eb0: 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pArg;.}../*.*
4ec0: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
4ed0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
4ee0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
4ef0: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a  r not threads.**
4f00: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4f10: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
4f20: 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a  then sets the .*
4f30: 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  * threadsOverrid
4f40: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
4f50: 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70   variable approp
4f60: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
4f70: 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65  ic void testThre
4f80: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
4f90: 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a  r(int fd_orig){.
4fa0: 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20    int fd;.  int 
4fb0: 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72  rc;.  struct thr
4fc0: 65 61 64 54 65 73 74 44 61 74 61 20 64 3b 0a 20  eadTestData d;. 
4fd0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 3b   struct flock l;
4fe0: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 3b 0a  .  pthread_t t;.
4ff0: 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f  .  fd = dup(fd_o
5000: 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  rig);.  if( fd<0
5010: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
5020: 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a 65 6f  set(&l, 0, sizeo
5030: 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74 79 70  f(l));.  l.l_typ
5040: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 6c  e = F_RDLCK;.  l
5050: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 2e  .l_len = 1;.  l.
5060: 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
5070: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
5080: 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66 63 6e  _SET;.  rc = fcn
5090: 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f 53 45  tl(fd_orig, F_SE
50a0: 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66 28 20  TLK, &l);.  if( 
50b0: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  rc!=0 ) return;.
50c0: 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30 2c 20    memset(&d, 0, 
50d0: 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 2e  sizeof(d));.  d.
50e0: 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c 6f 63  fd = fd;.  d.loc
50f0: 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63 6b 2e  k = l;.  d.lock.
5100: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
5110: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
5120: 74 65 28 26 74 2c 20 30 2c 20 74 68 72 65 61 64  te(&t, 0, thread
5130: 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 29  LockingTest, &d)
5140: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
5150: 28 74 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28  (t, 0);.  close(
5160: 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65 73  fd);.  if( d.res
5170: 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  ult!=0 ) return;
5180: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
5190: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
51a0: 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74 79  s = (d.lock.l_ty
51b0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d 0a  pe==F_UNLCK);.}.
51c0: 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 4f 6e 20 61  #else./*.** On a
51d0: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
51e0: 61 6e 20 6c 69 6e 75 78 2c 20 61 73 73 75 6d 65  an linux, assume
51f0: 20 74 68 72 65 61 64 73 20 6f 76 65 72 72 69 64   threads overrid
5200: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
5210: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
5220: 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f  oid testThreadLo
5230: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e  ckingBehavior(in
5240: 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 74 68  t fd_orig){.  th
5250: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
5260: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 31  hOthersLocks = 1
5270: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
5280: 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 23 65 6e 64  linux__ */..#end
5290: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52  if /* SQLITE_THR
52a0: 45 41 44 53 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a  EADSAFE */../*.*
52b0: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
52c0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
52d0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
52e0: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
52f0: 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nfo()..*/.static
5300: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63   void releaseLoc
5310: 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63  kInfo(struct loc
5320: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20  kInfo *pLock){. 
5330: 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20   if( pLock ){.  
5340: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b    pLock->nRef--;
5350: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
5360: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
5370: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65   if( pLock->pPre
5380: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
5390: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65  ert( pLock->pPre
53a0: 76 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20  v->pNext==pLock 
53b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  );.        pLock
53c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
53d0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
53e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
53f0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
5400: 4c 69 73 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  List==pLock );. 
5410: 20 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20         lockList 
5420: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5440: 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29  ( pLock->pNext )
5450: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5460: 28 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e  ( pLock->pNext->
5470: 70 50 72 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pPrev==pLock );.
5480: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
5490: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Next->pPrev = pL
54a0: 6f 63 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ock->pPrev;.    
54b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
54c0: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
54d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
54e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e  * Release a open
54f0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72  Cnt structure pr
5500: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
5510: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
5520: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
5530: 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e  void releaseOpen
5540: 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43  Cnt(struct openC
5550: 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66  nt *pOpen){.  if
5560: 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  ( pOpen ){.    p
5570: 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Open->nRef--;.  
5580: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65    if( pOpen->nRe
5590: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
55a0: 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 29  ( pOpen->pPrev )
55b0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
55c0: 28 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e  ( pOpen->pPrev->
55d0: 70 4e 65 78 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a  pNext==pOpen );.
55e0: 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70          pOpen->p
55f0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  Prev->pNext = pO
5600: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
5610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5620: 20 61 73 73 65 72 74 28 20 6f 70 65 6e 4c 69 73   assert( openLis
5630: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
5640: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
5650: 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Open->pNext;.   
5660: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5670: 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Open->pNext ){. 
5680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5690: 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Open->pNext->pPr
56a0: 65 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  ev==pOpen );.   
56b0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78       pOpen->pNex
56c0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e  t->pPrev = pOpen
56d0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
56e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
56f0: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
5700: 69 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ing);.      sqli
5710: 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b  te3_free(pOpen);
5720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
5730: 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a  f IS_VXWORKS./*.
5740: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5750: 6e 20 6f 66 20 61 20 72 65 61 6c 70 61 74 68 28  n of a realpath(
5760: 29 20 6c 69 6b 65 20 66 75 6e 63 74 69 6f 6e 20  ) like function 
5770: 66 6f 72 20 76 78 57 6f 72 6b 73 0a 2a 2a 20 74  for vxWorks.** t
5780: 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61 6e 6f  o determine cano
5790: 6e 69 63 61 6c 20 70 61 74 68 20 6e 61 6d 65 20  nical path name 
57a0: 66 72 6f 6d 20 67 69 76 65 6e 20 6e 61 6d 65 2e  from given name.
57b0: 20 49 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20   It does.** not 
57c0: 73 75 70 70 6f 72 74 20 73 79 6d 6c 69 6e 6b 73  support symlinks
57d0: 2e 20 4e 65 69 74 68 65 72 20 64 6f 65 73 20 69  . Neither does i
57e0: 74 20 68 61 6e 64 6c 65 20 76 6f 6c 75 6d 65 20  t handle volume 
57f0: 70 72 65 66 69 78 65 73 2e 0a 2a 2f 0a 63 68 61  prefixes..*/.cha
5800: 72 20 2a 0a 76 78 72 65 61 6c 70 61 74 68 28 63  r *.vxrealpath(c
5810: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 6e  onst char *pathn
5820: 61 6d 65 2c 20 69 6e 74 20 64 6f 73 74 61 74 29  ame, int dostat)
5830: 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
5840: 20 73 62 75 66 3b 0a 20 20 69 6e 74 20 6c 65 6e   sbuf;.  int len
5850: 3b 0a 20 20 63 68 61 72 20 2a 77 68 65 72 65 2c  ;.  char *where,
5860: 20 2a 70 74 72 2c 20 2a 6c 61 73 74 3b 0a 20 20   *ptr, *last;.  
5870: 63 68 61 72 20 2a 72 65 73 75 6c 74 2c 20 2a 63  char *result, *c
5880: 75 72 70 61 74 68 2c 20 2a 77 6f 72 6b 70 61 74  urpath, *workpat
5890: 68 2c 20 2a 6e 61 6d 65 62 75 66 3b 0a 0a 20 20  h, *namebuf;..  
58a0: 6c 65 6e 20 3d 20 70 61 74 68 63 6f 6e 66 28 70  len = pathconf(p
58b0: 61 74 68 6e 61 6d 65 2c 20 5f 50 43 5f 50 41 54  athname, _PC_PAT
58c0: 48 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20 6c 65  H_MAX);.  if( le
58d0: 6e 3c 30 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  n<0 ){.    len =
58e0: 20 50 41 54 48 5f 4d 41 58 3b 0a 20 20 7d 0a 20   PATH_MAX;.  }. 
58f0: 20 72 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65   result = sqlite
5900: 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2a 20 34  3_malloc(len * 4
5910: 29 3b 0a 20 20 69 66 28 20 21 72 65 73 75 6c 74  );.  if( !result
5920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5930: 3b 0a 20 20 7d 0a 20 20 63 75 72 70 61 74 68 20  ;.  }.  curpath 
5940: 3d 20 72 65 73 75 6c 74 20 2b 20 6c 65 6e 3b 0a  = result + len;.
5950: 20 20 77 6f 72 6b 70 61 74 68 20 3d 20 63 75 72    workpath = cur
5960: 70 61 74 68 20 2b 20 6c 65 6e 3b 0a 20 20 6e 61  path + len;.  na
5970: 6d 65 62 75 66 20 3d 20 77 6f 72 6b 70 61 74 68  mebuf = workpath
5980: 20 2b 20 6c 65 6e 3b 0a 20 20 73 74 72 63 70 79   + len;.  strcpy
5990: 28 63 75 72 70 61 74 68 2c 20 70 61 74 68 6e 61  (curpath, pathna
59a0: 6d 65 29 3b 0a 20 20 69 66 28 20 2a 70 61 74 68  me);.  if( *path
59b0: 6e 61 6d 65 21 3d 27 2f 27 20 29 7b 0a 20 20 20  name!='/' ){.   
59c0: 20 69 66 28 20 21 67 65 74 63 77 64 28 77 6f 72   if( !getcwd(wor
59d0: 6b 70 61 74 68 2c 20 6c 65 6e 29 20 29 7b 0a 20  kpath, len) ){. 
59e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
59f0: 65 28 72 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  e(result);.     
5a00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
5a10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 77  .  }else{.    *w
5a20: 6f 72 6b 70 61 74 68 20 3d 20 27 5c 30 27 3b 0a  orkpath = '\0';.
5a30: 20 20 7d 0a 20 20 77 68 65 72 65 20 3d 20 63 75    }.  where = cu
5a40: 72 70 61 74 68 3b 0a 20 20 77 68 69 6c 65 28 20  rpath;.  while( 
5a50: 2a 77 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66  *where ){.    if
5a60: 28 20 21 73 74 72 63 6d 70 28 77 68 65 72 65 2c  ( !strcmp(where,
5a70: 20 22 2e 22 29 20 29 7b 0a 20 20 20 20 20 20 77   ".") ){.      w
5a80: 68 65 72 65 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  here++;.      co
5a90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5aa0: 20 20 69 66 28 20 21 73 74 72 6e 63 6d 70 28 77    if( !strncmp(w
5ab0: 68 65 72 65 2c 20 22 2e 2f 22 2c 20 32 29 20 29  here, "./", 2) )
5ac0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 2b 3d  {.      where +=
5ad0: 20 32 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   2;.      contin
5ae0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
5af0: 28 20 21 73 74 72 6e 63 6d 70 28 77 68 65 72 65  ( !strncmp(where
5b00: 2c 20 22 2e 2e 2f 22 2c 20 33 29 20 29 7b 0a 20  , "../", 3) ){. 
5b10: 20 20 20 20 20 77 68 65 72 65 20 2b 3d 20 33 3b       where += 3;
5b20: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 6c 61 73  .      ptr = las
5b30: 74 20 3d 20 77 6f 72 6b 70 61 74 68 3b 0a 20 20  t = workpath;.  
5b40: 20 20 20 20 77 68 69 6c 65 28 20 2a 70 74 72 20      while( *ptr 
5b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
5b60: 70 74 72 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  ptr=='/' ){.    
5b70: 20 20 20 20 20 20 6c 61 73 74 20 3d 20 70 74 72        last = ptr
5b80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5b90: 20 20 20 20 70 74 72 2b 2b 3b 0a 20 20 20 20 20      ptr++;.     
5ba0: 20 7d 0a 20 20 20 20 20 20 2a 6c 61 73 74 20 3d   }.      *last =
5bb0: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 63 6f 6e   '\0';.      con
5bc0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5bd0: 20 70 74 72 20 3d 20 73 74 72 63 68 72 28 77 68   ptr = strchr(wh
5be0: 65 72 65 2c 20 27 2f 27 29 3b 0a 20 20 20 20 69  ere, '/');.    i
5bf0: 66 28 20 21 70 74 72 20 29 7b 0a 20 20 20 20 20  f( !ptr ){.     
5c00: 20 70 74 72 20 3d 20 77 68 65 72 65 20 2b 20 73   ptr = where + s
5c10: 74 72 6c 65 6e 28 77 68 65 72 65 29 20 2d 20 31  trlen(where) - 1
5c20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c30: 20 20 20 2a 70 74 72 20 3d 20 27 5c 30 27 3b 0a     *ptr = '\0';.
5c40: 20 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79      }.    strcpy
5c50: 28 6e 61 6d 65 62 75 66 2c 20 77 6f 72 6b 70 61  (namebuf, workpa
5c60: 74 68 29 3b 0a 20 20 20 20 66 6f 72 28 20 6c 61  th);.    for( la
5c70: 73 74 20 3d 20 6e 61 6d 65 62 75 66 3b 20 2a 6c  st = namebuf; *l
5c80: 61 73 74 3b 20 6c 61 73 74 2b 2b 20 29 7b 0a 20  ast; last++ ){. 
5c90: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5ca0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 2d 2d     }.    if( *--
5cb0: 6c 61 73 74 21 3d 27 2f 27 20 29 7b 0a 20 20 20  last!='/' ){.   
5cc0: 20 20 20 73 74 72 63 61 74 28 6e 61 6d 65 62 75     strcat(namebu
5cd0: 66 2c 20 22 2f 22 29 3b 0a 20 20 20 20 7d 0a 20  f, "/");.    }. 
5ce0: 20 20 20 73 74 72 63 61 74 28 6e 61 6d 65 62 75     strcat(namebu
5cf0: 66 2c 20 77 68 65 72 65 29 3b 0a 20 20 20 20 77  f, where);.    w
5d00: 68 65 72 65 20 3d 20 2b 2b 70 74 72 3b 0a 20 20  here = ++ptr;.  
5d10: 20 20 69 66 28 20 64 6f 73 74 61 74 20 29 7b 0a    if( dostat ){.
5d20: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 6e        if( stat(n
5d30: 61 6d 65 62 75 66 2c 20 26 73 62 75 66 29 3d 3d  amebuf, &sbuf)==
5d40: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
5d50: 6c 69 74 65 33 5f 66 72 65 65 28 72 65 73 75 6c  lite3_free(resul
5d60: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
5d70: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
5d80: 20 20 20 20 69 66 28 20 28 73 62 75 66 2e 73 74      if( (sbuf.st
5d90: 5f 6d 6f 64 65 20 26 20 53 5f 49 46 44 49 52 29  _mode & S_IFDIR)
5da0: 3d 3d 53 5f 49 46 44 49 52 20 29 7b 0a 20 20 20  ==S_IFDIR ){.   
5db0: 20 20 20 20 20 73 74 72 63 70 79 28 77 6f 72 6b       strcpy(work
5dc0: 70 61 74 68 2c 20 6e 61 6d 65 62 75 66 29 3b 0a  path, namebuf);.
5dd0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5df0: 69 66 28 20 2a 77 68 65 72 65 20 29 7b 0a 20 20  if( *where ){.  
5e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
5e10: 65 65 28 72 65 73 75 6c 74 29 3b 0a 20 20 20 20  ee(result);.    
5e20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5e30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e40: 73 74 72 63 70 79 28 77 6f 72 6b 70 61 74 68 2c  strcpy(workpath,
5e50: 20 6e 61 6d 65 62 75 66 29 3b 0a 20 20 7d 0a 20   namebuf);.  }. 
5e60: 20 73 74 72 63 70 79 28 72 65 73 75 6c 74 2c 20   strcpy(result, 
5e70: 77 6f 72 6b 70 61 74 68 29 3b 0a 20 20 72 65 74  workpath);.  ret
5e80: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 23 65  urn result;.}.#e
5e90: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
5ea0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
5eb0: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74  STYLE./*.** Test
5ec0: 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  s a byte-range l
5ed0: 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20  ocking query to 
5ee0: 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67  see if byte rang
5ef0: 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20  e locks are .** 
5f00: 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f  supported, if no
5f10: 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  t we fall back t
5f20: 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  o dotlockLocking
5f30: 53 74 79 6c 65 2e 0a 2a 2a 20 4f 6e 20 76 78 57  Style..** On vxW
5f40: 6f 72 6b 73 20 77 65 20 66 61 6c 6c 20 62 61 63  orks we fall bac
5f50: 6b 20 74 6f 20 6e 61 6d 65 64 73 65 6d 4c 6f 63  k to namedsemLoc
5f60: 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74  kingStyle..*/.st
5f70: 61 74 69 63 20 69 6e 74 20 74 65 73 74 4c 6f 63  atic int testLoc
5f80: 6b 69 6e 67 53 74 79 6c 65 28 69 6e 74 20 66 64  kingStyle(int fd
5f90: 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
5fa0: 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 2f  k lockInfo;..  /
5fb0: 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
5fc0: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
5fd0: 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
5fe0: 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
5ff0: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
6000: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
6010: 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
6020: 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
6030: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
6040: 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
6050: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
6060: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
6070: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
6080: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
6090: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
60a0: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
60b0: 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
60c0: 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
60d0: 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  n LOCKING_STYLE_
60e0: 50 4f 53 49 58 3b 0a 20 20 7d 0a 20 20 0a 20 20  POSIX;.  }.  .  
60f0: 2f 2a 20 54 65 73 74 69 6e 67 20 66 6f 72 20 66  /* Testing for f
6100: 6c 6f 63 6b 28 29 20 63 61 6e 20 67 69 76 65 20  lock() can give 
6110: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 2e  false positives.
6120: 20 20 53 6f 20 69 66 20 69 66 20 74 68 65 20 61    So if if the a
6130: 62 6f 76 65 20 0a 20 20 2a 2a 20 74 65 73 74 20  bove .  ** test 
6140: 66 61 69 6c 73 2c 20 74 68 65 6e 20 77 65 20 66  fails, then we f
6150: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
6160: 67 20 64 6f 74 2d 66 69 6c 65 20 73 74 79 6c 65  g dot-file style
6170: 20 6c 6f 63 6b 69 6e 67 20 28 6f 72 0a 20 20 2a   locking (or.  *
6180: 2a 20 6e 61 6d 65 64 2d 73 65 6d 61 70 68 6f 72  * named-semaphor
6190: 65 20 6c 6f 63 6b 69 6e 67 20 6f 6e 20 76 78 77  e locking on vxw
61a0: 6f 72 6b 73 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  orks)..  */.  re
61b0: 74 75 72 6e 20 28 49 53 5f 56 58 57 4f 52 4b 53  turn (IS_VXWORKS
61c0: 20 3f 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45   ? LOCKING_STYLE
61d0: 5f 4e 41 4d 45 44 53 45 4d 20 3a 20 4c 4f 43 4b  _NAMEDSEM : LOCK
61e0: 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c  ING_STYLE_DOTFIL
61f0: 45 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E);.}.#endif../*
6200: 20 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45   .** If SQLITE_E
6210: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
6220: 59 4c 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  YLE is defined, 
6230: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 45 78  this function Ex
6240: 61 6d 69 6e 65 73 20 74 68 65 20 0a 2a 2a 20 66  amines the .** f
6250: 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e 74 72  _fstypename entr
6260: 79 20 69 6e 20 74 68 65 20 73 74 61 74 66 73 20  y in the statfs 
6270: 73 74 72 75 63 74 75 72 65 20 61 73 20 72 65 74  structure as ret
6280: 75 72 6e 65 64 20 62 79 20 73 74 61 74 28 29 20  urned by stat() 
6290: 66 6f 72 20 0a 2a 2a 20 74 68 65 20 66 69 6c 65  for .** the file
62a0: 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e 67 20   system hosting 
62b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
62c0: 65 20 61 6e 64 20 73 65 6c 65 63 74 73 20 20 74  e and selects  t
62d0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
62e0: 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  * locking style 
62f0: 62 61 73 65 64 20 6f 6e 20 69 74 73 20 76 61 6c  based on its val
6300: 75 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75 65  ue.  These value
6310: 73 20 61 6e 64 20 61 73 73 69 67 6e 6d 65 6e 74  s and assignment
6320: 73 20 61 72 65 20 0a 2a 2a 20 62 61 73 65 64 20  s are .** based 
6330: 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62 65  on Darwin/OSX be
6340: 68 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65 20  havior and have 
6350: 6e 6f 74 20 62 65 65 6e 20 74 68 6f 72 6f 75 67  not been thoroug
6360: 68 6c 79 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a  hly tested on .*
6370: 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
6380: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
6390: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
63a0: 53 54 59 4c 45 20 69 73 20 6e 6f 74 20 64 65 66  STYLE is not def
63b0: 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
63c0: 69 6f 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 72 65  ion always.** re
63d0: 74 75 72 6e 73 20 4c 4f 43 4b 49 4e 47 5f 53 54  turns LOCKING_ST
63e0: 59 4c 45 5f 50 4f 53 49 58 2e 0a 2a 2f 0a 23 69  YLE_POSIX..*/.#i
63f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6400: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
6410: 61 74 69 63 20 69 6e 74 20 64 65 74 65 63 74 4c  atic int detectL
6420: 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20 73  ockingStyle(.  s
6430: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
6440: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6450: 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74  filePath, .  int
6460: 20 66 64 0a 29 7b 0a 23 69 66 20 49 53 5f 56 58   fd.){.#if IS_VX
6470: 57 4f 52 4b 53 0a 20 20 69 66 28 20 21 66 69 6c  WORKS.  if( !fil
6480: 65 50 61 74 68 20 29 7b 0a 20 20 20 20 72 65 74  ePath ){.    ret
6490: 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  urn LOCKING_STYL
64a0: 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_NONE;.  }.  if
64b0: 28 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  ( pVfs->pAppData
64c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
64d0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
64e0: 28 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  (pVfs->pAppData)
64f0: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 61 63 63 65  ;.  }.  if (acce
6500: 73 73 28 66 69 6c 65 50 61 74 68 2c 20 30 29 20  ss(filePath, 0) 
6510: 21 3d 20 2d 31 29 7b 0a 20 20 20 20 72 65 74 75  != -1){.    retu
6520: 72 6e 20 74 65 73 74 4c 6f 63 6b 69 6e 67 53 74  rn testLockingSt
6530: 79 6c 65 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6c  yle(fd);.  }.#el
6540: 73 65 0a 20 20 73 74 72 75 63 74 20 4d 61 70 70  se.  struct Mapp
6550: 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
6560: 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
6570: 6d 3b 0a 20 20 20 20 69 6e 74 20 65 4c 6f 63 6b  m;.    int eLock
6580: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 20 61 4d  ingStyle;.  } aM
6590: 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
65a0: 68 66 73 22 2c 20 20 20 20 4c 4f 43 4b 49 4e 47  hfs",    LOCKING
65b0: 5f 53 54 59 4c 45 5f 50 4f 53 49 58 20 7d 2c 0a  _STYLE_POSIX },.
65c0: 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
65d0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f  LOCKING_STYLE_PO
65e0: 53 49 58 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  SIX },.    { "af
65f0: 70 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53  pfs",  LOCKING_S
6600: 54 59 4c 45 5f 41 46 50 20 7d 2c 0a 23 69 66 64  TYLE_AFP },.#ifd
6610: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6620: 5f 41 46 50 5f 4c 4f 43 4b 49 4e 47 5f 53 4d 42  _AFP_LOCKING_SMB
6630: 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
6640: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41   LOCKING_STYLE_A
6650: 46 50 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 20 20  FP },.#else.    
6660: 7b 20 22 73 6d 62 66 73 22 2c 20 20 4c 4f 43 4b  { "smbfs",  LOCK
6670: 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 20  ING_STYLE_FLOCK 
6680: 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20  },.#endif.    { 
6690: 22 6d 73 64 6f 73 22 2c 20 20 4c 4f 43 4b 49 4e  "msdos",  LOCKIN
66a0: 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 20  G_STYLE_DOTFILE 
66b0: 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
66c0: 22 2c 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ", LOCKING_STYLE
66d0: 5f 4e 4f 4e 45 20 7d 2c 0a 20 20 20 20 7b 20 30  _NONE },.    { 0
66e0: 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
66f0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
6700: 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 69  tfs fsInfo;..  i
6710: 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
6720: 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49      return LOCKI
6730: 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20  NG_STYLE_NONE;. 
6740: 20 7d 0a 20 20 69 66 28 20 70 56 66 73 2d 3e 70   }.  if( pVfs->p
6750: 41 70 70 44 61 74 61 20 29 7b 0a 20 20 20 20 72  AppData ){.    r
6760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 54 52  eturn SQLITE_PTR
6770: 5f 54 4f 5f 49 4e 54 28 70 56 66 73 2d 3e 70 41  _TO_INT(pVfs->pA
6780: 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ppData);.  }..  
6790: 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
67a0: 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
67b0: 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
67c0: 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
67d0: 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
67e0: 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49      return LOCKI
67f0: 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20  NG_STYLE_NONE;. 
6800: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
6810: 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
6820: 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
6830: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
6840: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
6850: 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
6860: 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
6870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
6880: 70 5b 69 5d 2e 65 4c 6f 63 6b 69 6e 67 53 74 79  p[i].eLockingSty
6890: 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
68a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
68b0: 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
68c0: 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
68d0: 73 2c 20 22 6e 66 73 22 2e 20 2a 2f 0a 20 20 72  s, "nfs". */.  r
68e0: 65 74 75 72 6e 20 74 65 73 74 4c 6f 63 6b 69 6e  eturn testLockin
68f0: 67 53 74 79 6c 65 28 66 64 29 3b 20 20 0a 23 65  gStyle(fd);  .#e
6900: 6e 64 69 66 20 2f 2a 20 69 66 20 49 53 5f 56 58  ndif /* if IS_VX
6910: 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
6920: 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  n LOCKING_STYLE_
6930: 50 4f 53 49 58 3b 0a 7d 0a 23 65 6c 73 65 0a 20  POSIX;.}.#else. 
6940: 20 23 64 65 66 69 6e 65 20 64 65 74 65 63 74 4c   #define detectL
6950: 6f 63 6b 69 6e 67 53 74 79 6c 65 28 78 2c 79 2c  ockingStyle(x,y,
6960: 7a 29 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  z) LOCKING_STYLE
6970: 5f 50 4f 53 49 58 0a 23 65 6e 64 69 66 20 2f 2a  _POSIX.#endif /*
6980: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e   ifdef SQLITE_EN
6990: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
69a0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  LE */../*.** Giv
69b0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
69c0: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63  ptor, locate loc
69d0: 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e  kInfo and openCn
69e0: 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  t structures tha
69f0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
6a00: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
6a10: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77  tor.  Create new
6a20: 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61   ones if necessa
6a30: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
6a40: 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20  rn values might 
6a50: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
6a60: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6a70: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  urs..**.** Retur
6a80: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
6a90: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
6aa0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c  static int findL
6ab0: 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66  ockInfo(.  int f
6ac0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
6ad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
6af0: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
6b00: 2f 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53  /.#if IS_VXWORKS
6b10: 0a 20 20 76 6f 69 64 20 2a 72 6e 61 6d 2c 20 20  .  void *rnam,  
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 2f 2a 20 76 78 57 6f 72 6b 73 20 72 65 61 6c 6e  /* vxWorks realn
6b40: 61 6d 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ame */.#endif.  
6b50: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
6b60: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
6b70: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
6b80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
6b90: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
6ba0: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
6bb0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
6bc0: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
6bd0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ture here */.){.
6be0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
6bf0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
6c00: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
6c10: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
6c20: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
6c30: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
6c40: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
6c50: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
6c60: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66  ;.  rc = fstat(f
6c70: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
6c80: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 23 69 66  if( rc!=0 ){.#if
6c90: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
6ca0: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4f 56    if( errno==EOV
6cb0: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
6cc0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
6cd0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
6ce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
6cf0: 7d 0a 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  }..  /* On OS X 
6d00: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
6d10: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
6d20: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
6d30: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
6d40: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
6d50: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
6d60: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
6d70: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
6d80: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
6d90: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
6da0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
6db0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
6dc0: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
6dd0: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
6de0: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
6df0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
6e00: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
6e10: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
6e20: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
6e30: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
6e40: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
6e50: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
6e60: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
6e70: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
6e80: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
6e90: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
6ea0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
6eb0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
6ec0: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
6ed0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
6ee0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
6ef0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
6f00: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
6f10: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
6f20: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
6f30: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
6f40: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
6f50: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
6f60: 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77  size==0 ){.    w
6f70: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
6f80: 3b 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  ;.    rc = fstat
6f90: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
6fa0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
6fb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6fc0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
6fd0: 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28  }.  }..  memset(
6fe0: 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66  &key1, 0, sizeof
6ff0: 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e  (key1));.  key1.
7000: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
7010: 5f 64 65 76 3b 0a 23 69 66 20 49 53 5f 56 58 57  _dev;.#if IS_VXW
7020: 4f 52 4b 53 0a 20 20 6b 65 79 31 2e 72 6e 61 6d  ORKS.  key1.rnam
7030: 20 3d 20 72 6e 61 6d 3b 0a 23 65 6c 73 65 0a 20   = rnam;.#else. 
7040: 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74   key1.ino = stat
7050: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
7060: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  if.#if SQLITE_TH
7070: 52 45 41 44 53 41 46 45 0a 20 20 69 66 28 20 74  READSAFE.  if( t
7080: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
7090: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20  chOthersLocks<0 
70a0: 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61  ){.    testThrea
70b0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
70c0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31  (fd);.  }.  key1
70d0: 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76  .tid = threadsOv
70e0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
70f0: 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72  Locks ? 0 : pthr
7100: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64  ead_self();.#end
7110: 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79  if.  memset(&key
7120: 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  2, 0, sizeof(key
7130: 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20  2));.  key2.dev 
7140: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
7150: 3b 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53  ;.#if IS_VXWORKS
7160: 0a 20 20 6b 65 79 32 2e 72 6e 61 6d 20 3d 20 72  .  key2.rnam = r
7170: 6e 61 6d 3b 0a 23 65 6c 73 65 0a 20 20 6b 65 79  nam;.#else.  key
7180: 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  2.ino = statbuf.
7190: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
71a0: 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73   pLock = lockLis
71b0: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 6f 63  t;.  while( pLoc
71c0: 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6b 65 79  k && memcmp(&key
71d0: 31 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  1, &pLock->key, 
71e0: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 20 29 7b  sizeof(key1)) ){
71f0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f  .    pLock = pLo
7200: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  ck->pNext;.  }. 
7210: 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b   if( pLock==0 ){
7220: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c  .    pLock = sql
7230: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
7240: 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20  eof(*pLock) );. 
7250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
7260: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7270: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7280: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
7290: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a  lockinfo;.    }.
72a0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d      pLock->key =
72b0: 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b   key1;.    pLock
72c0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
72d0: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a  pLock->cnt = 0;.
72e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
72f0: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f  ype = 0;.    pLo
7300: 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b  ck->pNext = lock
7310: 4c 69 73 74 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  List;.    pLock-
7320: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
7330: 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c  if( lockList ) l
7340: 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  ockList->pPrev =
7350: 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b   pLock;.    lock
7360: 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  List = pLock;.  
7370: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
7380: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
7390: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
73a0: 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30  .  if( ppOpen!=0
73b0: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   ){.    pOpen = 
73c0: 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68  openList;.    wh
73d0: 69 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 6d 65  ile( pOpen && me
73e0: 6d 63 6d 70 28 26 6b 65 79 32 2c 20 26 70 4f 70  mcmp(&key2, &pOp
73f0: 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  en->key, sizeof(
7400: 6b 65 79 32 29 29 20 29 7b 0a 20 20 20 20 20 20  key2)) ){.      
7410: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70  pOpen = pOpen->p
7420: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
7430: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
7440: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
7450: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
7460: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
7470: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d        if( pOpen=
7480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
7490: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
74a0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
74b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
74c0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
74d0: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
74e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
74f0: 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32  Open->key = key2
7500: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
7510: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
7520: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b  Open->nLock = 0;
7530: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
7540: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
7550: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
7560: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
7570: 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e  en->pNext = open
7580: 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4f 70 65  List;.      pOpe
7590: 6e 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  n->pPrev = 0;.  
75a0: 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69 73 74      if( openList
75b0: 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72   ) openList->pPr
75c0: 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20  ev = pOpen;.    
75d0: 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70    openList = pOp
75e0: 65 6e 3b 0a 23 69 66 20 49 53 5f 56 58 57 4f 52  en;.#if IS_VXWOR
75f0: 4b 53 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  KS.      pOpen->
7600: 70 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pSem = NULL;.   
7610: 20 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61     pOpen->aSemNa
7620: 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 23 65  me[0] = '\0';.#e
7630: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
7640: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
7650: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
7660: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
7670: 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f    }..exit_findlo
7680: 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e  ckinfo:.  return
7690: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
76a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
76b0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
76c0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
76d0: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
76e0: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
76f0: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
7700: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
7710: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
7720: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
7730: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
7740: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
7750: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7760: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
7770: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
7780: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
7790: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
77a0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
77b0: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
77c0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
77d0: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
77e0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
77f0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
7800: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
7810: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
7820: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
7830: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
7840: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
7850: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
7860: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
7870: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  if../*.** If we 
7880: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7890: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
78a0: 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72  ead than the thr
78b0: 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ead that the.** 
78c0: 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e  unixFile argumen
78d0: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68  t belongs to, th
78e0: 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65  en transfer owne
78f0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69  rship of the uni
7900: 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f  xFile.** over to
7910: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
7920: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69  ead..**.** A uni
7930: 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77  xFile is only ow
7940: 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  ned by a thread 
7950: 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  on systems where
7960: 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a   one thread is.*
7970: 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72  * unable to over
7980: 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74  ride locks creat
7990: 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  ed by a differen
79a0: 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61  t thread.  RedHa
79b0: 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d  t9 is.** an exam
79c0: 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79  ple of such a sy
79d0: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65  stem..**.** Owne
79e0: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
79f0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69  s only allowed i
7a00: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69  f the unixFile i
7a10: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
7a20: 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  cked..** If the 
7a30: 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b  unixFile is lock
7a40: 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73  ed and an owners
7a50: 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68  hip is wrong, th
7a60: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  en return.** SQL
7a70: 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c  ITE_MISUSE.  SQL
7a80: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
7a90: 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
7aa0: 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53   works..*/.#if S
7ab0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
7ad0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e  sferOwnership(un
7ae0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
7af0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
7b00: 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69  ead_t hSelf;.  i
7b10: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
7b20: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7b30: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65  s ){.    /* Owne
7b40: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73 20  rship transfers 
7b50: 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68  not needed on th
7b60: 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  is system */.   
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d  K;.  }.  hSelf =
7b90: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
7ba0: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 65  .  if( pthread_e
7bb0: 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c  qual(pFile->tid,
7bc0: 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f   hSelf) ){.    /
7bd0: 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69  * We are still i
7be0: 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  n the same threa
7bf0: 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  d */.    OSTRACE
7c00: 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20  1("No-transfer, 
7c10: 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b  same thread\n");
7c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7c30: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
7c40: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7c50: 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
7c60: 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68   /* We cannot ch
7c70: 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77  ange ownership w
7c80: 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64  hile we are hold
7c90: 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20  ing a lock! */. 
7ca0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7cb0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f  _MISUSE;.  }.  O
7cc0: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
7cd0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
7ce0: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
7cf0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
7d00: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
7d10: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
7d20: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
7d30: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
7d40: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
7d50: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
7d60: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
7d70: 63 6b 29 3b 0a 23 69 66 20 49 53 5f 56 58 57 4f  ck);.#if IS_VXWO
7d80: 52 4b 53 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  RKS.    rc = fin
7d90: 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  dLockInfo(pFile-
7da0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 7a 52 65 61 6c  >h, pFile->zReal
7db0: 70 61 74 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c  path, &pFile->pL
7dc0: 6f 63 6b 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ock, 0);.#else. 
7dd0: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
7de0: 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Info(pFile->h, &
7df0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29  pFile->pLock, 0)
7e00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  ;.#endif.    OST
7e10: 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25  RACE5("LOCK    %
7e20: 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25  d is now %s(%s,%
7e30: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
7e40: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
7e50: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
7e60: 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20  locktype),.     
7e70: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
7e80: 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  me(pFile->pLock-
7e90: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c  >locktype), pFil
7ea0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a  e->pLock->cnt);.
7eb0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7ec0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
7ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7ee0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a    }.}.#else.  /*
7ef0: 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   On single-threa
7f00: 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65  ded builds, owne
7f10: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
7f20: 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64  s a no-op */.# d
7f30: 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77  efine transferOw
7f40: 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c 49 54  nership(X) SQLIT
7f50: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
7f60: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
7f70: 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
7f80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7f90: 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
7fa0: 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
7fb0: 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
7fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
7fd0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
7fe0: 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
7ff0: 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
8000: 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
8010: 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
8020: 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
8030: 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
8040: 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
8050: 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
8060: 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
8070: 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
8080: 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
8090: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
80a0: 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
80b0: 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62  * any any form b
80c0: 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
80d0: 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
80e0: 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
80f0: 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
8100: 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
8110: 20 23 32 36 38 31 2e 0a 2a 2f 0a 73 74 61 74 69   #2681..*/.stati
8120: 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
8130: 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
8140: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
8150: 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
8160: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
8170: 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
8180: 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
8190: 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
81a0: 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
81b0: 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e  got = pread(id->
81c0: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
81d0: 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
81e0: 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
81f0: 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
8200: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
8210: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34  .  got = pread64
8220: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
8230: 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69  t, offset);.  Si
8240: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
8250: 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
8260: 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
8270: 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
8280: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
8290: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
82a0: 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
82b0: 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
82c0: 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
82d0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
82e0: 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e   got = read(id->
82f0: 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
8300: 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
8310: 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52  D;.  OSTRACE5("R
8320: 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
8330: 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
8340: 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
8350: 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
8360: 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
8370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
8380: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
8390: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
83a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
83b0: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
83c0: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
83d0: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
83e0: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
83f0: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
8400: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8410: 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
8420: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
8430: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
8440: 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
8450: 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
8460: 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  t.){.  int got;.
8470: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
8480: 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
8490: 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ead((unixFile*)i
84a0: 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  d, offset, pBuf,
84b0: 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74   amt);.  if( got
84c0: 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  ==amt ){.    ret
84d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84e0: 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30   }else if( got<0
84f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8500: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
8510: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8520: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
8530: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
8540: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
8550: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
8560: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
8570: 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
8580: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8590: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
85a0: 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
85b0: 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
85c0: 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
85d0: 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
85e0: 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
85f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
8600: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8610: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
8620: 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
8630: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
8640: 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
8650: 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
8660: 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
8670: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
8680: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
8690: 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
86a0: 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
86b0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
86c0: 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77  READ).  got = pw
86d0: 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
86e0: 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
86f0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
8700: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74  E_PREAD64).  got
8710: 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e   = pwrite64(id->
8720: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
8730: 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e  fset);.#else.  n
8740: 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
8750: 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
8760: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28  SEEK_SET);.  if(
8770: 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
8780: 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  et ){.    return
8790: 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d   -1;.  }.  got =
87a0: 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42   write(id->h, pB
87b0: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
87c0: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
87d0: 4f 53 54 52 41 43 45 35 28 22 57 52 49 54 45 20  OSTRACE5("WRITE 
87e0: 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
87f0: 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
8800: 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
8810: 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
8820: 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
8830: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
8840: 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
8850: 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
8860: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
8870: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
8880: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
8890: 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
88a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
88b0: 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
88c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
88d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
88e0: 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
88f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
8900: 66 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20  ffset .){.  int 
8910: 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
8920: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
8930: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
8940: 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
8950: 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
8960: 57 72 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a  Write((unixFile*
8970: 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  )id, offset, pBu
8980: 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
8990: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
89a0: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
89b0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
89c0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
89d0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
89e0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
89f0: 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
8a00: 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
8a10: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
8a20: 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
8a30: 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
8a40: 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
8a50: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8a60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
8a70: 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
8a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8a90: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
8aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8ab0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
8ac0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
8ad0: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
8ae0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
8af0: 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
8b00: 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
8b10: 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
8b20: 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
8b30: 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
8b40: 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
8b50: 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
8b60: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
8b70: 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
8b80: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
8b90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
8ba0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74  .** Use the fdat
8bb0: 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79  async() API only
8bc0: 20 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41   if the HAVE_FDA
8bd0: 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  TASYNC macro is 
8be0: 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  defined..** Othe
8bf0: 72 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28  rwise use fsync(
8c00: 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a  ) in its place..
8c10: 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f  */.#ifndef HAVE_
8c20: 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69  FDATASYNC.# defi
8c30: 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
8c40: 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
8c50: 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
8c60: 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
8c70: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
8c80: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
8c90: 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
8ca0: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
8cb0: 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
8cc0: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
8cd0: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
8ce0: 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
8cf0: 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
8d00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
8d10: 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
8d20: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
8d30: 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
8d40: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
8d50: 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
8d60: 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
8d70: 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
8d80: 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
8d90: 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
8da0: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
8db0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
8dc0: 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
8dd0: 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
8de0: 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
8df0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
8e00: 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
8e10: 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
8e20: 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
8e30: 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
8e40: 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
8e50: 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
8e60: 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
8e70: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
8e80: 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
8e90: 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
8ea0: 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
8eb0: 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
8ec0: 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
8ed0: 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
8ee0: 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
8ef0: 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
8f00: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
8f10: 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
8f20: 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
8f30: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
8f40: 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
8f50: 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
8f60: 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
8f70: 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
8f80: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
8f90: 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
8fa0: 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
8fb0: 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
8fc0: 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
8fd0: 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
8fe0: 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
8ff0: 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
9000: 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
9010: 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
9020: 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
9030: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
9040: 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
9050: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
9060: 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
9070: 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
9080: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
9090: 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
90a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
90b0: 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
90c0: 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
90d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
90e0: 75 6c 6c 53 79 6e 63 29 3b 0a 23 65 6c 73 65 0a  ullSync);.#else.
90f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9100: 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
9110: 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
9120: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
9130: 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
9140: 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
9150: 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
9160: 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
9170: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
9180: 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
9190: 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
91a0: 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
91b0: 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
91c0: 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
91d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
91e0: 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
91f0: 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
9200: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
9210: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
9220: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
9230: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
9240: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
9250: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
9260: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
9270: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
9280: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
9290: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
92a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
92b0: 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
92c0: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
92d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
92e0: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
92f0: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
9300: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
9310: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
9320: 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
9330: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
9340: 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
9350: 29 2e 0a 20 20 20 2a 20 49 74 20 73 68 6f 75 6c  )..   * It shoul
9360: 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
9370: 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
9380: 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
9390: 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c 65 20 73  cal .   * file s
93a0: 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
93b0: 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
93c0: 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
93d0: 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27 74 20 73  YNC.   * isn't s
93e0: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
93f0: 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
9400: 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
9410: 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64 20 28 66  ync .   * and (f
9420: 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
9430: 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
9440: 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
9450: 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20  tl call.  .   * 
9460: 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
9470: 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
9480: 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
9490: 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 20 2a 20  and avoid .   * 
94a0: 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
94b0: 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
94c0: 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a  s called..   */.
94d0: 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
94e0: 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
94f0: 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c  e .  if( dataOnl
9500: 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64  y ){.    rc = fd
9510: 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  atasync(fd);.   
9520: 20 69 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20   if( IS_VXWORKS 
9530: 26 26 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  && rc==-1 && err
9540: 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
9550: 20 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28       rc = fsync(
9560: 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  fd);.    }.  }el
9570: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79  se{.    rc = fsy
9580: 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
9590: 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
95a0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
95b0: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
95c0: 2f 0a 0a 20 20 69 66 28 20 49 53 5f 56 58 57 4f  /..  if( IS_VXWO
95d0: 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
95e0: 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
95f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9600: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
9610: 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
9620: 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
9630: 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
9640: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
9650: 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
9660: 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
9670: 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
9680: 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
9690: 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
96a0: 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
96b0: 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
96c0: 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
96d0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
96e0: 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
96f0: 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
9700: 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
9710: 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
9720: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
9730: 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
9740: 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
9750: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
9760: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
9770: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
9780: 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
9790: 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
97a0: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
97b0: 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
97c0: 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
97d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
97e0: 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
97f0: 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
9800: 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
9810: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
9820: 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
9830: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
9840: 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
9850: 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
9860: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
9870: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
9880: 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
9890: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
98a0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
98b0: 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
98c0: 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
98d0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
98e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
98f0: 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
9900: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
9910: 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
9920: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
9930: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
9940: 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
9950: 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
9960: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
9970: 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
9980: 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
9990: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
99a0: 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
99b0: 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
99c0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
99d0: 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
99e0: 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
99f0: 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
9a00: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
9a10: 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
9a20: 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
9a30: 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
9a40: 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
9a50: 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
9a60: 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
9a70: 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
9a80: 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
9a90: 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
9aa0: 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
9ab0: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
9ac0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
9ad0: 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
9ae0: 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
9af0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
9b00: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
9b10: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53  );.  OSTRACE2("S
9b20: 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
9b30: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20  pFile->h);.  rc 
9b40: 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
9b50: 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
9b60: 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
9b70: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9b80: 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
9b90: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
9ba0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
9bb0: 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SYNC;.  }.  if( 
9bc0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
9bd0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  ){.    OSTRACE4(
9be0: 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
9bf0: 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
9c00: 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
9c10: 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
9c30: 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
9c40: 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66  llsync);.#ifndef
9c50: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
9c60: 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
9c70: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
9c80: 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
9c90: 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
9ca0: 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
9cb0: 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
9cc0: 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
9cd0: 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
9ce0: 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
9cf0: 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
9d00: 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
9d10: 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
9d20: 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
9d30: 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c  LFSYNC || !isFul
9d40: 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lsync) && full_f
9d50: 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
9d60: 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
9d70: 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
9d80: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
9d90: 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
9da0: 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
9db0: 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
9dc0: 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
9dd0: 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
9de0: 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
9df0: 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
9e00: 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
9e10: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
9e20: 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
9e30: 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
9e40: 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
9e50: 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
9e60: 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
9e70: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
9e80: 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    /* return SQLI
9e90: 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20  TE_IOERR; */.   
9ea0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c   }.#endif.    cl
9eb0: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
9ec0: 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  );  /* Only need
9ed0: 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
9ee0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65  o close the dire
9ef0: 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69  ctory */.    pFi
9f00: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20  le->dirfd = -1; 
9f10: 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72     /* when we ar
9f20: 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20  e done. */.  }. 
9f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
9f50: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
9f60: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
9f70: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
9f80: 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
9f90: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9fa0: 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
9fb0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
9fc0: 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
9fd0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
9fe0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9ff0: 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
a000: 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
a010: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
a020: 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
a030: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
a040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a050: 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20  ERR_TRUNCATE;.  
a060: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
a070: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
a090: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
a0a0: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
a0b0: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
a0c0: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
a0d0: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
a0e0: 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
a0f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
a100: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
a110: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
a120: 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e   rc = fstat(((un
a130: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
a140: 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
a150: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
a160: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a170: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a180: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
a190: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
a1a0: 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
a1b0: 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
a1c0: 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
a1d0: 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63  ase, the findLoc
a1e0: 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  kInfo() procedur
a1f0: 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
a200: 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
a210: 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
a220: 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
a230: 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
a240: 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
a250: 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
a260: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
a270: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
a280: 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
a290: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
a2a0: 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
a2b0: 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
a2c0: 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
a2d0: 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
a2e0: 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
a2f0: 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
a300: 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
a310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a320: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
a330: 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61   routine transla
a340: 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50  tes a standard P
a350: 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20  OSIX errno code 
a360: 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  into something.*
a370: 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20  * useful to the 
a380: 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73  clients of the s
a390: 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73  qlite3 functions
a3a0: 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
a3b0: 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64   it is.** intend
a3c0: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
a3d0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72  a variety of "tr
a3e0: 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20  y again" errors 
a3f0: 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  into SQLITE_BUSY
a400: 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74  .** and a variet
a410: 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f  y of "please clo
a420: 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
a430: 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f  riptor NOW" erro
a440: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49  rs into .** SQLI
a450: 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20  TE_IOERR.** .** 
a460: 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e  Errors during in
a470: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
a480: 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73  locks, or file s
a490: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f  ystem support fo
a4a0: 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75  r locks,.** shou
a4b0: 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b  ld handle ENOLCK
a4c0: 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f  , ENOTSUP, EOPNO
a4d0: 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79  TSUPP separately
a4e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a4f0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
a500: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f  osixError(int po
a510: 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71  sixError, int sq
a520: 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73  liteIOErr) {.  s
a530: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
a540: 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a  r) {.  case 0: .
a550: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a560: 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73  E_OK;.    .  cas
a570: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
a580: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
a590: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
a5a0: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
a5b0: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
a5c0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
a5d0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
a5e0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
a5f0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
a600: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
a610: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
a620: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
a630: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
a640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
a650: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
a660: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
a670: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
a680: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
a690: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
a6a0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
a6b0: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
a6c0: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
a6d0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
a6e0: 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74  OCK) || ..(sqlit
a6f0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
a700: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
a710: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
a720: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
a730: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71  _RDLOCK) ||..(sq
a740: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
a750: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
a760: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
a770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a780: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
a790: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
a7a0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
a7b0: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
a7c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
a7d0: 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  M;.    .  case E
a7e0: 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75  DEADLK:.    retu
a7f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
a800: 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69  BLOCKED;.    .#i
a810: 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e  f EOPNOTSUPP!=EN
a820: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50  OTSUP.  case EOP
a830: 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a  NOTSUPP: .    /*
a840: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
a850: 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75  terribly awry, u
a860: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
a870: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
a880: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
a890: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
a8a0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
a8b0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
a8c0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
a8d0: 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20   ENOTSUP.  case 
a8e0: 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a  ENOTSUP: .    /*
a8f0: 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c   invalid fd, unl
a900: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
a910: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69  system support i
a920: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
a930: 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69   which .     * i
a940: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
a950: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
a960: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
a970: 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46  IO:.  case EBADF
a980: 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a  :.  case EINVAL:
a990: 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e  .  case ENOTCONN
a9a0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a  :.  case ENODEV:
a9b0: 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20  .  case ENXIO:. 
a9c0: 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20   case ENOENT:.  
a9d0: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63  case ESTALE:.  c
a9e0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
a9f0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
aa00: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
aa10: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
aa20: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
aa30: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
aa40: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
aa50: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
aa60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
aa70: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
aa80: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
aa90: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
aaa0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
aab0: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
aac0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
aad0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
aae0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
aaf0: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
ab00: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
ab10: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
ab20: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
ab30: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
ab40: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
ab50: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
ab60: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
ab70: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
ab80: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
ab90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
aba0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
abb0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
abc0: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
abd0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
abe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
abf0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
ac00: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ac10: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ac20: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
ac30: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
ac40: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
ac50: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
ac60: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ac70: 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28  );.  enterMutex(
ac80: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
ac90: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
aca0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
acb0: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
acc0: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
acd0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
ace0: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
acf0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
ad00: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
ad10: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ad20: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
ad30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
ad40: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
ad50: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
ad60: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20  holds it..  */. 
ad70: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
ad80: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
ad90: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
ada0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
adb0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
adc0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
add0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
ade0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
adf0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ae00: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28  _WRLCK;.    if (
ae10: 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c  -1 == fcntl(pFil
ae20: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
ae30: 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69  lock)) {.      i
ae40: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
ae50: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
ae60: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
ae70: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
ae80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
ae90: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
aea0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
aeb0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
aec0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
aed0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
aee0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
aef0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
af00: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61 76   }.  }.  .  leav
af10: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
af20: 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE4("TEST WR-LO
af30: 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  CK %d %d %d\n", 
af40: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
af50: 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65  served);..  *pRe
af60: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
af70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af80: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
af90: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
afa0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
afb0: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
afc0: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
afd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
afe0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
aff0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
b000: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
b010: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
b020: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
b030: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
b040: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
b050: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
b060: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
b070: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
b080: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
b090: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
b0a0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
b0b0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
b0c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
b0d0: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
b0e0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
b0f0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
b100: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
b110: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
b120: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
b130: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
b140: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
b150: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
b160: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
b170: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
b180: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
b190: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
b1a0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
b1b0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
b1c0: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
b1d0: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
b1e0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
b1f0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
b200: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
b210: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
b220: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
b230: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
b240: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
b250: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
b260: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
b270: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
b280: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
b290: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
b2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b2b0: 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
b2c0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
b2d0: 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68  cktype){.  /* Th
b2e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
b2f0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
b300: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b310: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
b320: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
b330: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
b340: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
b350: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
b360: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
b370: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
b380: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
b390: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
b3a0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
b3b0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
b3c0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
b3d0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
b3e0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
b3f0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
b400: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
b410: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
b420: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
b430: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
b440: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
b450: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
b460: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
b470: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
b480: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
b490: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
b4a0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
b4b0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
b4c0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
b4d0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
b4e0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
b4f0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
b500: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b510: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
b520: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b530: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
b540: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
b550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
b570: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
b580: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
b590: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
b5a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
b5b0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
b5c0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
b5d0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b5e0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
b5f0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b600: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
b610: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
b620: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
b630: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
b640: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b650: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b660: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b670: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
b680: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
b690: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
b6a0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b6b0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
b6c0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
b6d0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
b6e0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
b6f0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
b700: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
b710: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
b720: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
b730: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
b740: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
b750: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
b760: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
b770: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
b780: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
b790: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
b7a0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
b7b0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
b7c0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
b7d0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
b7e0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
b7f0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
b800: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
b810: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
b820: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
b830: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
b840: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
b850: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
b860: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
b870: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
b880: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
b890: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
b8a0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
b8b0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
b8c0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
b8d0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
b8e0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
b8f0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
b900: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
b910: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
b920: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b930: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
b940: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b950: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
b960: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
b970: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
b980: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
b990: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
b9a0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
b9b0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b9c0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
b9d0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
b9e0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
b9f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ba00: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ba10: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ba20: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ba30: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ba40: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
ba50: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
ba60: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
ba70: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
ba80: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
ba90: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
baa0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
bab0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
bac0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
bad0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
bae0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
baf0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
bb00: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
bb10: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
bb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
bb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
bb50: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
bb60: 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d   *pLock = pFile-
bb70: 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  >pLock;.  struct
bb80: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
bb90: 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt s;..  assert(
bba0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
bbb0: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
bbc0: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
bbd0: 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  ) pid=%d\n", pFi
bbe0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63  le->h,.      loc
bbf0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
bc00: 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
bc10: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
bc20: 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  e),.      lockty
bc30: 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f  peName(pLock->lo
bc40: 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e  cktype), pLock->
bc50: 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b  cnt , getpid());
bc60: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
bc70: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
bc80: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
bc90: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
bca0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
bcb0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
bcc0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
bcd0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
bce0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
bcf0: 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  enterMutex() has
bd00: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
bd10: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
bd20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
bd30: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
bd40: 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20   OSTRACE3("LOCK 
bd50: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
bd60: 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70  eady held)\n", p
bd70: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
bd80: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
bd90: 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
bda0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bdb0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
bdc0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
bdd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
bde0: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
bdf0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
be00: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
be10: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
be20: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
be30: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
be40: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
be50: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
be60: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
be70: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
be80: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
be90: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
bea0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
beb0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
bec0: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
bed0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
bee0: 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28  */.  enterMutex(
bef0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
bf00: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
bf10: 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70  hread owns the p
bf20: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  File..  */.  rc 
bf30: 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  = transferOwners
bf40: 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  hip(pFile);.  if
bf50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bf60: 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65  ){.    leaveMute
bf70: 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x();.    return 
bf80: 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20  rc;.  }.  pLock 
bf90: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
bfa0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
bfb0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
bfc0: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
bfd0: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
bfe0: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
bff0: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
c000: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
c010: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
c020: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
c030: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
c040: 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  !=pLock->locktyp
c050: 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  e && .          
c060: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
c070: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
c080: 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  | locktype>SHARE
c090: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
c0a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
c0b0: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
c0c0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
c0d0: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
c0e0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
c0f0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
c100: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
c110: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
c120: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
c130: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
c140: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
c150: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
c160: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
c170: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
c180: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
c190: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
c1a0: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
c1b0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  e==SHARED_LOCK |
c1c0: 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  | pLock->locktyp
c1d0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
c1e0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c1f0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
c200: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
c210: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
c220: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
c230: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
c240: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  nt>0 );.    pFil
c250: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
c260: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
c270: 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20  Lock->cnt++;.   
c280: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
c290: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
c2a0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
c2b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
c2c0: 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  L;..  lock.l_whe
c2d0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c2e0: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
c2f0: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
c300: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
c310: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
c320: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
c330: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
c340: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
c350: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
c360: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
c370: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
c380: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ed..  */.  if( l
c390: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
c3a0: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
c3b0: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
c3c0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
c3d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44  e->locktype<PEND
c3e0: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
c3f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c400: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
c410: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
c420: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
c430: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
c440: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73  DING_BYTE;.    s
c450: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
c460: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
c470: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28  k);.    if( s==(
c480: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  -1) ){.      int
c490: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c4b0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
c4c0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
c4d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
c4e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
c4f0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
c500: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c510: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c520: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c530: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
c550: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
c560: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
c570: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
c580: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
c590: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
c5a0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
c5b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
c5c0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
c5d0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
c5e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
c5f0: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20   tErrno = 0;.   
c600: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
c610: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
c620: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
c630: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
c640: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
c650: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
c660: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c670: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c680: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c690: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c6a0: 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70  if( (s = fcntl(p
c6b0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c6c0: 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20  , &lock))==(-1) 
c6d0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
c6e0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  = errno;.    }. 
c6f0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
c700: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
c710: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
c720: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c730: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
c740: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c750: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c760: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
c770: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
c780: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
c790: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
c7a0: 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  ( s != -1 ){.   
c7b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
c7c0: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
c7d0: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
c7e0: 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  /.        tErrno
c7f0: 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20   = errno; .     
c800: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c810: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c820: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c830: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
c840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
c850: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
c860: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
c870: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c880: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
c890: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
c8a0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  d_lock;.      }.
c8b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d      }.    if( s=
c8c0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
c8d0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
c8e0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
c8f0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
c900: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
c910: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
c920: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
c930: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c940: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
c950: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
c960: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
c970: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
c980: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
c990: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
c9a0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
c9b0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
c9c0: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
c9d0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
c9e0: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
c9f0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
ca00: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
ca10: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
ca20: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
ca30: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
ca40: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
ca50: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
ca60: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
ca70: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ca80: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ca90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
caa0: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
cab0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
cac0: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
cad0: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
cae0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
caf0: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
cb00: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
cb10: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
cb20: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
cb30: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
cb40: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
cb50: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
cb60: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
cb70: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
cb80: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
cb90: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
cba0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
cbb0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
cbc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cbd0: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
cbe0: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
cbf0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
cc00: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
cc10: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
cc20: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
cc30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cc40: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
cc50: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
cc60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66  .    }.    s = f
cc70: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
cc80: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
cc90: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
cca0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
ccb0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ccc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
ccd0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
cce0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
ccf0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
cd00: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
cd10: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
cd20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cd30: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cd40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cd50: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
cd60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd70: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
cd80: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
cd90: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
cda0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
cdb0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
cdc0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
cdd0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
cde0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
cdf0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
ce00: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
ce10: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
ce20: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61  .end_lock:.  lea
ce30: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
ce40: 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
ce50: 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
ce60: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
ce70: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
ce80: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
ce90: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
cea0: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
ceb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
cec0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
ced0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
cee0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
cef0: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
cf00: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
cf10: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
cf20: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
cf30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
cf40: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
cf50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cf60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
cf70: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
cf80: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
cf90: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
cfa0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
cfb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
cfc0: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
cfd0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
cfe0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
cff0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
d000: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
d010: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
d020: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d030: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
d040: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
d050: 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  d;.  int h;..  a
d060: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
d070: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
d080: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
d090: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
d0a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
d0b0: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
d0c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
d0d0: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
d0e0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
d0f0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
d100: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
d110: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
d120: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d130: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
d140: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
d150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d160: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
d170: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d190: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
d1a0: 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  }.  enterMutex()
d1b0: 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  ;.  h = pFile->h
d1c0: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  ;.  pLock = pFil
d1d0: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65  e->pLock;.  asse
d1e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d  rt( pLock->cnt!=
d1f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
d200: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
d210: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
d220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
d230: 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f  ktype==pFile->lo
d240: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69  cktype );.    Si
d250: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
d260: 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
d270: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
d280: 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
d290: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
d2a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
d2b0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
d2c0: 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  K ){.      lock.
d2d0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
d2e0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
d2f0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
d300: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
d310: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d320: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
d330: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d340: 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66  IZE;.      if( f
d350: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d360: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
d370: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
d380: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d390: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d3a0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d3b0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d3c0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
d3d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
d3e0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
d400: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d410: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
d420: 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75  }.....goto end_u
d430: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  nlock;.      }. 
d440: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
d450: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
d460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d470: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d480: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d490: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
d4a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d4b0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
d4c0: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
d4d0: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
d4e0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
d4f0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
d500: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c  (-1) ){.      pL
d510: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
d520: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
d530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
d540: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
d550: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d560: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d570: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d580: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d590: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
d5a0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d5c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d5d0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 09  Errno;.      }..
d5e0: 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63  ..goto end_unloc
d5f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
d600: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
d610: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75  LOCK ){.    stru
d620: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
d630: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  n;..    /* Decre
d640: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
d650: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
d660: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
d670: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
d680: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
d690: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
d6a0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
d6b0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
d6c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
d6d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f  ..    */.    pLo
d6e0: 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69  ck->cnt--;.    i
d6f0: 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  f( pLock->cnt==0
d700: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
d710: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
d720: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
d730: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d740: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
d750: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
d760: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d   = 0L;.      Sim
d770: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
d780: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
d790: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
d7a0: 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
d7b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
d7c0: 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
d7d0: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
d7e0: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20  K, &lock)!=(-1) 
d7f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b  ){.        pLock
d800: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
d810: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
d820: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  e{.        int t
d830: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d840: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d850: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d860: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d870: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
d880: 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
d890: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d8a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
d8b0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d8c0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d8d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 63    }.        pLoc
d8e0: 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09 09  k->cnt = 1;.....
d8f0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d910: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
d920: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
d930: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
d940: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
d950: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
d960: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
d970: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
d980: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d990: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
d9a0: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
d9b0: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
d9c0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
d9d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
d9e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d9f0: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46        pOpen = pF
da00: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20  ile->pOpen;.    
da10: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
da20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
da30: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  pOpen->nLock>=0 
da40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
da50: 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20  en->nLock==0 && 
da60: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e  pOpen->nPending>
da70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
da80: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
da90: 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50  i=0; i<pOpen->nP
daa0: 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  ending; i++){.  
dab0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
dac0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
dad0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
daf0: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
db00: 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65  g);.        pOpe
db10: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
db20: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
db30: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
db40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
db50: 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
db60: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
db70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
db80: 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  K ) pFile->lockt
db90: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
dba0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dbb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
dbc0: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
dbd0: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
dbe0: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
dbf0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
dc00: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
dc10: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
dc20: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
dc30: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
dc40: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
dc50: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
dc60: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
dc70: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
dc80: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
dc90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f  /.static int clo
dca0: 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  seUnixFile(sqlit
dcb0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
dcc0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
dcd0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
dce0: 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a  .  if( pFile ){.
dcf0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64      if( pFile->d
dd00: 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
dd10: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
dd20: 72 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rfd);.    }.    
dd30: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
dd40: 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70  ){.      close(p
dd50: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d 0a  File->h);.    }.
dd60: 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20  #if IS_VXWORKS. 
dd70: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
dd80: 44 65 6c 65 74 65 20 26 26 20 70 46 69 6c 65 2d  Delete && pFile-
dd90: 3e 7a 52 65 61 6c 70 61 74 68 20 29 7b 0a 20 20  >zRealpath ){.  
dda0: 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65      unlink(pFile
ddb0: 2d 3e 7a 52 65 61 6c 70 61 74 68 29 3b 0a 20 20  ->zRealpath);.  
ddc0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c    }.    if( pFil
ddd0: 65 2d 3e 7a 52 65 61 6c 70 61 74 68 20 29 7b 0a  e->zRealpath ){.
dde0: 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a        HashElem *
ddf0: 70 45 6c 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pElem;.      int
de00: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 46 69 6c   n = strlen(pFil
de10: 65 2d 3e 7a 52 65 61 6c 70 61 74 68 29 20 2b 20  e->zRealpath) + 
de20: 31 3b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d  1;.      pElem =
de30: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
de40: 45 6c 65 6d 28 26 6e 61 6d 65 48 61 73 68 2c 20  Elem(&nameHash, 
de50: 70 46 69 6c 65 2d 3e 7a 52 65 61 6c 70 61 74 68  pFile->zRealpath
de60: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
de70: 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  pElem ){.       
de80: 20 6c 6f 6e 67 20 63 6e 74 20 3d 20 28 6c 6f 6e   long cnt = (lon
de90: 67 29 70 45 6c 65 6d 2d 3e 64 61 74 61 3b 0a 20  g)pElem->data;. 
dea0: 20 20 20 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20         cnt--;.  
deb0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
dec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ded0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
dee0: 26 6e 61 6d 65 48 61 73 68 2c 20 70 46 69 6c 65  &nameHash, pFile
def0: 2d 3e 7a 52 65 61 6c 70 61 74 68 2c 20 6e 2c 20  ->zRealpath, n, 
df00: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
df10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6c  e{.          pEl
df20: 65 6d 2d 3e 64 61 74 61 20 3d 20 28 76 6f 69 64  em->data = (void
df30: 2a 29 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  *)cnt;.        }
df40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
df50: 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43  endif.    OSTRAC
df60: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
df70: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
df80: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
df90: 2d 31 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  -1);.    memset(
dfa0: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
dfb0: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d  (unixFile));.  }
dfc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dfd0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
dfe0: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
dff0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
e000: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
e010: 20 2a 69 64 29 7b 0a 20 20 69 66 28 20 69 64 20   *id){.  if( id 
e020: 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
e030: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e040: 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69  le *)id;.    uni
e050: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
e060: 4f 43 4b 29 3b 0a 20 20 20 20 65 6e 74 65 72 4d  OCK);.    enterM
e070: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
e080: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 20 26 26 20  pFile->pOpen && 
e090: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
e0a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
e0b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
e0c0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
e0d0: 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
e0e0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
e0f0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
e100: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
e110: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
e120: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
e130: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
e140: 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
e150: 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  r to pOpen->aPen
e160: 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
e170: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
e180: 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
e190: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
e1a0: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
e1b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
e1c0: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 73  t *aNew;.      s
e1d0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
e1e0: 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
e1f0: 70 65 6e 3b 0a 20 20 20 20 20 20 61 4e 65 77 20  pen;.      aNew 
e200: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
e210: 63 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  c(pOpen->aPendin
e220: 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  g, (pOpen->nPend
e230: 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e  ing+1)*sizeof(in
e240: 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
e250: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
e260: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
e270: 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
e280: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
e290: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  riptor */.      
e2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
e2b0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
e2c0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   aNew;.        p
e2d0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
e2e0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20  Open->nPending] 
e2f0: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
e300: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
e310: 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ing++;.        p
e320: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
e330: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e340: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
e350: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
e360: 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
e370: 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b  t(pFile->pOpen);
e380: 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
e390: 6c 65 28 69 64 29 3b 0a 20 20 20 20 6c 65 61 76  le(id);.    leav
e3a0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
e3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e3c0: 3b 0a 7d 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45  ;.}...#if SQLITE
e3d0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
e3e0: 53 54 59 4c 45 0a 0a 23 69 66 20 21 49 53 5f 56  STYLE..#if !IS_V
e3f0: 58 57 4f 52 4b 53 0a 23 70 72 61 67 6d 61 20 6d  XWORKS.#pragma m
e400: 61 72 6b 20 41 46 50 20 53 75 70 70 6f 72 74 0a  ark AFP Support.
e410: 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c  ./*. ** The afpL
e420: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
e430: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
e440: 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
e450: 65 63 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f  ecific state. */
e460: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
e470: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
e480: 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
e490: 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
e4a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
e4b0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
e4c0: 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42  long sharedLockB
e4d0: 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  yte;.  const cha
e4e0: 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a  r *filePath;.};.
e4f0: 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
e500: 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
e510: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
e520: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
e530: 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
e540: 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
e550: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
e560: 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
e570: 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
e580: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
e590: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
e5a0: 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
e5b0: 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
e5c0: 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
e5d0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
e5e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e5f0: 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
e600: 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
e610: 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
e620: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
e630: 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
e640: 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
e650: 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
e660: 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
e670: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
e6a0: 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
e6b0: 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
e6c0: 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
e6d0: 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
e6e0: 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
e6f0: 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
e700: 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
e710: 2a 20 0a 20 2a 2a 20 52 65 74 75 72 6e 20 53 51  * . ** Return SQ
e720: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e730: 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
e740: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 20 2a 2f 0a  on failure.. */.
e750: 73 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46  static int _AFPF
e760: 53 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73  SSetLock(.  cons
e770: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 0a 20  t char *path, . 
e780: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e790: 2c 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  , .  unsigned lo
e7a0: 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
e7b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
e7c0: 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 0a 20   long length, . 
e7d0: 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
e7e0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
e7f0: 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 20 20  eRangeLockPB2   
e800: 20 20 20 20 70 62 3b 0a 20 20 69 6e 74 20 20 20      pb;.  int   
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75    err;.  .  pb.u
e830: 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
e840: 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
e850: 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
e860: 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
e870: 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
e880: 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
e890: 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70  th; .  pb.fd = p
e8a0: 46 69 6c 65 2d 3e 68 3b 0a 20 20 4f 53 54 52 41  File->h;.  OSTRA
e8b0: 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74  CE5("AFPLOCK set
e8c0: 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72  ting lock %s for
e8d0: 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c   %d in range %ll
e8e0: 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
e8f0: 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
e900: 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
e910: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67  >h, offset, leng
e920: 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63  th);.  err = fsc
e930: 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79  tl(path, afpfsBy
e940: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
e950: 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66  L, &pb, 0);.  if
e960: 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20   ( err==-1 ) {. 
e970: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
e980: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
e990: 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  o;.    OSTRACE4(
e9a0: 22 41 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20  "AFPLOCK failed 
e9b0: 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
e9c0: 25 64 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20  %d %s\n", path, 
e9d0: 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72  tErrno, strerror
e9e0: 28 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72  (tErrno));.    r
e9f0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ea00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ea10: 72 72 6e 6f 2c 20 73 65 74 4c 6f 63 6b 46 6c 61  rrno, setLockFla
ea20: 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
ea30: 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
ea40: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 2f 2a  OERR_UNLOCK); /*
ea50: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66   error */.    if
ea60: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
ea70: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
ea80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ea90: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
eaa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
eab0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
eac0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ead0: 7d 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c  }.}../* AFP-styl
eae0: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
eaf0: 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69  checking followi
eb00: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
eb10: 6f 66 20 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b  of .** unixCheck
eb20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65  ReservedLock, se
eb30: 65 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52  e the unixCheckR
eb40: 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63  eservedLock func
eb50: 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tion comments */
eb60: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
eb70: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
eb80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
eb90: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
eba0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ebb0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
ebc0: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
ebd0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ebe0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
ebf0: 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
ec00: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
ec10: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
ec20: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
ec30: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
ec40: 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  e );.  afpLockin
ec50: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
ec60: 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
ec70: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
ec80: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
ec90: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
eca0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
ecb0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
ecc0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
ecd0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ece0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
ecf0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
ed00: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
ed10: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
ed20: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
ed30: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
ed40: 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
ed50: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
ed60: 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
ed70: 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
ed80: 6e 74 20 6c 72 63 20 3d 20 5f 41 46 50 46 53 53  nt lrc = _AFPFSS
ed90: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
eda0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
edb0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
edc0: 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
edd0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
ede0: 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
edf0: 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
ee00: 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
ee10: 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
ee20: 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
ee30: 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
ee40: 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
ee50: 20 20 6c 72 63 20 3d 20 5f 41 46 50 46 53 53 65    lrc = _AFPFSSe
ee60: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
ee70: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
ee80: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
ee90: 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
eea0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
eeb0: 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
eec0: 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
eed0: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
eee0: 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
eef0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
ef00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
ef10: 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
ef20: 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
ef30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
ef40: 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
ef50: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
ef60: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
ef70: 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a  , reserved);.  .
ef80: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
ef90: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
efa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74  rc;.}../* AFP-st
efb0: 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c  yle locking foll
efc0: 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69  owing the behavi
efd0: 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20  or of unixLock, 
efe0: 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  see the unixLock
eff0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f   .** function co
f000: 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69  mments for detai
f010: 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67  ls of lock manag
f020: 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63  ement. */.static
f030: 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
f040: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f050: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
f060: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f070: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
f080: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f090: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
f0a0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
f0b0: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
f0c0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
f0d0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
f0e0: 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
f0f0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
f100: 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
f110: 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64  %s was %s pid=%d
f120: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
f130: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
f140: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
f150: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
f160: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67  le->locktype), g
f170: 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20  etpid());..  /* 
f180: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
f190: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
f1a0: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
f1b0: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
f1c0: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
f1d0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
f1e0: 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
f1f0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
f200: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74  ath, as.  ** ent
f210: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
f220: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
f230: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
f240: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
f250: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
f260: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
f270: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
f280: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
f290: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
f2a0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
f2b0: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
f2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f2d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
f2e0: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
f2f0: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
f300: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
f310: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
f320: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
f330: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
f340: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
f350: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
f360: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
f370: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
f380: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
f390: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f3a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
f3b0: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
f3c0: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
f3d0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
f3e0: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
f3f0: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
f400: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
f410: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
f420: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
f430: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
f440: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
f450: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
f460: 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
f470: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f480: 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28  .    leaveMutex(
f490: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
f4a0: 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
f4b0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
f4c0: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
f4d0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
f4e0: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
f4f0: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
f500: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
f510: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
f520: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
f530: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
f540: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
f550: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
f560: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
f570: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
f580: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
f590: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
f5a0: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
f5b0: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
f5c0: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
f5d0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f5e0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f5f0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  ePath, pFile, PE
f600: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
f610: 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
f620: 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
f630: 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
f640: 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
f650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
f660: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
f670: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
f680: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
f690: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
f6a0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
f6b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
f6c0: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
f6d0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
f6e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
f6f0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
f700: 74 20 6c 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32  t lk, lrc1, lrc2
f710: 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  , lrc1Errno;.   
f720: 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74   .    /* Now get
f730: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
f740: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
f750: 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
f760: 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
f770: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
f780: 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
f790: 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
f7a0: 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
f7b0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
f7c0: 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26  LockByte = (lk &
f7d0: 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
f7e0: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
f7f0: 20 20 20 20 6c 72 63 31 20 3d 20 5f 41 46 50 46      lrc1 = _AFPF
f800: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
f810: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
f820: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
f830: 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65  ARED_FIRST+conte
f840: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
f850: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
f860: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f870: 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
f880: 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
f890: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
f8a0: 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
f8b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
f8c0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
f8d0: 20 20 6c 72 63 32 20 3d 20 5f 41 46 50 46 53 53    lrc2 = _AFPFSS
f8e0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
f8f0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
f900: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
f910: 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
f920: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f930: 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
f940: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f950: 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
f960: 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
f970: 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
f980: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
f990: 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
f9a0: 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
f9b0: 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
f9c0: 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
f9d0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
f9e0: 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
f9f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
fa00: 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
fa10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
fa20: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fa30: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
fa40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
fa50: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
fa60: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
fa70: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
fa80: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
fa90: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
faa0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
fab0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
fac0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
fad0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
fae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
faf0: 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
fb00: 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
fb10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
fb20: 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20     if (locktype 
fb30: 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
fb40: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
fb50: 79 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ype < RESERVED_L
fb60: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
fb70: 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
fb80: 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
fb90: 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41       failed = _A
fba0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
fbb0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
fbc0: 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
fbd0: 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d  YTE, 1,1);.    }
fbe0: 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
fbf0: 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20   && locktype == 
fc00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
fc10: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
fc20: 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
fc30: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
fc40: 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
fc50: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
fc60: 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
fc70: 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
fc80: 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
fc90: 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
fca0: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
fcb0: 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
fcc0: 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
fcd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20      */.      if 
fce0: 28 21 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  (!(failed = _AFP
fcf0: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
fd00: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
fd10: 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
fd20: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
fd40: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
fd50: 79 74 65 2c 20 31 2c 20 30 29 29 29 20 7b 0a 20  yte, 1, 0))) {. 
fd60: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
fd70: 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
fd80: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
fd90: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
fda0: 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
fdb0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
fdc0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
fdd0: 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
fde0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
fe10: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 61  ;.        if (fa
fe20: 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 20  iled && (failed 
fe30: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
fe40: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
fe50: 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
fe80: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
fe90: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29  LockByte, 1, 1))
fea0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ) {.          rc
feb0: 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
fec0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
fed0: 65 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e {.        rc =
fee0: 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
fef0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ff00: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
ff10: 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
ff20: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
ff30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ff40: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
ff50: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
ff60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
ff70: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
ff80: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
ff90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
ffa0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
ffb0: 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
ffc0: 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  :.  leaveMutex()
ffd0: 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  ;.  OSTRACE4("LO
ffe0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
fff0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
10000 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
10010 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  pe), .         r
10020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
10030 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
10040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10050 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
10060 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10070 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10080 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
10090 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
100a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
100b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
100c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
100d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
100e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
100f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
10100 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
10110 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
10120 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
10130 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
10140 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10150 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
10160 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10170 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
10180 65 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e) {.  int rc = 
10190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
101a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
101b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
101c0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
101d0 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
101e0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
101f0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
10200 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
10210 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10220 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
10230 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
10240 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
10250 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
10260 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
10270 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
10280 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  );..  assert( lo
10290 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
102a0 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
102b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f  le->locktype<=lo
102c0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
102d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
102e0 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f    }.  if( CHECK_
102f0 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20  THREADID(pFile) 
10300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10310 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
10320 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
10330 0a 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20  .  int failed = 
10340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
10350 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10360 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
10370 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
10380 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
10390 0a 0a 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63  ..      /* unloc
103a0 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  k the exclusive 
103b0 72 61 6e 67 65 20 2d 20 74 68 65 6e 20 72 65 2d  range - then re-
103c0 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
103d0 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ared lock */.   
103e0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
103f0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
10400 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
10410 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
10420 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
10430 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
10440 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
10450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
10480 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0);.        if (
10490 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  !failed) {.     
104a0 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66       /* successf
104b0 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65  ully removed the
104c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
104d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  */.          if 
104e0 28 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46  ((failed = _AFPF
104f0 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
10500 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
10510 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  e, SHARED_FIRST+
10520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
10540 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
10550 42 79 74 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a  Byte, 1, 1))) {.
10560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
10570 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74 61  ailed to re-esta
10580 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65 64  blish our shared
10590 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
105a0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
105b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
105c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
105d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61           rc = fa
105e0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 20  iled;.        } 
105f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10600 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c     if (rc == SQL
10610 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
10620 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
10630 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  NG_LOCK) {.     
10640 20 69 66 20 28 28 66 61 69 6c 65 64 20 3d 20 5f   if ((failed = _
10650 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
10660 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
10670 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
106a0 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 29 7b  G_BYTE, 1, 0))){
106b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  .        /* fail
106c0 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ed to release th
106d0 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  e pending lock *
106e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
106f0 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
10700 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72      } .    if (r
10710 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26  c == SQLITE_OK &
10720 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
10730 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
10740 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 28 66  ) {.      if ((f
10750 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
10760 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
10770 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
10780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
107b0 2c 20 31 2c 20 30 29 29 29 20 7b 0a 20 20 20 20  , 1, 0))) {.    
107c0 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
107d0 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73   release the res
107e0 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
107f0 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
10800 64 3b 20 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  d;  .      }.   
10810 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f   } .  }.  if( lo
10820 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
10830 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
10840 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
10850 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
10860 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
10890 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65  ED_FIRST + conte
108a0 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
108b0 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  te, 1, 0);.    i
108c0 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
108d0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
108e0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66   .    }.  }.  if
108f0 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
10900 4b 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  K).    pFile->lo
10910 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10920 65 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  e;.  leaveMutex(
10930 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10940 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10950 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
10960 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
10970 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
10980 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
10990 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
109a0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
109b0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
109c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
109d0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
109e0 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
109f0 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
10a00 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
10a10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
10a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   }.  return clos
10a30 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
10a40 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  ...#pragma mark 
10a50 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f  flock() style lo
10a60 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  cking../*.** The
10a70 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e   flockLockingCon
10a80 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64  text is not used
10a90 0a 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64  .*/.typedef void
10aa0 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e   flockLockingCon
10ab0 74 65 78 74 3b 0a 0a 2f 2a 20 66 6c 6f 63 6b 2d  text;../* flock-
10ac0 73 74 79 6c 65 20 72 65 73 65 72 76 65 64 20 6c  style reserved l
10ad0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 20 66 6f 6c  ock checking fol
10ae0 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61 76  lowing the behav
10af0 69 6f 72 20 6f 66 20 0a 20 2a 2a 20 75 6e 69 78  ior of . ** unix
10b00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10b10 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 43  k, see the unixC
10b20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10b30 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e   function commen
10b40 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts */.static int
10b50 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
10b60 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
10b70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
10b80 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
10b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10ba0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
10bb0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
10bc0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10bd0 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
10be0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
10bf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10c00 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
10c10 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
10c20 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
10c30 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
10c40 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
10c50 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
10c60 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
10c70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10c80 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
10c90 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
10ca0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
10cb0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
10cc0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
10cd0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
10ce0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
10cf0 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
10d00 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
10d10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
10d20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
10d30 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
10d40 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
10d50 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
10d60 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
10d70 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
10d80 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c  lrc = flock(pFil
10d90 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
10da0 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
10db0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
10dc0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10dd0 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
10de0 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
10df0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
10e00 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
10e10 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10e20 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10e30 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
10e40 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
10e50 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
10e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
10e70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10e80 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
10e90 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
10ea0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10eb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
10ec0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10ed0 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76  no;.      reserv
10ee0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  ed = 1;.      /*
10ef0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69   someone else mi
10f00 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65  ght have it rese
10f10 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72  rved */.      lr
10f20 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
10f30 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
10f40 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10f50 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  RR_LOCK); .     
10f60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10f70 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
10f80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10f90 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10fa0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
10fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10fc0 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 45  }.  OSTRACE4("TE
10fd0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
10fe0 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
10ff0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b  , rc, reserved);
11000 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
11010 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
11020 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
11030 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
11040 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11050 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11070 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
11080 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11090 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
110a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
110b0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
110c0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
110d0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
110e0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
110f0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
11100 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
11110 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
11120 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
11130 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
11140 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
11150 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
11160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11170 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
11180 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
11190 2f 0a 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b  /.  .  if (flock
111a0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
111b0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
111c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
111d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
111e0 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
111f0 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
11200 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11210 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11220 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11230 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
11240 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11250 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11260 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11270 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11280 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
11290 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
112a0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
112b0 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
112c0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
112d0 6b 74 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54  ktype;.  }.  OST
112e0 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
112f0 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
11300 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
11310 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
11320 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
11330 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
11340 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
11350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
11360 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
11370 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11380 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
11390 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
113a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
113b0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
113c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
113d0 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
113e0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
113f0 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
11400 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
11410 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11420 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
11430 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
11440 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
11450 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
11460 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
11470 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
11480 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
11490 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
114a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
114b0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
114c0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
114d0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
114e0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
114f0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
11500 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
11510 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
11520 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
11530 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
11540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11550 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
11560 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
11570 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
11580 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11590 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
115a0 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
115b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
115c0 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
115d0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
115e0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
115f0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11600 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11610 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
11620 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11630 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11640 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
11650 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
11660 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
11670 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
11680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
116a0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
116b0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65  c int flockClose
116c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
116d0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
116e0 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  .    flockUnlock
116f0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
11700 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   }.  return clos
11710 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
11720 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 49 53 5f  ..#endif /* !IS_
11730 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 23 70 72 61  VXWORKS */..#pra
11740 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68  gma mark Old-Sch
11750 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62  ool .lock file b
11760 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a  ased locking../*
11770 20 44 6f 74 6c 6f 63 6b 2d 73 74 79 6c 65 20 72   Dotlock-style r
11780 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65  eserved lock che
11790 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
117a0 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
117b0 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73  .** unixCheckRes
117c0 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74  ervedLock, see t
117d0 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  he unixCheckRese
117e0 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f  rvedLock functio
117f0 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74  n comments */.st
11800 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11810 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11820 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11830 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11840 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11860 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
11870 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11880 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11890 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
118a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
118b0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
118c0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
118d0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
118e0 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
118f0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11900 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11910 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11920 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
11930 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
11940 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11950 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11960 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11970 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11980 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11990 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
119a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 63 68 61  erved ){.    cha
119b0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
119c0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
119d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
119e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
119f0 61 74 42 75 66 3b 0a 20 20 20 20 0a 20 20 20 20  atBuf;.    .    
11a00 69 66 28 20 6c 73 74 61 74 28 7a 4c 6f 63 6b 46  if( lstat(zLockF
11a10 69 6c 65 2c 20 26 73 74 61 74 42 75 66 29 3d 3d  ile, &statBuf)==
11a20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 66 69  0 ){.      /* fi
11a30 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d 65 6f  le exists, someo
11a40 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
11a50 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 65  lock */.      re
11a60 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
11a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
11a80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
11a90 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61  ist, we could ha
11aa0 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
11ab0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   it */.      int
11ac0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11ad0 0a 20 20 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  .      if( ENOEN
11ae0 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
11af0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11b00 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11b10 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11b20 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
11b30 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
11b40 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11b50 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b70 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22    }.  OSTRACE4("
11b80 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11b90 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %d\n", pFile-
11ba0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
11bb0 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
11bc0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
11bd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
11be0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
11bf0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11c00 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
11c10 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
11c20 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11c30 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
11c40 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11c50 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11c60 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11c70 78 74 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c  xt;.  int rc=SQL
11c80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
11c90 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
11ca0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
11cb0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
11cc0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
11cd0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
11ce0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
11cf0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
11d00 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
11d10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
11d20 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
11d30 0a 23 69 66 20 21 49 53 5f 56 58 57 4f 52 4b 53  .#if !IS_VXWORKS
11d40 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11d50 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11d60 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11d70 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65  ile */.    utime
11d80 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
11d90 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
11da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11db0 20 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f     goto dotlock_
11dc0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
11dd0 0a 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73  .  /* check to s
11de0 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20  ee if lock file 
11df0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11e00 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
11e10 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c  statBuf;.  if (l
11e20 73 74 61 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26  stat(zLockFile,&
11e30 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a  statBuf) == 0){.
11e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11e50 42 55 53 59 3b 20 2f 2a 20 69 74 20 64 6f 65 73  BUSY; /* it does
11e60 2c 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 67 6f  , busy */.    go
11e70 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c  to dotlock_end_l
11e80 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
11e90 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11ea0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
11eb0 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65  = open(zLockFile
11ec0 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41  ,O_RDONLY|O_CREA
11ed0 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a  T|O_EXCL,0600);.
11ee0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
11ef0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
11f00 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
11f10 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ile, someone els
11f20 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65  e may have stole
11f30 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  n the lock */.  
11f40 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11f50 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
11f60 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
11f70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11f80 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
11f90 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
11fa0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11fb0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11fc0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11fd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
11fe0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11ff0 72 63 29 20 29 7b 0a 09 70 46 69 6c 65 2d 3e 6c  rc) ){..pFile->l
12000 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12010 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
12020 0a 20 20 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63  .    goto dotloc
12030 6b 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 20  k_end_lock;.  } 
12040 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
12050 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
12060 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
12070 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
12080 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
12090 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20 64 6f 74 6c  locktype;.. dotl
120a0 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  ock_end_lock:.  
120b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
120c0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
120d0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
120e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
120f0 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
12100 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12110 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
12120 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
12130 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
12140 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
12150 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12160 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55  );.  OSTRACE5("U
12170 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
12180 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %d pid=%d\n", p
12190 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
121a0 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  e,..   pFile->lo
121b0 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
121c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
121d0 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
121e0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
121f0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
12200 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12210 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
12220 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
12230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12240 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
12250 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
12260 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
12270 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12280 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
12290 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
122a0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
122b0 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
122c0 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
122d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
122e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
122f0 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
12300 69 66 20 28 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b  if (unlink(zLock
12310 46 69 6c 65 29 20 29 20 7b 0a 20 20 20 20 69 6e  File) ) {.    in
12320 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
12330 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
12340 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
12350 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12360 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12370 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12380 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
12390 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  CK);.    }.    i
123a0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
123b0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
123c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
123d0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
123e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
123f0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
12400 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
12410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12420 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
12430 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
12440 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
12450 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12460 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
12470 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
12480 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
12490 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
124a0 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
124b0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
124c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
124d0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
124e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
124f0 20 20 7d 0a 20 20 69 66 28 20 49 53 5f 56 58 57    }.  if( IS_VXW
12500 4f 52 4b 53 20 29 20 65 6e 74 65 72 4d 75 74 65  ORKS ) enterMute
12510 78 28 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  x();.  rc = clos
12520 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
12530 20 69 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20   if( IS_VXWORKS 
12540 29 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ) leaveMutex();.
12550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12560 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if IS_VXWORKS..
12570 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 50 4f 53  #pragma mark POS
12580 49 58 2f 76 78 57 6f 72 6b 73 20 6e 61 6d 65 64  IX/vxWorks named
12590 20 73 65 6d 61 70 68 6f 72 65 20 62 61 73 65 64   semaphore based
125a0 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 20 4e 61 6d   locking../* Nam
125b0 65 64 73 65 6d 2d 73 74 79 6c 65 20 72 65 73 65  edsem-style rese
125c0 72 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69  rved lock checki
125d0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ng following the
125e0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a   behavior of .**
125f0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
12600 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20  edLock, see the 
12610 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
12620 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63  dLock function c
12630 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69  omments */.stati
12640 63 20 69 6e 74 20 6e 61 6d 65 64 73 65 6d 43 68  c int namedsemCh
12650 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
12660 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12670 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
12680 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12690 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
126a0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
126b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
126c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
126d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
126e0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
126f0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
12700 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
12710 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12720 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
12730 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
12740 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
12750 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
12760 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
12770 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
12780 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12790 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
127a0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
127b0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
127c0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
127d0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
127e0 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
127f0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12800 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 20  pOpen->pSem;.   
12810 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
12820 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73  tBuf;..    if( s
12830 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12840 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
12850 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12860 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
12870 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
12880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12890 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
128a0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
128b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
128c0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
128d0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
128e0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
128f0 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  o;.      } else 
12900 7b 0a 09 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c  {../* someone el
12910 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
12920 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
12930 4f 5f 4c 4f 43 4b 20 2a 2f 0a 09 72 65 73 65 72  O_LOCK */..reser
12940 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 6c 6f  ved = (pFile->lo
12950 63 6b 74 79 70 65 20 3c 20 53 48 41 52 45 44 5f  cktype < SHARED_
12960 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12980 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12990 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
129a0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
129b0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
129c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
129d0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
129e0 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
129f0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
12a00 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
12a10 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
12a30 69 63 20 69 6e 74 20 6e 61 6d 65 64 73 65 6d 4c  ic int namedsemL
12a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12a50 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
12a60 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
12a70 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12a80 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
12a90 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
12aa0 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d   = pFile->pOpen-
12ab0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
12ac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
12ad0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
12ae0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
12af0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
12b00 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
12b10 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
12b20 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
12b30 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
12b40 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
12b50 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
12b60 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
12b70 74 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53  type;.    rc = S
12b80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
12b90 74 6f 20 6e 61 6d 65 64 73 65 6d 5f 65 6e 64 5f  to namedsem_end_
12ba0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
12bb0 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
12bc0 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
12bd0 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
12be0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
12bf0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
12c00 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
12c10 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
12c20 20 20 20 67 6f 74 6f 20 6e 61 6d 65 64 73 65 6d     goto namedsem
12c30 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
12c40 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
12c50 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
12c60 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
12c70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
12c80 6f 63 6b 74 79 70 65 3b 0a 0a 20 6e 61 6d 65 64  ocktype;.. named
12c90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
12ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12cb0 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 64 73 65  atic int namedse
12cc0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
12cd0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
12ce0 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
12cf0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12d00 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
12d10 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
12d20 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b  le->pOpen->pSem;
12d30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
12d40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
12d50 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
12d60 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
12d70 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
12d80 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
12d90 6b 74 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65  ktype,..   pFile
12da0 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
12db0 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28  id());.  assert(
12dc0 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
12dd0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12de0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12df0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12e00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f  le->locktype==lo
12e10 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
12e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12e30 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
12e40 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
12e50 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
12e60 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
12e70 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
12e80 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
12e90 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12ea0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
12eb0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
12ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12ed0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
12ee0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
12ef0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
12f00 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
12f10 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
12f20 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
12f30 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12f40 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12f50 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12f60 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
12f70 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12f80 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
12f90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12fa0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
12fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
12fc0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
12fd0 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
12fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12ff0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
13000 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
13010 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
13020 64 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65  dsemClose(sqlite
13030 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
13040 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
13050 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13060 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13070 20 20 20 6e 61 6d 65 64 73 65 6d 55 6e 6c 6f 63     namedsemUnloc
13080 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
13090 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
130a0 65 20 29 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75  e );.    enterMu
130b0 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
130c0 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
130d0 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
130e0 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
130f0 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
13100 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
13110 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65  );.    leaveMute
13120 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
13130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13140 23 65 6e 64 69 66 20 2f 2a 20 49 53 5f 56 58 57  #endif /* IS_VXW
13150 4f 52 4b 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  ORKS */..#endif 
13160 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
13170 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
13180 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c  /../*.** The nol
13190 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
131a0 74 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79 70  t is void.*/.typ
131b0 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b  edef void nolock
131c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
131d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
131e0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
131f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13200 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
13210 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
13220 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
13230 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
13240 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
13250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
13260 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c  atic int nolockL
13270 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13280 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
13290 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
132a0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
132b0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
132c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
132d0 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
132e0 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  int nolockUnlock
132f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
13300 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
13310 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
13320 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
13330 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
13340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13350 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
13360 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
13370 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
13380 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13390 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
133a0 3b 0a 20 20 69 66 28 20 49 53 5f 56 58 57 4f 52  ;.  if( IS_VXWOR
133b0 4b 53 20 29 20 65 6e 74 65 72 4d 75 74 65 78 28  KS ) enterMutex(
133c0 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
133d0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 69  nixFile(id);.  i
133e0 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20 29 20  f( IS_VXWORKS ) 
133f0 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
13400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
13410 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
13420 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
13430 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
13440 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
13450 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
13460 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
13470 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
13480 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
13490 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
134a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
134b0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
134c0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
134d0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
134e0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
134f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13500 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
13510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13520 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
13530 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
13540 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
13550 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
13560 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
13570 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
13580 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
13590 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
135a0 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
135b0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
135c0 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
135d0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
135e0 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
135f0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
13600 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
13610 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
13620 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
13630 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
13640 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
13650 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
13660 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
13670 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
13680 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
13690 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
136a0 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
136b0 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
136c0 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
136d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
136e0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
136f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
13700 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
13710 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
13720 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
13730 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13740 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
13750 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
13760 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
13770 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
13780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
13790 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
137a0 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
137b0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
137c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
137d0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
137e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
137f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13800 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13810 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
13820 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
13830 79 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  y pId..**.** Whe
13840 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73  n locking extens
13850 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ions are enabled
13860 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61  , the filepath a
13870 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  nd locking style
13880 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20   .** are needed 
13890 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
138a0 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f   unixFile pMetho
138b0 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63  d to use for loc
138c0 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
138d0 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** The locking-
138e0 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 6c  style specific l
138f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 61  ockingContext da
13900 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
13910 63 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64 20  created .** and 
13920 61 73 73 69 67 6e 65 64 20 68 65 72 65 20 61 6c  assigned here al
13930 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  so..*/.static in
13940 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
13950 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
13960 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
13970 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
13980 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
139b0 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
139c0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
139d0 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20 20  /.  int dirfd,  
139e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
139f0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
13a00 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
13a10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
13a20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13a30 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
13a40 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
13a50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13a60 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
13a70 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
13a80 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
13a90 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
13aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
13ab0 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
13ac0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
13ad0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te            /*
13ae0 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
13af0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
13b00 20 69 6e 74 20 65 4c 6f 63 6b 69 6e 67 53 74 79   int eLockingSty
13b10 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
13b20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
13b30 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
13b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13b50 20 2f 2a 20 4d 61 63 72 6f 20 74 6f 20 64 65 66   /* Macro to def
13b60 69 6e 65 20 74 68 65 20 73 74 61 74 69 63 20 63  ine the static c
13b70 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e 20 73 71  ontents of an sq
13b80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
13b90 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
13ba0 20 66 6f 72 20 61 20 75 6e 69 78 20 62 61 63 6b   for a unix back
13bb0 65 6e 64 20 66 69 6c 65 2e 20 44 69 66 66 65 72  end file. Differ
13bc0 65 6e 74 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ent locking meth
13bd0 6f 64 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ods.  ** require
13be0 20 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63 74   different funct
13bf0 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 78 43 6c  ions for the xCl
13c00 6f 73 65 2c 20 78 4c 6f 63 6b 2c 20 78 55 6e 6c  ose, xLock, xUnl
13c10 6f 63 6b 20 61 6e 64 0a 20 20 2a 2a 20 78 43 68  ock and.  ** xCh
13c20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
13c30 6d 65 74 68 6f 64 73 2e 0a 20 20 2a 2f 0a 20 20  methods..  */.  
13c40 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
13c50 53 28 78 43 6c 6f 73 65 2c 20 78 4c 6f 63 6b 2c  S(xClose, xLock,
13c60 20 78 55 6e 6c 6f 63 6b 2c 20 78 43 68 65 63 6b   xUnlock, xCheck
13c70 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 20 7b 20  ReservedLock) { 
13c80 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20 20     \.    1,     
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
13cb0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
13cd0 20 20 20 20 78 43 6c 6f 73 65 2c 20 20 20 20 20      xClose,     
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
13d20 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
13d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
13d40 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 57 72      \.    unixWr
13d70 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
13d80 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
13d90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
13db0 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  .    unixTruncat
13dc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13dd0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
13e00 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
13e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
13e20 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46       \.    unixF
13e50 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
13e60 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
13e70 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 5c 0a 20 20 20 20 78 4c 6f 63 6b 2c 20 20 20 20  \.    xLock,    
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
13ee0 20 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20   xUnlock,       
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f00 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 43 68 65        \.    xChe
13f30 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
13f40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
13f50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 5c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 43   \.    unixFileC
13f80 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
13f90 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
13fa0 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
13fc0 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
13fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13fe0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
14010 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
14020 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65 76  istics   /* xDev
14030 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
14040 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
14050 20 20 5c 0a 20 20 7d 0a 20 20 73 74 61 74 69 63    \.  }.  static
14060 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
14070 6f 64 73 20 61 49 6f 4d 65 74 68 6f 64 5b 5d 20  ods aIoMethod[] 
14080 3d 20 7b 0a 20 20 20 20 49 4f 4d 45 54 48 4f 44  = {.    IOMETHOD
14090 53 28 75 6e 69 78 43 6c 6f 73 65 2c 20 75 6e 69  S(unixClose, uni
140a0 78 4c 6f 63 6b 2c 20 75 6e 69 78 55 6e 6c 6f 63  xLock, unixUnloc
140b0 6b 2c 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  k, unixCheckRese
140c0 72 76 65 64 4c 6f 63 6b 29 20 0a 20 20 20 2c 49  rvedLock) .   ,I
140d0 4f 4d 45 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43  OMETHODS(nolockC
140e0 6c 6f 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  lose, nolockLock
140f0 2c 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  , nolockUnlock, 
14100 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
14110 76 65 64 4c 6f 63 6b 29 0a 23 69 66 20 53 51 4c  vedLock).#if SQL
14120 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
14130 4e 47 5f 53 54 59 4c 45 0a 20 20 20 2c 49 4f 4d  NG_STYLE.   ,IOM
14140 45 54 48 4f 44 53 28 64 6f 74 6c 6f 63 6b 43 6c  ETHODS(dotlockCl
14150 6f 73 65 2c 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  ose, dotlockLock
14160 2c 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  , dotlockUnlock,
14170 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
14180 72 76 65 64 4c 6f 63 6b 29 0a 23 69 66 20 49 53  rvedLock).#if IS
14190 5f 56 58 57 4f 52 4b 53 0a 20 20 20 2c 49 4f 4d  _VXWORKS.   ,IOM
141a0 45 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f  ETHODS(nolockClo
141b0 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  se, nolockLock, 
141c0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f  nolockUnlock, no
141d0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
141e0 64 4c 6f 63 6b 29 0a 20 20 20 2c 49 4f 4d 45 54  dLock).   ,IOMET
141f0 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  HODS(nolockClose
14200 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f  , nolockLock, no
14210 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f  lockUnlock, nolo
14220 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
14230 6f 63 6b 29 0a 20 20 20 2c 49 4f 4d 45 54 48 4f  ock).   ,IOMETHO
14240 44 53 28 6e 61 6d 65 64 73 65 6d 43 6c 6f 73 65  DS(namedsemClose
14250 2c 20 6e 61 6d 65 64 73 65 6d 4c 6f 63 6b 2c 20  , namedsemLock, 
14260 6e 61 6d 65 64 73 65 6d 55 6e 6c 6f 63 6b 2c 20  namedsemUnlock, 
14270 6e 61 6d 65 64 73 65 6d 43 68 65 63 6b 52 65 73  namedsemCheckRes
14280 65 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6c 73 65  ervedLock).#else
14290 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28 66  .   ,IOMETHODS(f
142a0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 66 6c 6f 63 6b  lockClose, flock
142b0 4c 6f 63 6b 2c 20 66 6c 6f 63 6b 55 6e 6c 6f 63  Lock, flockUnloc
142c0 6b 2c 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  k, flockCheckRes
142d0 65 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20 2c 49  ervedLock).   ,I
142e0 4f 4d 45 54 48 4f 44 53 28 61 66 70 43 6c 6f 73  OMETHODS(afpClos
142f0 65 2c 20 61 66 70 4c 6f 63 6b 2c 20 61 66 70 55  e, afpLock, afpU
14300 6e 6c 6f 63 6b 2c 20 61 66 70 43 68 65 63 6b 52  nlock, afpCheckR
14310 65 73 65 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20  eservedLock).   
14320 2c 49 4f 4d 45 54 48 4f 44 53 28 6e 6f 6c 6f 63  ,IOMETHODS(noloc
14330 6b 43 6c 6f 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f  kClose, nolockLo
14340 63 6b 2c 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  ck, nolockUnlock
14350 2c 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  , nolockCheckRes
14360 65 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6e 64 69  ervedLock).#endi
14370 66 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  f.#endif.  };.  
14380 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20  /* The order of 
14390 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 20 6d 61  the IOMETHODS ma
143a0 63 72 6f 73 20 61 62 6f 76 65 20 69 73 20 69 6d  cros above is im
143b0 70 6f 72 74 61 6e 74 2e 20 20 49 74 20 6d 75 73  portant.  It mus
143c0 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 73 61  t be the.  ** sa
143d0 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20  me order as the 
143e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 6e 75  LOCKING_STYLE nu
143f0 6d 62 65 72 73 0a 20 20 2a 2f 0a 20 20 61 73 73  mbers.  */.  ass
14400 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ert(LOCKING_STYL
14410 45 5f 50 4f 53 49 58 3d 3d 31 29 3b 0a 20 20 61  E_POSIX==1);.  a
14420 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54  ssert(LOCKING_ST
14430 59 4c 45 5f 4e 4f 4e 45 3d 3d 32 29 3b 0a 20 20  YLE_NONE==2);.  
14440 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53  assert(LOCKING_S
14450 54 59 4c 45 5f 44 4f 54 46 49 4c 45 3d 3d 33 29  TYLE_DOTFILE==3)
14460 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49  ;.  assert(LOCKI
14470 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 3d 3d  NG_STYLE_FLOCK==
14480 34 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43  4);.  assert(LOC
14490 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 3d 3d  KING_STYLE_AFP==
144a0 35 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43  5);.  assert(LOC
144b0 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45 44  KING_STYLE_NAMED
144c0 53 45 4d 3d 3d 36 29 3b 0a 0a 20 20 61 73 73 65  SEM==6);..  asse
144d0 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d  rt( pNew->pLock=
144e0 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  =NULL );.  asser
144f0 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d  t( pNew->pOpen==
14500 4e 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41  NULL );..  OSTRA
14510 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE3("OPEN    %-3
14520 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
14530 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e  ename);    .  pN
14540 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
14550 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
14560 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
14570 28 70 4e 65 77 29 3b 0a 0a 23 69 66 20 49 53 5f  (pNew);..#if IS_
14580 56 58 57 4f 52 4b 53 0a 20 20 7b 0a 20 20 20 20  VXWORKS.  {.    
14590 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
145a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 61 6c  .    char *zReal
145b0 6e 61 6d 65 20 3d 20 76 78 72 65 61 6c 70 61 74  name = vxrealpat
145c0 68 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 31 29 3b  h(zFilename, 1);
145d0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
145e0 70 4e 65 77 2d 3e 7a 52 65 61 6c 70 61 74 68 20  pNew->zRealpath 
145f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  = 0;.    if( !zR
14600 65 61 6c 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ealname ){.     
14610 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
14620 45 4d 3b 0a 20 20 20 20 20 20 65 4c 6f 63 6b 69  EM;.      eLocki
14630 6e 67 53 74 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e  ngStyle = LOCKIN
14640 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20  G_STYLE_NONE;.  
14650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14660 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 61 6c 6e   = strlen(zRealn
14670 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ame) + 1;.      
14680 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
14690 20 20 20 20 70 45 6c 65 6d 20 3d 20 73 71 6c 69      pElem = sqli
146a0 74 65 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28  te3HashFindElem(
146b0 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52 65 61 6c  &nameHash, zReal
146c0 6e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  name, n);.      
146d0 69 66 28 20 70 45 6c 65 6d 20 29 7b 0a 20 20 20  if( pElem ){.   
146e0 20 20 20 20 20 6c 6f 6e 67 20 63 6e 74 20 3d 20       long cnt = 
146f0 28 6c 6f 6e 67 29 70 45 6c 65 6d 2d 3e 64 61 74  (long)pElem->dat
14700 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  a;.        cnt++
14710 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
14720 7a 52 65 61 6c 70 61 74 68 20 3d 20 70 45 6c 65  zRealpath = pEle
14730 6d 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 20 20 20  m->pKey;.       
14740 20 70 45 6c 65 6d 2d 3e 64 61 74 61 20 3d 20 28   pElem->data = (
14750 76 6f 69 64 2a 29 63 6e 74 3b 0a 20 20 20 20 20  void*)cnt;.     
14760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14770 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68 49  if( sqlite3HashI
14780 6e 73 65 72 74 28 26 6e 61 6d 65 48 61 73 68 2c  nsert(&nameHash,
14790 20 7a 52 65 61 6c 6e 61 6d 65 2c 20 6e 2c 20 28   zRealname, n, (
147a0 76 6f 69 64 2a 29 31 29 3d 3d 30 20 29 7b 0a 20  void*)1)==0 ){. 
147b0 20 20 20 20 20 20 20 20 20 70 45 6c 65 6d 20 3d           pElem =
147c0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
147d0 45 6c 65 6d 28 26 6e 61 6d 65 48 61 73 68 2c 20  Elem(&nameHash, 
147e0 7a 52 65 61 6c 6e 61 6d 65 2c 20 6e 29 3b 0a 20  zRealname, n);. 
147f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 6c           if( pEl
14800 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  em ){.          
14810 20 20 70 4e 65 77 2d 3e 7a 52 65 61 6c 70 61 74    pNew->zRealpat
14820 68 20 3d 20 70 45 6c 65 6d 2d 3e 70 4b 65 79 3b  h = pElem->pKey;
14830 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
14840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
14850 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
14860 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52 65 61 6c  &nameHash, zReal
14870 6e 61 6d 65 2c 20 6e 2c 20 30 29 3b 0a 20 20 20  name, n, 0);.   
14880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
14890 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
148a0 20 20 20 20 20 20 20 20 65 4c 6f 63 6b 69 6e 67          eLocking
148b0 53 74 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47 5f  Style = LOCKING_
148c0 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20  STYLE_NONE;.    
148d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
148e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
148f0 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
14900 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14910 28 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a 20 20 20  (zRealname);.   
14920 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
14930 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
14940 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     eLockingStyle
14950 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45   = LOCKING_STYLE
14960 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
14970 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c      eLockingStyl
14980 65 20 3d 20 64 65 74 65 63 74 4c 6f 63 6b 69 6e  e = detectLockin
14990 67 53 74 79 6c 65 28 70 56 66 73 2c 20 7a 46 69  gStyle(pVfs, zFi
149a0 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 7d 0a  lename, h);.  }.
149b0 0a 20 20 73 77 69 74 63 68 28 20 65 4c 6f 63 6b  .  switch( eLock
149c0 69 6e 67 53 74 79 6c 65 20 29 7b 0a 0a 20 20 20  ingStyle ){..   
149d0 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
149e0 59 4c 45 5f 50 4f 53 49 58 3a 20 7b 0a 20 20 20  YLE_POSIX: {.   
149f0 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b     enterMutex();
14a00 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a  .#if IS_VXWORKS.
14a10 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c        rc = findL
14a20 6f 63 6b 49 6e 66 6f 28 68 2c 20 70 4e 65 77 2d  ockInfo(h, pNew-
14a30 3e 7a 52 65 61 6c 70 61 74 68 2c 20 26 70 4e 65  >zRealpath, &pNe
14a40 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
14a50 3e 70 4f 70 65 6e 29 3b 0a 23 65 6c 73 65 0a 20  >pOpen);.#else. 
14a60 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f       rc = findLo
14a70 63 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d  ckInfo(h, &pNew-
14a80 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
14a90 4f 70 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Open);.#endif.  
14aa0 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
14ab0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14ac0 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
14ad0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
14ae0 53 54 59 4c 45 0a 0a 23 69 66 20 21 49 53 5f 56  STYLE..#if !IS_V
14af0 58 57 4f 52 4b 53 0a 20 20 20 20 63 61 73 65 20  XWORKS.    case 
14b00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46  LOCKING_STYLE_AF
14b10 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 46  P: {.      /* AF
14b20 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
14b30 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
14b40 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
14b50 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20  ncluded in.     
14b60 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
14b70 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 20  ngContext..     
14b80 20 2a 2f 0a 20 20 20 20 20 20 61 66 70 4c 6f 63   */.      afpLoc
14b90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
14ba0 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  x;.      pNew->l
14bb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
14bc0 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
14bd0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
14be0 43 74 78 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Ctx) );.      if
14bf0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
14c00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14c10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
14c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
14c30 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
14c40 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
14c50 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
14c60 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
14c70 20 20 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72          ** accor
14c80 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
14c90 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
14ca0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
14cb0 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 20  o make a.       
14cc0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
14cd0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
14ce0 20 20 20 20 20 70 43 74 78 2d 3e 66 69 6c 65 50       pCtx->fileP
14cf0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
14d00 0a 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  .        srandom
14d10 64 65 76 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dev();.      }. 
14d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
14d40 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  se LOCKING_STYLE
14d50 5f 44 4f 54 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _DOTFILE: {.    
14d60 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
14d70 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
14d80 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
14d90 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
14da0 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74  ed in.      ** t
14db0 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
14dc0 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 20 20  gContext .      
14dd0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
14de0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 20 20  LockFile;.      
14df0 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
14e00 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d       nFilename =
14e10 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d   strlen(zFilenam
14e20 65 29 20 2b 20 36 3b 0a 20 20 20 20 20 20 7a 4c  e) + 6;.      zL
14e30 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
14e40 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
14e50 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
14e60 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
14e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
14e80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14e90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14eb0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
14ec0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
14ed0 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e 61  s.lock", zFilena
14ee0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
14ef0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
14f00 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
14f10 69 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ile;.      break
14f20 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 49 53 5f  ;.    }..#if IS_
14f30 56 58 57 4f 52 4b 53 0a 20 20 20 20 63 61 73 65  VXWORKS.    case
14f40 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e   LOCKING_STYLE_N
14f50 41 4d 45 44 53 45 4d 3a 20 7b 0a 20 20 20 20 20  AMEDSEM: {.     
14f60 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
14f70 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
14f80 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
14f90 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
14fa0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  .      ** includ
14fb0 65 64 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 73  ed in the nameds
14fc0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
14fd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14fe0 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
14ff0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
15000 6b 49 6e 66 6f 28 68 2c 20 70 4e 65 77 2d 3e 7a  kInfo(h, pNew->z
15010 52 65 61 6c 70 61 74 68 2c 20 26 70 4e 65 77 2d  Realpath, &pNew-
15020 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
15030 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
15040 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
15050 20 26 26 20 28 70 4e 65 77 2d 3e 70 4f 70 65 6e   && (pNew->pOpen
15060 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
15070 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
15080 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
15090 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 3b  pOpen->aSemName;
150a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
150b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
150c0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
150d0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
150e0 20 22 25 73 2e 73 65 6d 22 2c 20 70 4e 65 77 2d   "%s.sem", pNew-
150f0 3e 7a 52 65 61 6c 70 61 74 68 29 3b 0a 20 20 20  >zRealpath);.   
15100 20 20 20 20 20 66 6f 72 28 20 6e 3d 30 3b 20 7a       for( n=0; z
15110 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
15120 29 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ).          if( 
15130 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
15140 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
15150 20 27 5f 27 3b 0a 20 20 20 20 20 20 20 20 70 4e   '_';.        pN
15160 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20  ew->pOpen->pSem 
15170 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
15180 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
15190 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  66, 1);.        
151a0 69 66 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d  if( pNew->pOpen-
151b0 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
151c0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
151d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
151e0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  EM;.          pN
151f0 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e  ew->pOpen->aSemN
15200 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
15210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15220 0a 20 20 20 20 20 20 6c 65 61 76 65 4d 75 74 65  .      leaveMute
15230 78 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  x();.      break
15240 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
15250 23 69 66 20 21 49 53 5f 56 58 57 4f 52 4b 53 0a  #if !IS_VXWORKS.
15260 20 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47      case LOCKING
15270 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 3a 20 0a 23  _STYLE_FLOCK: .#
15280 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 4c  endif.    case L
15290 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e  OCKING_STYLE_NON
152a0 45 3a 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  E: .      break;
152b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
152c0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
152d0 20 3d 20 30 3b 0a 23 69 66 20 49 53 5f 56 58 57   = 0;.#if IS_VXW
152e0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
152f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15300 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
15310 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
15320 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
15330 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65  >isDelete = isDe
15340 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  lete;.#endif.  i
15350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15360 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66   ){.    if( dirf
15370 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72  d>=0 ) close(dir
15380 66 64 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 68  fd);.    close(h
15390 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
153a0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
153b0 26 61 49 6f 4d 65 74 68 6f 64 5b 65 4c 6f 63 6b  &aIoMethod[eLock
153c0 69 6e 67 53 74 79 6c 65 2d 31 5d 3b 0a 20 20 20  ingStyle-1];.   
153d0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
153e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
153f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
15400 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
15410 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
15420 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
15430 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
15440 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
15450 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
15460 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
15470 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
15480 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
15490 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
154a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
154b0 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
154c0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
154d0 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
154e0 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
154f0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
15500 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
15510 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
15520 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
15530 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
15540 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
15550 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
15560 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
15570 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
15580 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
15590 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
155a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
155b0 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
155c0 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
155d0 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
155e0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
155f0 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
15600 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
15610 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
15620 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
15630 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 73 74 72  e);.  for(ii=str
15640 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
15650 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61 6d 65  i>=0 && zDirname
15660 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
15670 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
15680 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
15690 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
156a0 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  = open(zDirname,
156b0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
156c0 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
156d0 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
156e0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
156f0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
15700 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
15710 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
15720 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
15730 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22        OSTRACE3("
15740 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
15750 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
15760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
15770 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
15780 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
15790 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f  _OK:SQLITE_CANTO
157a0 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  PEN);.}../*.** C
157b0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
157c0 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
157d0 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
157e0 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
157f0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
15800 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
15810 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
15820 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
15830 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
15840 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
15850 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
15860 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
15870 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
15880 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
15890 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
158a0 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
158b0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
158c0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
158d0 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
158e0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
158f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15900 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
15910 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
15920 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
15930 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
15940 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
15950 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
15960 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
15970 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
15980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
15990 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74   = ".";..  /* It
159a0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
159b0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
159c0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
159d0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
159e0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
159f0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
15a00 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
15a10 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
15a20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
15a30 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
15a40 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
15a50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
15a60 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61  TE_IOERR );..  a
15a70 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
15a80 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
15a90 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
15aa0 41 72 72 61 79 53 69 7a 65 28 61 7a 44 69 72 73  ArraySize(azDirs
15ab0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
15ac0 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20   azDirs[i]==0 ) 
15ad0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15ae0 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d  ( stat(azDirs[i]
15af0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
15b00 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
15b10 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
15b20 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
15b30 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44    if( access(azD
15b40 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f  irs[i], 07) ) co
15b50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72  ntinue;.    zDir
15b60 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20   = azDirs[i];.  
15b70 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15b80 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
15b90 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
15ba0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
15bb0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
15bc0 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
15bd0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
15be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15bf0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
15c00 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
15c10 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
15c20 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
15c30 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f   + 17) >= (size_
15c40 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  t)nBuf ){.    re
15c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
15c60 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
15c70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15c80 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66  tf(nBuf-17, zBuf
15c90 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
15ca0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
15cb0 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73  zDir);.    j = s
15cc0 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
15cd0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
15ce0 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
15cf0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
15d00 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
15d10 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
15d20 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
15d30 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
15d40 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
15d50 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
15d60 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
15d70 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61  = 0;.  }while( a
15d80 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
15d90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
15da0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
15db0 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
15dc0 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
15dd0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
15de0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
15df0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
15e00 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
15e10 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
15e20 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
15e30 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
15e40 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
15e50 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
15e60 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
15e70 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
15e80 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
15e90 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
15ea0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
15eb0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
15ec0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
15ed0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
15ee0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
15ef0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
15f00 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
15f10 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
15f20 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
15f30 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
15f40 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
15f50 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
15f60 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
15f70 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
15f80 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
15f90 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
15fa0 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
15fb0 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
15fc0 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
15fd0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
15fe0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
15ff0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
16000 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
16010 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
16020 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
16030 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
16040 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
16050 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
16060 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
16070 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
16080 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
16090 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
160a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
160b0 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
160c0 20 2a 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c 69   *zPath, .  sqli
160d0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
160e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20  .  int flags,.  
160f0 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29  int *pOutFlags.)
16100 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 20  {.  int fd = 0; 
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
16130 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
16140 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
16150 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16170 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
16180 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
16190 6e 74 20 6f 66 6c 61 67 73 20 3d 20 30 3b 20 20  nt oflags = 0;  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161b0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
161c0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
161d0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
161e0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
161f0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
16200 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
16210 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16230 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
16240 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 0a   primitives */..
16250 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
16260 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
16270 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16280 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
16290 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
162a0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
162b0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
162c0 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
162d0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
162e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
162f0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
16300 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
16310 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16320 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
16330 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
16340 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16350 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 20  N_READWRITE);.. 
16360 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
16370 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
16380 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
16390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
163a0 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
163b0 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
163c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
163d0 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
163e0 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
163f0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
16400 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
16410 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
16420 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
16430 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
16440 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65    int isOpenDire
16450 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74  ctory = (isCreat
16460 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54 79  e && .      (eTy
16470 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
16480 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
16490 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
164a0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
164b0 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  L).  );..  /* If
164c0 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
164d0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
164e0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
164f0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
16500 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
16510 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
16520 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
16530 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
16540 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
16550 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
16560 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63  PATHNAME+1];.  c
16570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
16580 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
16590 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
165a0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
165b0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
165c0 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
165d0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
165e0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
165f0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
16600 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
16610 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
16620 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
16630 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
16640 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
16650 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
16660 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
16670 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
16680 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
16690 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
166a0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
166b0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
166c0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
166d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
166e0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
166f0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
16700 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
16710 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
16720 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
16730 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
16740 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
16750 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
16760 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
16770 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
16780 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
16790 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
167a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61   main journal, a
167b0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
167c0 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f  l are never auto
167d0 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64  matically.  ** d
167e0 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73  eleted.  */.  as
167f0 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c  sert( eType!=SQL
16800 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
16810 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b   || !isDelete );
16820 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
16830 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
16840 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69  IN_JOURNAL || !i
16850 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73  sDelete );.  ass
16860 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
16870 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
16880 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c  OURNAL || !isDel
16890 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  ete );..  /* Ass
168a0 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
168b0 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
168c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
168d0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
168e0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
168f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
16900 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
16910 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
16920 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
16930 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
16940 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
16950 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
16960 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
16970 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
16980 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
16990 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
169a0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
169b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
169c0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
169d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
169e0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
169f0 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  DB.  );..  memse
16a00 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
16a10 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
16a20 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a    if( !zName ){.
16a30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
16a40 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
16a50 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
16a60 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ory);.    rc = g
16a70 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
16a80 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
16a90 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
16aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16ab0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16ac0 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
16ad0 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
16ae0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
16af0 79 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f  y )  oflags |= O
16b00 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
16b10 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c  sReadWrite ) ofl
16b20 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
16b30 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
16b40 20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43     oflags |= O_C
16b50 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
16b60 63 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73  clusive ) oflags
16b70 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
16b80 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67  FOLLOW);.  oflag
16b90 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
16ba0 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
16bb0 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c  fd = open(zName,
16bc0 20 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74   oflags, isDelet
16bd0 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
16be0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
16bf0 53 53 49 4f 4e 53 29 3b 0a 20 20 4f 53 54 52 41  SSIONS);.  OSTRA
16c00 43 45 34 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE4("OPENX   %-3
16c10 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
16c20 20 7a 4e 61 6d 65 2c 20 6f 66 6c 61 67 73 29 3b   zName, oflags);
16c30 0a 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65  .  if( fd<0 && e
16c40 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
16c50 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
16c60 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
16c70 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
16c80 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
16c90 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
16ca0 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
16cb0 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  ly. */.    flags
16cc0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
16cd0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
16ce0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
16cf0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
16d00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16d10 4c 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  LY;.    return u
16d20 6e 69 78 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50  nixOpen(pVfs, zP
16d30 61 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67  ath, pFile, flag
16d40 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  s, pOutFlags);. 
16d50 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
16d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16d70 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
16d80 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
16d90 29 7b 0a 23 69 66 20 49 53 5f 56 58 57 4f 52 4b  ){.#if IS_VXWORK
16da0 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
16db0 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  ame;.#else.    u
16dc0 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65  nlink(zName);.#e
16dd0 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70  ndif.  }.  if( p
16de0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
16df0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
16e00 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  gs;.  }..  asser
16e10 74 28 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20  t(fd!=0);.  if( 
16e20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
16e30 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
16e40 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
16e50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
16e60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  _OK ){.      clo
16e80 73 65 28 66 64 29 3b 0a 20 20 20 20 20 20 72 65  se(fd);.      re
16e90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16ea0 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c   }..#ifdef FD_CL
16eb0 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 66 64  OEXEC.  fcntl(fd
16ec0 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
16ed0 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
16ee0 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
16ef0 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
16f00 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
16f10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20  _OPEN_MAIN_DB;. 
16f20 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e   return fillInUn
16f30 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
16f40 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a   dirfd, pFile, z
16f50 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73  Path, noLock, is
16f60 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Delete);.}../*.*
16f70 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
16f80 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
16f90 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
16fa0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
16fb0 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
16fc0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
16fd0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
16fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
16ff0 78 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  xDelete(sqlite3_
17000 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
17010 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
17020 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20   int dirSync){. 
17030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17040 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
17050 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
17060 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
17070 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
17080 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
17090 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29  .  unlink(zPath)
170a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
170b0 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
170c0 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
170d0 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
170e0 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
170f0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
17100 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 49  LITE_OK ){.#if I
17120 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
17130 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
17140 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
17150 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
17160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
17170 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17180 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
17190 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
171a0 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
171b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
171c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
171d0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69  .** Test the exi
171e0 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63  stance of or acc
171f0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ess permissions 
17200 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54  of file zPath. T
17210 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f  he.** test perfo
17220 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rmed depends on 
17230 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61  the value of fla
17240 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  gs:.**.**     SQ
17250 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
17260 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TS: Return 1 if 
17270 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a  the file exists.
17280 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
17290 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20  CESS_READWRITE: 
172a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
172b0 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64  file is read and
172c0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20   writable..**   
172d0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
172e0 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e  READONLY: Return
172f0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
17300 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a  s readable..**.*
17310 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
17320 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
17330 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a  int unixAccess(.
17340 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
17350 6f 74 55 73 65 64 2c 20 0a 20 20 63 6f 6e 73 74  otUsed, .  const
17360 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
17370 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
17380 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
17390 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a   int amode = 0;.
173a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
173b0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
173c0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
173d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
173e0 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
173f0 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
17400 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
17410 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
17420 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46  .      amode = F
17430 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
17440 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
17450 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
17460 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TE:.      amode 
17470 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20  = W_OK|R_OK;.   
17480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17490 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
174a0 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f  _READ:.      amo
174b0 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20  de = R_OK;.     
174c0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
174d0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
174e0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
174f0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
17500 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
17510 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61  (access(zPath, a
17520 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74  mode)==0);.  ret
17530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17540 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
17550 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
17560 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
17570 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
17580 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
17590 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
175a0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
175b0 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
175c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
175d0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
175e0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
175f0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
17600 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
17610 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
17620 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
17630 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
17640 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
17650 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
17660 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
17670 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
17680 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17690 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
176a0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
176b0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
176c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
176d0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
176e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
176f0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
17700 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
17710 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
17720 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
17750 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
17760 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
17770 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
17780 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
17790 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
177a0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
177b0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
177c0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
177d0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
177e0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
177f0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
17800 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
17810 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
17820 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
17830 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
17840 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
17850 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
17860 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
17870 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
17880 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6c 79 20  orking directly 
17890 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
178a0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
178b0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
178c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
178d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
178e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
178f0 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 0a  AX_PATHNAME );..
17900 23 69 66 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20  #if IS_VXWORKS. 
17910 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65   {.    char *zRe
17920 61 6c 6e 61 6d 65 20 3d 20 76 78 72 65 61 6c 70  alname = vxrealp
17930 61 74 68 28 7a 50 61 74 68 2c 20 30 29 3b 0a 20  ath(zPath, 0);. 
17940 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 27 5c 30     zOut[0] = '\0
17950 27 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 65 61  ';.    if( !zRea
17960 6c 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 72  lname ){.      r
17970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
17980 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
17990 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
179a0 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
179b0 73 22 2c 20 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a  s", zRealname);.
179c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
179d0 28 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a 20 20 20  (zRealname);.   
179e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
179f0 4b 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7a  K;.  }.#else.  z
17a00 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c  Out[nOut-1] = '\
17a10 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  0';.  if( zPath[
17a20 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
17a30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
17a40 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
17a50 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  , zPath);.  }els
17a60 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b  e{.    int nCwd;
17a70 0a 20 20 20 20 69 66 28 20 67 65 74 63 77 64 28  .    if( getcwd(
17a80 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
17a90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17aa0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
17ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
17ac0 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b   = strlen(zOut);
17ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
17ae0 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
17af0 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
17b00 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
17b10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17b20 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  _OK;..#if 0.  /*
17b30 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e  .  ** Remove "/.
17b40 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
17b50 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41   and convert "/A
17b60 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e  /./" path elemen
17b70 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20  ts.  ** to just 
17b80 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  "/"..  */.  if( 
17b90 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74  zFull ){.    int
17ba0 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69   i, j;.    for(i
17bb0 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20  =j=0; zFull[i]; 
17bc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
17bd0 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b  zFull[i]=='/' ){
17be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75  .        if( zFu
17bf0 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63  ll[i+1]=='/' ) c
17c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
17c10 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
17c20 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
17c30 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  2]=='/' ){.     
17c40 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
17c50 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
17c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17c70 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31     if( zFull[i+1
17c80 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
17c90 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+2]=='.' && zFu
17ca0 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a  ll[i+3]=='/' ){.
17cb0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
17cc0 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d   j>0 && zFull[j-
17cd0 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
17ce0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  }.          i +=
17cf0 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   3;.          co
17d00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
17d10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
17d20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75  zFull[j++] = zFu
17d30 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ll[i];.    }.   
17d40 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20   zFull[j] = 0;. 
17d50 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   }.#endif.#endif
17d60 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
17d70 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
17d80 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
17d90 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
17da0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
17db0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
17dc0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
17dd0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
17de0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
17df0 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
17e00 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
17e10 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
17e20 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
17e30 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
17e40 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
17e50 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
17e60 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
17e70 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
17e80 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
17e90 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
17ea0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
17eb0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
17ec0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
17ed0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
17ee0 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
17ef0 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
17f00 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
17f10 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
17f20 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
17f30 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
17f40 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
17f50 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
17f60 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
17f70 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
17f80 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
17f90 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
17fa0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
17fb0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
17fc0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
17fd0 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
17fe0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
17ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
18000 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
18010 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
18020 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
18030 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20  BufOut){.  char 
18040 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
18050 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
18060 64 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  d);.  enterMutex
18070 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
18080 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
18090 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
180a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
180b0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
180c0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61  zErr);.  }.  lea
180d0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
180e0 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
180f0 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
18100 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
18110 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63  pHandle, const c
18120 68 61 72 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20  har*zSymbol){.  
18130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18140 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
18150 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c  urn dlsym(pHandl
18160 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73  e, zSymbol);.}.s
18170 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
18180 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
18190 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
181a0 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
181b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
181c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
181d0 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
181e0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
181f0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
18200 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
18210 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
18220 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
18230 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
18240 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
18250 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
18260 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
18270 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
18280 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
18290 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
182a0 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
182b0 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
182c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
182d0 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
182e0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
182f0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
18300 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
18310 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
18320 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
18330 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
18340 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
18350 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
18360 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
18370 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
18380 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
18390 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
183a0 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
183b0 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
183c0 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
183d0 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
183e0 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
183f0 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
18400 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
18410 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
18420 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
18430 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
18440 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
18450 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
18460 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
18470 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
18480 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
18490 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
184a0 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
184b0 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
184c0 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
184d0 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
184e0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
184f0 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
18500 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
18510 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
18520 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
18530 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
18540 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
18550 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
18560 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
18570 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
18580 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
18590 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
185a0 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
185b0 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
185c0 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
185d0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
185e0 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
185f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
18600 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
18610 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
18620 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  = open("/dev/ura
18630 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  ndom", O_RDONLY)
18640 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
18650 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
18660 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
18670 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
18680 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
18690 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
186a0 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
186b0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
186c0 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
186d0 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
186e0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
186f0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
18700 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
18710 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
18720 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
18730 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
18740 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d  se{.      nBuf =
18750 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20   read(fd, zBuf, 
18760 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f  nBuf);.      clo
18770 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
18780 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
18790 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
187a0 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
187b0 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
187c0 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
187d0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
187e0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
187f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
18800 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
18810 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
18820 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
18830 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
18840 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
18850 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
18860 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
18870 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
18880 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
18890 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
188a0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
188b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
188c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
188d0 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
188e0 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
188f0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
18900 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
18910 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
18920 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
18930 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 49  oseconds){.#if I
18940 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
18950 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
18960 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
18970 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
18980 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
18990 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
189a0 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
189b0 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
189c0 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
189d0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
189e0 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
189f0 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
18a00 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
18a10 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
18a20 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e  conds);.  return
18a30 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
18a40 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
18a50 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
18a60 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
18a70 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
18a80 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  nds);.  return s
18a90 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
18aa0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
18ab0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
18ac0 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  d);.}../*.** The
18ad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
18ae0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
18af0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
18b00 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
18b10 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
18b20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
18b30 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
18b40 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
18b50 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
18b60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
18b70 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
18b80 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
18b90 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
18ba0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
18bb0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
18bc0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
18bd0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
18be0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
18bf0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
18c00 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
18c10 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
18c20 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
18c30 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
18c40 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
18c50 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
18c60 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
18c70 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
18c80 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75  fs *NotUsed, dou
18c90 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66  ble *prNow){.#if
18ca0 20 49 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   IS_VXWORKS.  st
18cb0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
18cc0 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
18cd0 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
18ce0 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
18cf0 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35  rNow = 2440587.5
18d00 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38   + sNow.tv_sec/8
18d10 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76  6400.0 + sNow.tv
18d20 5f 6e 73 65 63 2f 38 36 34 30 30 30 30 30 30 30  _nsec/8640000000
18d30 30 30 30 30 2e 30 3b 0a 23 65 6c 69 66 20 64 65  0000.0;.#elif de
18d40 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
18d50 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
18d60 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f  ime(&t);.  *prNo
18d70 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20  w = t/86400.0 + 
18d80 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65  2440587.5;.#else
18d90 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
18da0 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
18db0 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
18dc0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
18dd0 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
18de0 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
18df0 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30  Now.tv_usec/8640
18e00 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69  0000000.0;.#endi
18e10 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18e20 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
18e30 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
18e40 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
18e50 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
18e60 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
18e70 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
18e80 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
18e90 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
18ea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
18eb0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
18ec0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
18ed0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
18ee0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
18ef0 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
18f00 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
18f10 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
18f20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
18f30 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
18f40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18f50 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
18f60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18f70 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
18f80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18f90 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69   interface..*/.i
18fa0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
18fb0 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20  it(void){ .  /* 
18fc0 4d 61 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20  Macro to define 
18fd0 74 68 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65  the static conte
18fe0 6e 74 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  nts of an sqlite
18ff0 33 5f 76 66 73 20 73 74 72 75 63 74 75 72 65 20  3_vfs structure 
19000 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69  for.  ** the uni
19010 78 20 62 61 63 6b 65 6e 64 2e 20 54 68 65 20 74  x backend. The t
19020 77 6f 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  wo parameters ar
19030 65 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  e the values to 
19040 75 73 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  use for.  ** the
19050 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61   sqlite3_vfs.zNa
19060 6d 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 76  me and sqlite3_v
19070 66 73 2e 70 41 70 70 44 61 74 61 20 66 69 65 6c  fs.pAppData fiel
19080 64 73 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ds, respectively
19090 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23  ..  ** .  */.  #
190a0 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 7a  define UNIXVFS(z
190b0 56 66 73 4e 61 6d 65 2c 20 70 56 66 73 41 70 70  VfsName, pVfsApp
190c0 44 61 74 61 29 20 7b 20 20 20 20 20 20 20 20 20  Data) {         
190d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31           \.    1
190e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
190f0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
19100 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19110 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
19120 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
19130 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
19140 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19150 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
19160 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
19170 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
19180 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19190 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
191b0 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 5c 0a 20 20 20 20 7a 56 66 73 4e 61 6d 65 2c   \.    zVfsName,
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
191f0 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19210 0a 20 20 20 20 28 76 6f 69 64 20 2a 29 70 56 66  .    (void *)pVf
19220 73 41 70 70 44 61 74 61 2c 20 20 2f 2a 20 70 41  sAppData,  /* pA
19230 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19250 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
19260 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
19270 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
19280 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19290 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
192a0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
192b0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
192c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
192d0 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
192e0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
192f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19300 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
19310 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
19320 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
19330 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
19340 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
19350 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
19360 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
19390 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
193a0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
193d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
193e0 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19400 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
19410 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
19420 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19440 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
19450 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
19460 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
19470 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19480 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
19490 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
194a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
194b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
194c0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
194d0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
194e0 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
194f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
19500 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  xGetLastError   
19510 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
19520 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
19530 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 73 74       \.  }..  st
19540 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
19550 20 75 6e 69 78 56 66 73 20 3d 20 55 4e 49 58 56   unixVfs = UNIXV
19560 46 53 28 22 75 6e 69 78 22 2c 20 30 29 3b 0a 23  FS("unix", 0);.#
19570 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
19580 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
19590 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
195a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
195b0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 55 4e 49 58  s[] = {.    UNIX
195c0 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22  VFS("unix-posix"
195d0 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ,   LOCKING_STYL
195e0 45 5f 50 4f 53 49 58 29 2c 20 0a 20 20 20 20 55  E_POSIX), .    U
195f0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70  NIXVFS("unix-afp
19600 22 2c 20 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53  ",     LOCKING_S
19610 54 59 4c 45 5f 41 46 50 29 2c 20 0a 20 20 20 20  TYLE_AFP), .    
19620 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c  UNIXVFS("unix-fl
19630 6f 63 6b 22 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f  ock",   LOCKING_
19640 53 54 59 4c 45 5f 46 4c 4f 43 4b 29 2c 20 0a 20  STYLE_FLOCK), . 
19650 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
19660 2d 64 6f 74 66 69 6c 65 22 2c 20 4c 4f 43 4b 49  -dotfile", LOCKI
19670 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45  NG_STYLE_DOTFILE
19680 29 2c 20 0a 20 20 20 20 55 4e 49 58 56 46 53 28  ), .    UNIXVFS(
19690 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20  "unix-none",    
196a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f  LOCKING_STYLE_NO
196b0 4e 45 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  NE),.    UNIXVFS
196c0 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22  ("unix-namedsem"
196d0 2c 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e  ,LOCKING_STYLE_N
196e0 41 4d 45 44 53 45 4d 29 2c 0a 20 20 7d 3b 0a 20  AMEDSEM),.  };. 
196f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a   for(i=0; i<(siz
19700 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66  eof(aVfs)/sizeof
19710 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20  (sqlite3_vfs)); 
19720 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
19730 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
19740 61 56 66 73 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d  aVfs[i], 0);.  }
19750 0a 23 65 6e 64 69 66 0a 23 69 66 20 49 53 5f 56  .#endif.#if IS_V
19760 58 57 4f 52 4b 53 0a 20 20 73 71 6c 69 74 65 33  XWORKS.  sqlite3
19770 48 61 73 68 49 6e 69 74 28 26 6e 61 6d 65 48 61  HashInit(&nameHa
19780 73 68 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  sh, 1);.#endif. 
19790 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
197a0 69 73 74 65 72 28 26 75 6e 69 78 56 66 73 2c 20  ister(&unixVfs, 
197b0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
197c0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
197d0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f  * Shutdown the o
197e0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
197f0 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73 20  interface. This 
19800 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75  is a no-op for u
19810 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nix..*/.int sqli
19820 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
19830 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
19840 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64  TE_OK; .}. .#end
19850 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
19860 55 4e 49 58 20 2a 2f 0a                          UNIX */.