/ Hex Artifact Content
Login

Artifact d8555013e65f0e7ba110823b4b9e7a18080185f5:


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 33 20 32 30 30 38 2f 31 31 2f 31 39 20 31 31  13 2008/11/19 11
01e0: 3a 33 35 3a 34 30 20 64 61 6e 69 65 6c 6b 31 39  :35:40 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: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
09b0: 74 6c 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65  tl.h>.#if define
09c0: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
09d0: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
09e0: 4c 29 0a 23 64 65 66 69 6e 65 20 6c 73 74 61 74  L).#define lstat
09f0: 20 73 74 61 74 0a 23 69 6e 63 6c 75 64 65 20 3c   stat.#include <
0a00: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 69 6e  semaphore.h>.#in
0a10: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0a20: 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20  .#else.#include 
0a30: 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69  <sys/param.h>.#i
0a40: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e  nclude <sys/moun
0a50: 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64  t.h>.#endif.#end
0a60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
0a70: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0a80: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77  E */../*.** If w
0a90: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
0aa0: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
0ab0: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
0ac0: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
0ad0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
0ae0: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
0af0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0b00: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
0b10: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
0b20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0b30: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
0b40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0b50: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
0b60: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
0b70: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
0b80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
0b90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
0ba0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
0bb0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
0bc0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
0bd0: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  644.#endif../*.*
0be0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
0bf0: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
0c00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
0c10: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f  PATHNAME 512.../
0c20: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
0c30: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
0c40: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
0c50: 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63  e3_file specific
0c60: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a 2a   for the unix.**
0c70: 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61 79   protability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75  truct unixFile u
0ca0: 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  nixFile;.struct 
0cb0: 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c  unixFile {.  sql
0cc0: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
0cd0: 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20  const *pMethod; 
0ce0: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
0cf0: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 23 69  irst entry */.#i
0d00: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0d10: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
0d20: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
0d30: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
0d40: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
0d50: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
0d60: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
0d70: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
0d80: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
0d90: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
0da0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
0db0: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0dc0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
0dd0: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
0de0: 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20  t all open fd's 
0df0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
0e00: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
0e10: 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20  fo *pLock;   /* 
0e20: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
0e30: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
0e40: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
0e50: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0e60: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
0e70: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
0e80: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
0e90: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
0ea0: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 68 3b  .#endif.  int h;
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
0ed0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
0ee0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f  unsigned char lo
0ef0: 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54 68 65  cktype;   /* The
0f00: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
0f10: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
0f20: 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20 20  .  int dirfd;   
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
0f50: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
0f60: 79 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  y */.#if SQLITE_
0f70: 54 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68  THREADSAFE.  pth
0f80: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0f90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0fa0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0fb0: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
0fc0: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6c  /.#endif.  int l
0fd0: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
0fe0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78       /* The unix
0ff0: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
1000: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1010: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1020: 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  RTP__) || define
1030: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
1040: 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20   int isDelete;  
1050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1060: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
1070: 20 74 72 75 65 20 2a 2f 0a 20 20 63 68 61 72 20   true */.  char 
1080: 2a 7a 52 65 61 6c 70 61 74 68 3b 0a 23 65 6e 64  *zRealpath;.#end
1090: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  if.};../*.** Inc
10a0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
10b0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
10c0: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
10d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
10e0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
10f0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
1100: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
1110: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
1120: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
1130: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
1140: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
1150: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
1160: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
1170: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
1180: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
1190: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
11a0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
11b0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
11c0: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
11d0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
11e0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
11f0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
1200: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1210: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
1220: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
1230: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
1240: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
1250: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
1260: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
1270: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
1280: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1290: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
12a0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
12b0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
12c0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
12d0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
12e0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
12f0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1300: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1310: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1320: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
1330: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
1340: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
1350: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
1360: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
1370: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
1380: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1390: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
13a0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
13b0: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
13c0: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
13d0: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
13e0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
13f0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1400: 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68   Set or check th
1410: 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64 20 66  e unixFile.tid f
1420: 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c  ield.  This fiel
1430: 64 20 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e  d is set when an
1440: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20   unixFile.** is 
1450: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41  first opened.  A
1460: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75 73  ll subsequent us
1470: 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  es of the unixFi
1480: 6c 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74  le verify that t
1490: 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61  he.** same threa
14a0: 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f  d is operating o
14b0: 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 20  n the unixFile. 
14c0: 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
14d0: 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f  systems do.** no
14e0: 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f  t allow locks to
14f0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
1500: 79 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  y other threads 
1510: 61 6e 64 20 74 68 61 74 20 72 65 73 74 72 69 63  and that restric
1520: 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  tion.** means th
1530: 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61  at sqlite3* data
1540: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63 61 6e  base handles can
1550: 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  not be moved fro
1560: 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20  m one thread.** 
1570: 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 54 68 69  to another.  Thi
1580: 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73 20 73 75  s logic makes su
1590: 72 65 20 61 20 75 73 65 72 20 64 6f 65 73 20 6e  re a user does n
15a0: 6f 74 20 74 72 79 20 74 6f 20 64 6f 20 74 68 61  ot try to do tha
15b0: 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e  t.** by mistake.
15c0: 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33  .**.** Version 3
15d0: 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d 31 35  .3.1 (2006-01-15
15e0: 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63 61 6e  ):  unixFile can
15f0: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
1600: 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20  ne thread to.** 
1610: 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20  another as long 
1620: 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  as we are runnin
1630: 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 68  g on a system th
1640: 61 74 20 73 75 70 70 6f 72 74 73 20 74 68 72 65  at supports thre
1650: 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e  ads.** overridin
1660: 67 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  g each others lo
1670: 63 6b 73 20 28 77 68 69 63 68 20 6e 6f 77 20 74  cks (which now t
1680: 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62  he most common b
1690: 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69  ehavior).** or i
16a0: 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68  f no locks are h
16b0: 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e  eld.  But the un
16c0: 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65  ixFile.pLock fie
16d0: 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a  ld needs to be.*
16e0: 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63  * recomputed bec
16f0: 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63  ause its key inc
1700: 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64  ludes the thread
1710: 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a  -id.  See the .*
1720: 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  * transferOwners
1730: 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  hip() function b
1740: 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f  elow for additio
1750: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  nal information.
1760: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
1770: 52 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e  READSAFE.# defin
1780: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
1790: 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70  )   (X)->tid = p
17a0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20  thread_self().# 
17b0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52  define CHECK_THR
17c0: 45 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64  EADID(X) (thread
17d0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
17e0: 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c  ersLocks==0 && \
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74               !pt
1810: 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d  hread_equal((X)-
1820: 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65  >tid, pthread_se
1830: 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64  lf())).#else.# d
1840: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
1850: 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43  ID(X).# define C
1860: 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29  HECK_THREADID(X)
1870: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1880: 20 48 65 72 65 20 69 73 20 74 68 65 20 64 69 72   Here is the dir
1890: 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73  t on POSIX advis
18a0: 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49  ory locks:  ANSI
18b0: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
18c0: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
18d0: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
18e0: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
18f0: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
1900: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
1910: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
1920: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
1930: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
1940: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
1950: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
1960: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
1970: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
1980: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
1990: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
19a0: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
19b0: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
19c0: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
19d0: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
19e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
19f0: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
1a00: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 20 20 20  test case:.**   
1a10: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
1a20: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
1a30: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
1a40: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
1a50: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
1a60: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
1a70: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
1a80: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
1a90: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
1aa0: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
1ab0: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
1ac0: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
1ad0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
1ae0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
1af0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
1b00: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
1b10: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
1b20: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
1b30: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
1b40: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
1b50: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
1b60: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
1b70: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
1b80: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
1b90: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
1ba0: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
1bb0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1bc0: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
1bd0: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
1be0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
1bf0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
1c00: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
1c10: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
1c20: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
1c30: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
1c40: 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79  ** Bummer.  If y
1c50: 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20  ou ask me, this 
1c60: 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c  is broken.  Badl
1c70: 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65  y broken.  It me
1c80: 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63  ans.** that we c
1c90: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
1ca0: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
1cb0: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
1cc0: 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74   among.** compet
1cd0: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
1ce0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
1cf0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
1d00: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
1d10: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
1d20: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
1d30: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
1d40: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
1d50: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
1d60: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
1d70: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
1d80: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
1d90: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
1da0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
1db0: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
1dc0: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
1dd0: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
1de0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1df0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
1e00: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
1e10: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
1e20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e30: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
1e40: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
1e50: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
1e60: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
1e70: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
1e80: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
1e90: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
1ea0: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
1eb0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
1ec0: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
1ed0: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
1ee0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
1ef0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
1f00: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
1f10: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
1f20: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
1f30: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
1f40: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
1f50: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
1f60: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
1f70: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
1f80: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
1f90: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
1fa0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
1fb0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
1fc0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
1fd0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
1fe0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
1ff0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
2000: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
2010: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
2020: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
2030: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
2040: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
2050: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
2060: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2070: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
2080: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
2090: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
20a0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
20b0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
20c0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
20d0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
20e0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
20f0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
2100: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
2110: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
2120: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
2130: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
2140: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
2150: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
2160: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
2170: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
2180: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
2190: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
21a0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
21b0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
21c0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
21d0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
21e0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
21f0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
2200: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
2210: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
2220: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
2230: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
2240: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
2250: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
2260: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
2270: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
2280: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
2290: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
22a0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
22b0: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
22c0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
22d0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
22e0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
22f0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
2300: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
2310: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ate..**.** 2004-
2320: 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20  Jan-11:.** More 
2330: 72 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69  recent discoveri
2340: 65 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61  es about POSIX a
2350: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20  dvisory locks.  
2360: 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64  (The more.** I d
2370: 69 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72  iscover, the mor
2380: 65 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20  e I realize the 
2390: 61 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  a POSIX advisory
23a0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e   locks are.** an
23b0: 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a   abomination.).*
23c0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
23d0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
23e0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
23f0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
2400: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
2410: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
2420: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
2430: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
2440: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
2450: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
2460: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
2470: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
2480: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2490: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70   contains.** a p
24a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65  ointer to an ope
24b0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  nCnt structure. 
24c0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70   There is one op
24d0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a  enCnt structure.
24e0: 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64  ** per open inod
24f0: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  e, which means t
2500: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69  hat multiple uni
2510: 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20  xFile can point 
2520: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
2530: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2540: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2550: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
2560: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
2570: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
2580: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
2590: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
25a0: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
25b0: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
25c0: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
25d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
25e0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
25f0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
2600: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
2610: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
2620: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
2630: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
2640: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
2650: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
2660: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
2670: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
2680: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
2690: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
26a0: 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75  ..**.** First, u
26b0: 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 61  nder Linux threa
26c0: 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 68  ds, because each
26d0: 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73 65   thread has a se
26e0: 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73  parate.** proces
26f0: 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61  s ID, lock opera
2700: 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72  tions in one thr
2710: 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72  ead do not overr
2720: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20  ide locks.** to 
2730: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e  the same file in
2740: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e 20   other threads. 
2750: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 62   Linux threads b
2760: 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65  ehave like.** se
2770: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
2780: 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74   in this respect
2790: 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 63  .  But, if you c
27a0: 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lose a file.** d
27b0: 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e  escriptor in lin
27c0: 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c 20  ux threads, all 
27d0: 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 65  locks are cleare
27e0: 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a  d, even locks.**
27f0: 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   on other thread
2800: 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 67  s and even thoug
2810: 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65  h the other thre
2820: 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72 65  ads have differe
2830: 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44  nt.** process ID
2840: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2850: 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  s is inconsisten
2860: 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63  t in this respec
2870: 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e  t..** (I'm begin
2880: 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 68  ning to think th
2890: 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  at linux threads
28a0: 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69   is an abominati
28b0: 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20  on too.).** The 
28c0: 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 74  consequence of t
28d0: 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 20  his all is that 
28e0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 66  the hash table f
28f0: 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a  or the lockInfo.
2900: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 73  ** structure has
2910: 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2920: 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 61  process id as pa
2930: 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 65  rt of its key be
2940: 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69  cause.** locks i
2950: 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  n different thre
2960: 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64 20  ads are treated 
2970: 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 75  as distinct.  Bu
2980: 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e  t the .** openCn
2990: 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  t structure shou
29a0: 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  ld not include t
29b0: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 6e  he process id in
29c0: 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61   its.** key beca
29d0: 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 61  use close() clea
29e0: 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74  rs lock on all t
29f0: 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74  hreads, not just
2a00: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2a10: 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 74  thread.  Were it
2a20: 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 6f   not for this go
2a30: 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78  ofiness in linux
2a40: 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f 75   threads, we cou
2a50: 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68  ld.** combine th
2a60: 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  e lockInfo and o
2a70: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2a80: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2a90: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2aa0: 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a   2004-Jun-28:.**
2ab0: 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   On some version
2ac0: 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72 65  s of linux, thre
2ad0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
2ae0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
2af0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73  ks..** On others
2b00: 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73   not.  Sometimes
2b10: 20 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20   you can change 
2b20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e 20  the behavior on 
2b30: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74  the same.** syst
2b40: 65 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  em by setting th
2b50: 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e  e LD_ASSUME_KERN
2b60: 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  EL environment v
2b70: 61 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  ariable.  The.**
2b80: 20 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64 20   POSIX standard 
2b90: 69 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f 20  is silent as to 
2ba0: 77 68 69 63 68 20 62 65 68 61 76 69 6f 72 20 69  which behavior i
2bb0: 73 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66 61  s correct, as fa
2bc0: 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74 65  r.** as I can te
2bd0: 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65 72  ll, so other ver
2be0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69  sions of unix mi
2bf0: 67 68 74 20 73 68 6f 77 20 74 68 65 20 73 61 6d  ght show the sam
2c00: 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e.** inconsisten
2c10: 63 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  cy.  There is no
2c20: 20 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69 6e   little doubt in
2c30: 20 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70 6f   my mind that po
2c40: 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20  six.** advisory 
2c50: 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20  locks and linux 
2c60: 74 68 72 65 61 64 73 20 61 72 65 20 70 72 6f 66  threads are prof
2c70: 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a  oundly broken..*
2c80: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
2c90: 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69 73  und the inconsis
2ca0: 74 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76 65  tencies, we have
2cb0: 20 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e 74   to test at runt
2cc0: 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72 20  ime .** whether 
2cd0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63  or not threads c
2ce0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
2cf0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
2d00: 54 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73 20  This test.** is 
2d10: 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69  run once, the fi
2d20: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
2d30: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
2d40: 20 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76 61   A static .** va
2d50: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
2d60: 20 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75   record the resu
2d70: 6c 74 73 20 6f 66 20 74 68 69 73 20 74 65 73 74  lts of this test
2d80: 20 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20 75   for future.** u
2d90: 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  se..*/../*.** An
2da0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2db0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2dc0: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
2dd0: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
2de0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
2df0: 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73  cular lockInfo s
2e00: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
2e10: 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ts inode..**.** 
2e20: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f  If threads canno
2e30: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
2e40: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68  others locks, th
2e50: 65 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a 2a  en we set the.**
2e60: 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65   lockKey.tid fie
2e70: 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  ld to the thread
2e80: 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64 73   ID.  If threads
2e90: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a   can override.**
2ea0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
2eb0: 6b 73 20 74 68 65 6e 20 74 69 64 20 69 73 20 61  ks then tid is a
2ec0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2ed0: 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74 74  o.  tid is omitt
2ee0: 65 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70  ed.** if we comp
2ef0: 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72 65  ile without thre
2f00: 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a  ading support..*
2f10: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79  /.struct lockKey
2f20: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
2f30: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
2f40: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 64 65  number */.#if de
2f50: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c  fined(__RTP__) |
2f60: 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b  | defined(_WRS_K
2f70: 45 52 4e 45 4c 29 0a 20 20 76 6f 69 64 20 2a 72  ERNEL).  void *r
2f80: 6e 61 6d 3b 20 20 20 20 20 20 2f 2a 20 52 65 61  nam;      /* Rea
2f90: 6c 6e 61 6d 65 20 73 69 6e 63 65 20 69 6e 6f 64  lname since inod
2fa0: 65 20 75 6e 75 73 61 62 6c 65 20 2a 2f 0a 23 65  e unusable */.#e
2fb0: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
2fc0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
2fd0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
2fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2ff0: 41 44 53 41 46 45 0a 20 20 70 74 68 72 65 61 64  ADSAFE.  pthread
3000: 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72  _t tid;   /* Thr
3010: 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69  ead ID or zero i
3020: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
3030: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
3040: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
3050: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3060: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3070: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
3080: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
3090: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
30a0: 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20   on each thread 
30b0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
30c0: 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54   process ID.  (T
30d0: 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64  hreads have.** d
30e0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
30f0: 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62   IDs on linux, b
3100: 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f  ut not on most o
3110: 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a  ther unixes.).**
3120: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
3130: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
3140: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
3150: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
3160: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
3170: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
3180: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
3190: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
31a0: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
31b0: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
31c0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
31d0: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
31e0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
31f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49  .*/.struct lockI
3200: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c  nfo {.  struct l
3210: 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20  ockKey key;  /* 
3220: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
3230: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3250: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
3260: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  ks held */.  int
3270: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
3280: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
3290: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
32a0: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
32b0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
32c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32d0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
32e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
32f0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
3300: 66 6f 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  fo *pNext, *pPre
3310: 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  v;   /* List of 
3320: 61 6c 6c 20 6c 6f 63 6b 49 6e 66 6f 20 6f 62 6a  all lockInfo obj
3330: 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ects */.};../*.*
3340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
3350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3360: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
3370: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
3380: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
3390: 61 72 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e  articular openCn
33a0: 74 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  t structure give
33b0: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68  n its inode.  Th
33c0: 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  is.** is the sam
33d0: 65 20 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79  e as the lockKey
33e0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
33f0: 20 74 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d   thread ID is om
3400: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  itted..*/.struct
3410: 20 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76   openKey {.  dev
3420: 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76  _t dev;   /* Dev
3430: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
3440: 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  f defined(__RTP_
3450: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57  _) || defined(_W
3460: 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 76 6f 69  RS_KERNEL).  voi
3470: 64 20 2a 72 6e 61 6d 3b 20 20 2f 2a 20 52 65 61  d *rnam;  /* Rea
3480: 6c 6e 61 6d 65 20 73 69 6e 63 65 20 69 6e 6f 64  lname since inod
3490: 65 20 75 6e 75 73 61 62 6c 65 20 2a 2f 0a 23 65  e unusable */.#e
34a0: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
34b0: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
34c0: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
34d0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
34e0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
34f0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
3500: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
3510: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
3520: 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  e.  This structu
3530: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
3540: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
3550: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a  locks on that.**
3560: 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c   inode.  If a cl
3570: 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64  ose is attempted
3580: 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64   against an inod
3590: 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e  e that is holdin
35a0: 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20  g.** locks, the 
35b0: 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65  close is deferre
35c0: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b  d until all lock
35d0: 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e  s clear by addin
35e0: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  g the.** file de
35f0: 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63  scriptor to be c
3600: 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e  losed to the pen
3610: 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  ding list..*/.st
3620: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20  ruct openCnt {. 
3630: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
3640: 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  key;   /* The lo
3650: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
3660: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3670: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3680: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
3690: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
36a0: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
36b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36c0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
36d0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  locks */.  int n
36e0: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65   /* Number of pe
3700: 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70  nding close() op
3710: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
3720: 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20  t *aPending;    
3730: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
3740: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
3750: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
3760: 6f 73 65 28 29 20 2a 2f 0a 23 69 66 20 64 65 66  ose() */.#if def
3770: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c  ined(__RTP__) ||
3780: 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45   defined(_WRS_KE
3790: 52 4e 45 4c 29 0a 20 20 73 65 6d 5f 74 20 2a 70  RNEL).  sem_t *p
37a0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Sem;          /*
37b0: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
37c0: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
37d0: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
37e0: 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 2f 2a 20  THNAME+1];   /* 
37f0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
3800: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
3810: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  .  struct openCn
3820: 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  t *pNext, *pPrev
3830: 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61  ;   /* List of a
3840: 6c 6c 20 6f 70 65 6e 43 6e 74 20 6f 62 6a 65 63  ll openCnt objec
3850: 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
3860: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6c 6f 63 6b  List of all lock
3870: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
3880: 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 20   objects.  This 
3890: 75 73 65 64 20 74 6f 20 62 65 20 61 20 68 61 73  used to be a has
38a0: 68 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 42 75 74  h.** table.  But
38b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
38c0: 62 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79  bjects is rarely
38d0: 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a   more than a doz
38e0: 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20  en and.** never 
38f0: 65 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68  exceeds a few th
3900: 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f  ousand.  And loo
3910: 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20  kup is not on a 
3920: 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68  critical.** path
3930: 20 6f 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e   oo a simple lin
3940: 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75  ked list will su
3950: 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ffice..*/.static
3960: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
3970: 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a   *lockList = 0;.
3980: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 6f 70  static struct op
3990: 65 6e 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20  enCnt *openList 
39a0: 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
39b0: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
39c0: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
39d0: 4c 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 68 61  L)./*.** This ha
39e0: 73 68 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  sh table is used
39f0: 20 74 6f 20 62 69 6e 64 20 74 68 65 20 63 61 6e   to bind the can
3a00: 6f 6e 69 63 61 6c 20 66 69 6c 65 20 6e 61 6d 65  onical file name
3a10: 20 74 6f 20 61 0a 2a 2a 20 75 6e 69 78 46 69 6c   to a.** unixFil
3a20: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
3a30: 75 73 65 20 74 68 65 20 68 61 73 68 20 6b 65 79  use the hash key
3a40: 20 28 3d 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61   (= canonical na
3a50: 6d 65 29 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  me).** instead o
3a60: 66 20 74 68 65 20 49 6e 6f 64 65 20 6e 75 6d 62  f the Inode numb
3a70: 65 72 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  er of the file t
3a80: 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 74 63 68  o find the match
3a90: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 49 6e 66 6f 20  ing.** lockInfo 
3aa0: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
3ab0: 63 74 75 72 65 73 2e 20 49 74 20 61 6c 73 6f 20  ctures. It also 
3ac0: 68 65 6c 70 73 20 74 6f 20 6d 61 6b 65 20 74 68  helps to make th
3ad0: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
3ae0: 20 73 65 6d 61 70 68 6f 72 65 20 77 68 65 6e 20   semaphore when 
3af0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41  LOCKING_STYLE_NA
3b00: 4d 45 44 53 45 4d 20 69 73 20 75 73 65 64 0a 2a  MEDSEM is used.*
3b10: 2a 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  * for the file..
3b20: 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20 6e  */.static Hash n
3b30: 61 6d 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ameHash;.#endif.
3b40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
3b50: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
3b60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3b70: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
3b80: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
3b90: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
3ba0: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
3bb0: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
3bc0: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3bd0: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3be0: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3bf0: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3c00: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3c10: 2a 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** AFP locking o
3c20: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
3c30: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
3c40: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
3c50: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
3c60: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
3c70: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
3c80: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
3c90: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
3ca0: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
3cb0: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
3cc0: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3cd0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3ce0: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3cf0: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3d00: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3d10: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
3d20: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
3d30: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
3d40: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
3d50: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
3d60: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
3d70: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
3d80: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3d90: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3da0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3db0: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
3dc0: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3dd0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 4e 41 4d 45  urrently.** NAME
3de0: 44 53 45 4d 20 69 73 20 73 69 6d 69 6c 61 72 20  DSEM is similar 
3df0: 74 6f 20 44 4f 54 4c 4f 43 4b 20 62 75 74 20 75  to DOTLOCK but u
3e00: 73 65 73 20 61 20 6e 61 6d 65 64 20 73 65 6d 61  ses a named sema
3e10: 70 68 6f 72 65 20 69 6e 73 74 65 61 64 20 6f 66  phore instead of
3e20: 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 69 63 61 74   an.**   indicat
3e30: 6f 72 20 66 69 6c 65 2e 0a 2a 2a 20 55 4e 53 55  or file..** UNSU
3e40: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3e50: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3e60: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3e70: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
3e80: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
3e90: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
3ea0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
3eb0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 23 64 65  supported.*/.#de
3ec0: 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  fine LOCKING_STY
3ed0: 4c 45 5f 50 4f 53 49 58 20 20 20 20 20 20 20 20  LE_POSIX        
3ee0: 31 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e  1.#define LOCKIN
3ef0: 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20 20 20 20  G_STYLE_NONE    
3f00: 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4c       2.#define L
3f10: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54  OCKING_STYLE_DOT
3f20: 46 49 4c 45 20 20 20 20 20 20 33 0a 23 64 65 66  FILE      3.#def
3f30: 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ine LOCKING_STYL
3f40: 45 5f 46 4c 4f 43 4b 20 20 20 20 20 20 20 20 34  E_FLOCK        4
3f50: 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47  .#define LOCKING
3f60: 5f 53 54 59 4c 45 5f 41 46 50 20 20 20 20 20 20  _STYLE_AFP      
3f70: 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4c 4f      5.#define LO
3f80: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45  CKING_STYLE_NAME
3f90: 44 53 45 4d 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a  DSEM     6../*.*
3fa0: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
3fb0: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
3fc0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
3fd0: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
3fe0: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
3ff0: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
4000: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
4010: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
4020: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
4030: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
4040: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
4050: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
4060: 42 55 53 59 29 29 0a 0a 2f 2a 0a 2a 2a 20 48 65  BUSY))../*.** He
4070: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
4080: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
4090: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
40a0: 61 6c 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61  al mutex..*/.sta
40b0: 74 69 63 20 76 6f 69 64 20 65 6e 74 65 72 4d 75  tic void enterMu
40c0: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
40d0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
40e0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
40f0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
4100: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
4110: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
4120: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
4130: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4140: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
4150: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
4160: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
4170: 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  TER));.}..#if SQ
4180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
4190: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
41a0: 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74  ble records whet
41b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
41c0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
41d0: 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c  each others.** l
41e0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30  ocks..**.**    0
41f0: 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20  :  No.  Threads 
4200: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
4210: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
4220: 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73  s..**    1:  Yes
4230: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f  .  Threads can o
4240: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4250: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20  ers locks..**   
4260: 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e  -1:  We don't kn
4270: 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ow yet..**.** On
4280: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77   some systems, w
4290: 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  e know at compil
42a0: 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64  e-time if thread
42b0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
42c0: 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f  ach.** others lo
42d0: 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73  cks.  On those s
42e0: 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49  ystems, the SQLI
42f0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
4300: 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a  DE_LOCK macro.**
4310: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70   will be set app
4320: 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20  ropriately.  On 
4330: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77  other systems, w
4340: 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20  e have to check 
4350: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20  at.** runtime.  
4360: 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20  On these latter 
4370: 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f  systems, SQLTIE_
4380: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
4390: 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66  LOCK is.** undef
43a0: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ined..**.** This
43b0: 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c   variable normal
43c0: 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70  ly has file scop
43d0: 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72  e only.  But dur
43e0: 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20  ing testing, we 
43f0: 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f  make.** it a glo
4400: 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  bal so that the 
4410: 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68  test code can ch
4420: 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69  ange its value i
4430: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
4440: 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69  y.** that the ri
4450: 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e  ght stuff happen
4460: 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65  s in either case
4470: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
4480: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
4490: 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IDE_LOCK.# defin
44a0: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
44b0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
44c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
44d0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74  QLITE_TEST.int t
44e0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
44f0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
4500: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
4510: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c  ERRIDE_LOCK;.#el
4520: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  se.static int th
4530: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
4540: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
4550: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
4560: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64  RRIDE_LOCK;.#end
4570: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  if../*.** This s
4580: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
4590: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
45a0: 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61  d into individua
45b0: 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64  l test.** thread
45c0: 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72  s by the testThr
45d0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
45e0: 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  or() routine..*/
45f0: 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  .struct threadTe
4600: 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66  stData {.  int f
4610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
4620: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20    /* File to be 
4630: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75  locked */.  stru
4640: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20  ct flock lock;  
4650: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e     /* The lockin
4660: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  g operation */. 
4670: 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20   int result;    
4680: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
4690: 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  t of the locking
46a0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b   operation */.};
46b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
46c0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
46d0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
46e0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
46f0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
4700: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
4710: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4720: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
4730: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
4740: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
4750: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
4760: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
4770: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
4780: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
4790: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
47a0: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
47b0: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
47c0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
47d0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
47e0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
47f0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
4800: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
4810: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4820: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4830: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4840: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4850: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4860: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4870: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
4880: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
4890: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
48a0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
48b0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
48c0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
48d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
48e0: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
48f0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
4900: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
4910: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4920: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4930: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4940: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4950: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4960: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
4970: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
4980: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4990: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
49a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
49b0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
49c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
49d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
49e0: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
49f0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66  K_SET );.  s = f
4a00: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4a10: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4a20: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
4a30: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4a40: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
4a50: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
4a60: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
4a70: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
4a80: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4a90: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4aa0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4ab0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4ac0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4ad0: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4ae0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4af0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4b00: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4b10: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4b20: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63   l2 = *p;.    fc
4b30: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
4b40: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
4b50: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
4b60: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4b70: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
4b80: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
4b90: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4ba0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
4bb0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
4bc0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4bd0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
4be0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
4bf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4c00: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4c10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4c20: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4c30: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
4c40: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
4c50: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
4c60: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
4c70: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
4c80: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
4c90: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
4ca0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
4cb0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e  turn s;.}.#defin
4cc0: 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  e fcntl lockTrac
4cd0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
4ce0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
4cf0: 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
4d00: 5f 5f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  __./*.** This fu
4d10: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
4d20: 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  s the main routi
4d30: 6e 65 20 66 6f 72 20 61 20 74 68 72 65 61 64 20  ne for a thread 
4d40: 6c 61 75 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74  launched by.** t
4d50: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4d60: 42 65 68 61 76 69 6f 72 28 29 2e 20 49 74 20 74  Behavior(). It t
4d70: 65 73 74 73 20 77 68 65 74 68 65 72 20 74 68 65  ests whether the
4d80: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74   shared-lock obt
4d90: 61 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ained.** by the 
4da0: 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 20 74  main thread in t
4db0: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4dc0: 42 65 68 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c  Behavior() confl
4dd0: 69 63 74 73 20 77 69 74 68 20 61 0a 2a 2a 20 68  icts with a.** h
4de0: 79 70 6f 74 68 65 74 69 63 61 6c 20 77 72 69 74  ypothetical writ
4df0: 65 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20  e-lock obtained 
4e00: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 6f  by this thread o
4e10: 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
4e20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65  .**.** The write
4e30: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 74  -lock is not act
4e40: 75 61 6c 6c 79 20 61 63 71 75 69 72 65 64 2c 20  ually acquired, 
4e50: 61 73 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  as this is not p
4e60: 6f 73 73 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74  ossible if .** t
4e70: 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20  he file is open 
4e80: 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  in read-only mod
4e90: 65 20 28 73 65 65 20 74 69 63 6b 65 74 20 23 33  e (see ticket #3
4ea0: 34 37 32 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  472)..*/ .static
4eb0: 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63   void *threadLoc
4ec0: 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70  kingTest(void *p
4ed0: 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74  Arg){.  struct t
4ee0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70  hreadTestData *p
4ef0: 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74  Data = (struct t
4f00: 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70  hreadTestData*)p
4f10: 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65  Arg;.  pData->re
4f20: 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61  sult = fcntl(pDa
4f30: 74 61 2d 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ta->fd, F_GETLK,
4f40: 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a   &pData->lock);.
4f50: 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d    return pArg;.}
4f60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
4f70: 63 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20  cedure attempts 
4f80: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
4f90: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
4fa0: 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72  ads.** can overr
4fb0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
4fc0: 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20  locks then sets 
4fd0: 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f  the .** threadsO
4fe0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
4ff0: 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20  sLocks variable 
5000: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a  appropriately..*
5010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
5020: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
5030: 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f  ehavior(int fd_o
5040: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
5050: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
5060: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
5070: 61 20 64 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  a d;.  struct fl
5080: 6f 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65 61 64  ock l;.  pthread
5090: 5f 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20 64 75  _t t;..  fd = du
50a0: 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66  p(fd_orig);.  if
50b0: 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b  ( fd<0 ) return;
50c0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20 30 2c  .  memset(&l, 0,
50d0: 20 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20 20 6c   sizeof(l));.  l
50e0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
50f0: 4b 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31  K;.  l.l_len = 1
5100: 3b 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20 3d 20  ;.  l.l_start = 
5110: 30 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63 65 20  0;.  l.l_whence 
5120: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 72 63  = SEEK_SET;.  rc
5130: 20 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72 69 67   = fcntl(fd_orig
5140: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a  , F_SETLK, &l);.
5150: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
5160: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
5170: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29  d, 0, sizeof(d))
5180: 3b 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b 0a 20  ;.  d.fd = fd;. 
5190: 20 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64   d.lock = l;.  d
51a0: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
51b0: 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61  _WRLCK;.  pthrea
51c0: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
51d0: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
51e0: 74 2c 20 26 64 29 3b 0a 20 20 70 74 68 72 65 61  t, &d);.  pthrea
51f0: 64 5f 6a 6f 69 6e 28 74 2c 20 30 29 3b 0a 20 20  d_join(t, 0);.  
5200: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 69 66 28  close(fd);.  if(
5210: 20 64 2e 72 65 73 75 6c 74 21 3d 30 20 29 20 72   d.result!=0 ) r
5220: 65 74 75 72 6e 3b 0a 20 20 74 68 72 65 61 64 73  eturn;.  threads
5230: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5240: 72 73 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c 6f 63  rsLocks = (d.loc
5250: 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  k.l_type==F_UNLC
5260: 4b 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a  K);.}.#else./*.*
5270: 2a 20 4f 6e 20 61 6e 79 74 68 69 6e 67 20 6f 74  * On anything ot
5280: 68 65 72 20 74 68 61 6e 20 6c 69 6e 75 78 2c 20  her than linux, 
5290: 61 73 73 75 6d 65 20 74 68 72 65 61 64 73 20 6f  assume threads o
52a0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
52b0: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
52c0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
52d0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
52e0: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
52f0: 7b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  {.  threadsOverr
5300: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
5310: 6b 73 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  ks = 1;.}.#endif
5320: 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f   /* __linux__ */
5330: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5340: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f  TE_THREADSAFE */
5350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
5360: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
5370: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
5380: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
5390: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
53a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
53b0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
53c0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
53d0: 63 6b 29 7b 0a 20 20 69 66 28 20 70 4c 6f 63 6b  ck){.  if( pLock
53e0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e   ){.    pLock->n
53f0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
5400: 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Lock->nRef==0 ){
5410: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
5420: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
5430: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
5440: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
5450: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
5460: 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70   pLock->pPrev->p
5470: 4e 65 78 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Next = pLock->pN
5480: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
5490: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
54a0: 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d 70 4c 6f 63  ( lockList==pLoc
54b0: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  k );.        loc
54c0: 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 2d 3e 70  kList = pLock->p
54d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
54e0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
54f0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
5500: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70  assert( pLock->p
5510: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4c 6f  Next->pPrev==pLo
5520: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ck );.        pL
5530: 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ock->pNext->pPre
5540: 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76  v = pLock->pPrev
5550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5560: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
5570: 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ck);.    }.  }.}
5580: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
5590: 61 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  a openCnt struct
55a0: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
55b0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
55c0: 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73  LockInfo()..*/.s
55d0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
55e0: 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63 74  seOpenCnt(struct
55f0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29   openCnt *pOpen)
5600: 7b 0a 20 20 69 66 28 20 70 4f 70 65 6e 20 29 7b  {.  if( pOpen ){
5610: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66  .    pOpen->nRef
5620: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65  --;.    if( pOpe
5630: 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  n->nRef==0 ){.  
5640: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
5650: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
5660: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
5670: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 4f 70  Prev->pNext==pOp
5680: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
5690: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
56a0: 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  t = pOpen->pNext
56b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
56c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
56d0: 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65 6e 20 29  penList==pOpen )
56e0: 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 4c 69  ;.        openLi
56f0: 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  st = pOpen->pNex
5700: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
5710: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78   if( pOpen->pNex
5720: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
5730: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  ert( pOpen->pNex
5740: 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70 65 6e 20  t->pPrev==pOpen 
5750: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  );.        pOpen
5760: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
5770: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 3b 0a 20   pOpen->pPrev;. 
5780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5790: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 2d  ite3_free(pOpen-
57a0: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
57b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
57c0: 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Open);.    }.  }
57d0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
57e0: 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69  __RTP__) || defi
57f0: 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
5800: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
5810: 61 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 70  ation of a realp
5820: 61 74 68 28 29 20 6c 69 6b 65 20 66 75 6e 63 74  ath() like funct
5830: 69 6f 6e 20 66 6f 72 20 76 78 57 6f 72 6b 73 0a  ion for vxWorks.
5840: 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
5850: 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 20 6e  canonical path n
5860: 61 6d 65 20 66 72 6f 6d 20 67 69 76 65 6e 20 6e  ame from given n
5870: 61 6d 65 2e 20 49 74 20 64 6f 65 73 0a 2a 2a 20  ame. It does.** 
5880: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 79 6d 6c  not support syml
5890: 69 6e 6b 73 2e 20 4e 65 69 74 68 65 72 20 64 6f  inks. Neither do
58a0: 65 73 20 69 74 20 68 61 6e 64 6c 65 20 76 6f 6c  es it handle vol
58b0: 75 6d 65 20 70 72 65 66 69 78 65 73 2e 0a 2a 2f  ume prefixes..*/
58c0: 0a 63 68 61 72 20 2a 0a 76 78 72 65 61 6c 70 61  .char *.vxrealpa
58d0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  th(const char *p
58e0: 61 74 68 6e 61 6d 65 2c 20 69 6e 74 20 64 6f 73  athname, int dos
58f0: 74 61 74 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  tat).{.  struct 
5900: 73 74 61 74 20 73 62 75 66 3b 0a 20 20 69 6e 74  stat sbuf;.  int
5910: 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 77 68   len;.  char *wh
5920: 65 72 65 2c 20 2a 70 74 72 2c 20 2a 6c 61 73 74  ere, *ptr, *last
5930: 3b 0a 20 20 63 68 61 72 20 2a 72 65 73 75 6c 74  ;.  char *result
5940: 2c 20 2a 63 75 72 70 61 74 68 2c 20 2a 77 6f 72  , *curpath, *wor
5950: 6b 70 61 74 68 2c 20 2a 6e 61 6d 65 62 75 66 3b  kpath, *namebuf;
5960: 0a 0a 20 20 6c 65 6e 20 3d 20 70 61 74 68 63 6f  ..  len = pathco
5970: 6e 66 28 70 61 74 68 6e 61 6d 65 2c 20 5f 50 43  nf(pathname, _PC
5980: 5f 50 41 54 48 5f 4d 41 58 29 3b 0a 20 20 69 66  _PATH_MAX);.  if
5990: 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 6c  ( len<0 ){.    l
59a0: 65 6e 20 3d 20 50 41 54 48 5f 4d 41 58 3b 0a 20  en = PATH_MAX;. 
59b0: 20 7d 0a 20 20 72 65 73 75 6c 74 20 3d 20 73 71   }.  result = sq
59c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
59d0: 20 2a 20 34 29 3b 0a 20 20 69 66 28 20 21 72 65   * 4);.  if( !re
59e0: 73 75 6c 74 20 29 7b 0a 20 20 20 20 72 65 74 75  sult ){.    retu
59f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 75 72 70  rn 0;.  }.  curp
5a00: 61 74 68 20 3d 20 72 65 73 75 6c 74 20 2b 20 6c  ath = result + l
5a10: 65 6e 3b 0a 20 20 77 6f 72 6b 70 61 74 68 20 3d  en;.  workpath =
5a20: 20 63 75 72 70 61 74 68 20 2b 20 6c 65 6e 3b 0a   curpath + len;.
5a30: 20 20 6e 61 6d 65 62 75 66 20 3d 20 77 6f 72 6b    namebuf = work
5a40: 70 61 74 68 20 2b 20 6c 65 6e 3b 0a 20 20 73 74  path + len;.  st
5a50: 72 63 70 79 28 63 75 72 70 61 74 68 2c 20 70 61  rcpy(curpath, pa
5a60: 74 68 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 2a  thname);.  if( *
5a70: 70 61 74 68 6e 61 6d 65 21 3d 27 2f 27 20 29 7b  pathname!='/' ){
5a80: 0a 20 20 20 20 69 66 28 20 21 67 65 74 63 77 64  .    if( !getcwd
5a90: 28 77 6f 72 6b 70 61 74 68 2c 20 6c 65 6e 29 20  (workpath, len) 
5aa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5ab0: 5f 66 72 65 65 28 72 65 73 75 6c 74 29 3b 0a 20  _free(result);. 
5ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5ad0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5ae0: 20 20 2a 77 6f 72 6b 70 61 74 68 20 3d 20 27 5c    *workpath = '\
5af0: 30 27 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 20  0';.  }.  where 
5b00: 3d 20 63 75 72 70 61 74 68 3b 0a 20 20 77 68 69  = curpath;.  whi
5b10: 6c 65 28 20 2a 77 68 65 72 65 20 29 7b 0a 20 20  le( *where ){.  
5b20: 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 77 68    if( !strcmp(wh
5b30: 65 72 65 2c 20 22 2e 22 29 20 29 7b 0a 20 20 20  ere, ".") ){.   
5b40: 20 20 20 77 68 65 72 65 2b 2b 3b 0a 20 20 20 20     where++;.    
5b50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5b60: 7d 0a 20 20 20 20 69 66 28 20 21 73 74 72 6e 63  }.    if( !strnc
5b70: 6d 70 28 77 68 65 72 65 2c 20 22 2e 2f 22 2c 20  mp(where, "./", 
5b80: 32 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  2) ){.      wher
5b90: 65 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 6f  e += 2;.      co
5ba0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5bb0: 20 20 69 66 28 20 21 73 74 72 6e 63 6d 70 28 77    if( !strncmp(w
5bc0: 68 65 72 65 2c 20 22 2e 2e 2f 22 2c 20 33 29 20  here, "../", 3) 
5bd0: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 2b  ){.      where +
5be0: 3d 20 33 3b 0a 20 20 20 20 20 20 70 74 72 20 3d  = 3;.      ptr =
5bf0: 20 6c 61 73 74 20 3d 20 77 6f 72 6b 70 61 74 68   last = workpath
5c00: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
5c10: 70 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ptr ){.        i
5c20: 66 28 20 2a 70 74 72 3d 3d 27 2f 27 20 29 7b 0a  f( *ptr=='/' ){.
5c30: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 20 3d            last =
5c40: 20 70 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ptr;.        }.
5c50: 20 20 20 20 20 20 20 20 70 74 72 2b 2b 3b 0a 20          ptr++;. 
5c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 6c 61       }.      *la
5c70: 73 74 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  st = '\0';.     
5c80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5c90: 0a 20 20 20 20 70 74 72 20 3d 20 73 74 72 63 68  .    ptr = strch
5ca0: 72 28 77 68 65 72 65 2c 20 27 2f 27 29 3b 0a 20  r(where, '/');. 
5cb0: 20 20 20 69 66 28 20 21 70 74 72 20 29 7b 0a 20     if( !ptr ){. 
5cc0: 20 20 20 20 20 70 74 72 20 3d 20 77 68 65 72 65       ptr = where
5cd0: 20 2b 20 73 74 72 6c 65 6e 28 77 68 65 72 65 29   + strlen(where)
5ce0: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
5cf0: 0a 20 20 20 20 20 20 2a 70 74 72 20 3d 20 27 5c  .      *ptr = '\
5d00: 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  0';.    }.    st
5d10: 72 63 70 79 28 6e 61 6d 65 62 75 66 2c 20 77 6f  rcpy(namebuf, wo
5d20: 72 6b 70 61 74 68 29 3b 0a 20 20 20 20 66 6f 72  rkpath);.    for
5d30: 28 20 6c 61 73 74 20 3d 20 6e 61 6d 65 62 75 66  ( last = namebuf
5d40: 3b 20 2a 6c 61 73 74 3b 20 6c 61 73 74 2b 2b 20  ; *last; last++ 
5d50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
5d60: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
5d70: 20 2a 2d 2d 6c 61 73 74 21 3d 27 2f 27 20 29 7b   *--last!='/' ){
5d80: 0a 20 20 20 20 20 20 73 74 72 63 61 74 28 6e 61  .      strcat(na
5d90: 6d 65 62 75 66 2c 20 22 2f 22 29 3b 0a 20 20 20  mebuf, "/");.   
5da0: 20 7d 0a 20 20 20 20 73 74 72 63 61 74 28 6e 61   }.    strcat(na
5db0: 6d 65 62 75 66 2c 20 77 68 65 72 65 29 3b 0a 20  mebuf, where);. 
5dc0: 20 20 20 77 68 65 72 65 20 3d 20 2b 2b 70 74 72     where = ++ptr
5dd0: 3b 0a 20 20 20 20 69 66 28 20 64 6f 73 74 61 74  ;.    if( dostat
5de0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
5df0: 61 74 28 6e 61 6d 65 62 75 66 2c 20 26 73 62 75  at(namebuf, &sbu
5e00: 66 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  f)==-1 ){.      
5e10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 72    sqlite3_free(r
5e20: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
5e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5e40: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 62 75  }.      if( (sbu
5e50: 66 2e 73 74 5f 6d 6f 64 65 20 26 20 53 5f 49 46  f.st_mode & S_IF
5e60: 44 49 52 29 3d 3d 53 5f 49 46 44 49 52 20 29 7b  DIR)==S_IFDIR ){
5e70: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
5e80: 77 6f 72 6b 70 61 74 68 2c 20 6e 61 6d 65 62 75  workpath, namebu
5e90: 66 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  f);.        cont
5ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5eb0: 20 20 20 20 69 66 28 20 2a 77 68 65 72 65 20 29      if( *where )
5ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5ed0: 33 5f 66 72 65 65 28 72 65 73 75 6c 74 29 3b 0a  3_free(result);.
5ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
5ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5f00: 20 20 20 20 73 74 72 63 70 79 28 77 6f 72 6b 70      strcpy(workp
5f10: 61 74 68 2c 20 6e 61 6d 65 62 75 66 29 3b 0a 20  ath, namebuf);. 
5f20: 20 7d 0a 20 20 73 74 72 63 70 79 28 72 65 73 75   }.  strcpy(resu
5f30: 6c 74 2c 20 77 6f 72 6b 70 61 74 68 29 3b 0a 20  lt, workpath);. 
5f40: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
5f50: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
5f60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5f70: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
5f80: 54 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e  Tests a byte-ran
5f90: 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79  ge locking query
5fa0: 20 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20   to see if byte 
5fb0: 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
5fc0: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69  .** supported, i
5fd0: 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61  f not we fall ba
5fe0: 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63  ck to dotlockLoc
5ff0: 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2a 20 4f 6e  kingStyle..** On
6000: 20 76 78 57 6f 72 6b 73 20 77 65 20 66 61 6c 6c   vxWorks we fall
6010: 20 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 73 65   back to namedse
6020: 6d 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a  mLockingStyle..*
6030: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
6040: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 69 6e  tLockingStyle(in
6050: 74 20 66 64 29 7b 0a 20 20 73 74 72 75 63 74 20  t fd){.  struct 
6060: 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
6070: 0a 20 20 2f 2a 20 54 65 73 74 20 62 79 74 65 2d  .  /* Test byte-
6080: 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
6090: 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
60a0: 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
60b0: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
60c0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
60d0: 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
60e0: 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
60f0: 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
6100: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
6110: 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
6120: 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
6130: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
6140: 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
6150: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
6160: 20 69 66 28 20 66 63 6e 74 6c 28 66 64 2c 20 46   if( fcntl(fd, F
6170: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
6180: 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
6190: 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54  eturn LOCKING_ST
61a0: 59 4c 45 5f 50 4f 53 49 58 3b 0a 20 20 7d 0a 20  YLE_POSIX;.  }. 
61b0: 20 0a 20 20 2f 2a 20 54 65 73 74 69 6e 67 20 66   .  /* Testing f
61c0: 6f 72 20 66 6c 6f 63 6b 28 29 20 63 61 6e 20 67  or flock() can g
61d0: 69 76 65 20 66 61 6c 73 65 20 70 6f 73 69 74 69  ive false positi
61e0: 76 65 73 2e 20 20 53 6f 20 69 66 20 69 66 20 74  ves.  So if if t
61f0: 68 65 20 61 62 6f 76 65 20 0a 20 20 2a 2a 20 74  he above .  ** t
6200: 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
6210: 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  we fall back to 
6220: 75 73 69 6e 67 20 64 6f 74 2d 66 69 6c 65 20 73  using dot-file s
6230: 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 20  tyle locking..  
6240: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
6250: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
6260: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20  ed(_WRS_KERNEL) 
6270: 20 0a 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49   .  return LOCKI
6280: 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45 44 53 45  NG_STYLE_NAMEDSE
6290: 4d 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  M;.#else.  retur
62a0: 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  n LOCKING_STYLE_
62b0: 44 4f 54 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a  DOTFILE;.#endif.
62c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  }.#endif../* .**
62d0: 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   If SQLITE_ENABL
62e0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
62f0: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73  is defined, this
6300: 20 66 75 6e 63 74 69 6f 6e 20 45 78 61 6d 69 6e   function Examin
6310: 65 73 20 74 68 65 20 0a 2a 2a 20 66 5f 66 73 74  es the .** f_fst
6320: 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69 6e  ypename entry in
6330: 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72 75   the statfs stru
6340: 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e 65  cture as returne
6350: 64 20 62 79 20 73 74 61 74 28 29 20 66 6f 72 20  d by stat() for 
6360: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 73 79 73  .** the file sys
6370: 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65 20  tem hosting the 
6380: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
6390: 64 20 73 65 6c 65 63 74 73 20 20 74 68 65 20 61  d selects  the a
63a0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6c 6f  ppropriate.** lo
63b0: 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65  cking style base
63c0: 64 20 6f 6e 20 69 74 73 20 76 61 6c 75 65 2e 20  d on its value. 
63d0: 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e   These values an
63e0: 64 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 61 72  d assignments ar
63f0: 65 20 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 44  e .** based on D
6400: 61 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69  arwin/OSX behavi
6410: 6f 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20  or and have not 
6420: 62 65 65 6e 20 74 68 6f 72 6f 75 67 68 6c 79 20  been thoroughly 
6430: 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74  tested on .** ot
6440: 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  her systems..**.
6450: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
6460: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
6470: 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  E is not defined
6480: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
6490: 61 6c 77 61 79 73 0a 2a 2a 20 72 65 74 75 72 6e  always.** return
64a0: 73 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  s LOCKING_STYLE_
64b0: 50 4f 53 49 58 2e 0a 2a 2f 0a 23 69 66 20 53 51  POSIX..*/.#if SQ
64c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
64d0: 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
64e0: 20 69 6e 74 20 64 65 74 65 63 74 4c 6f 63 6b 69   int detectLocki
64f0: 6e 67 53 74 79 6c 65 28 0a 20 20 73 71 6c 69 74  ngStyle(.  sqlit
6500: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
6510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
6520: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
6530: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
6540: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
6550: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
6560: 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
6570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 4f  ){.    return LO
6580: 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45  CKING_STYLE_NONE
6590: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 56 66 73  ;.  }.  if( pVfs
65a0: 2d 3e 70 41 70 70 44 61 74 61 20 29 7b 0a 20 20  ->pAppData ){.  
65b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
65c0: 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 66 73 2d  PTR_TO_INT(pVfs-
65d0: 3e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a  >pAppData);.  }.
65e0: 20 20 69 66 20 28 61 63 63 65 73 73 28 66 69 6c    if (access(fil
65f0: 65 50 61 74 68 2c 20 30 29 20 21 3d 20 2d 31 29  ePath, 0) != -1)
6600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 65 73  {.    return tes
6610: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 64  tLockingStyle(fd
6620: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73  );.  }.#else.  s
6630: 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
6640: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6650: 7a 46 69 6c 65 73 79 73 74 65 6d 3b 0a 20 20 20  zFilesystem;.   
6660: 20 69 6e 74 20 65 4c 6f 63 6b 69 6e 67 53 74 79   int eLockingSty
6670: 6c 65 3b 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d  le;.  } aMap[] =
6680: 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
6690: 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
66a0: 5f 50 4f 53 49 58 20 7d 2c 0a 20 20 20 20 7b 20  _POSIX },.    { 
66b0: 22 75 66 73 22 2c 20 20 20 20 4c 4f 43 4b 49 4e  "ufs",    LOCKIN
66c0: 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 20 7d 2c  G_STYLE_POSIX },
66d0: 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
66e0: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41   LOCKING_STYLE_A
66f0: 46 50 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  FP },.#ifdef SQL
6700: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50 5f 4c  ITE_ENABLE_AFP_L
6710: 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20 20 7b  OCKING_SMB.    {
6720: 20 22 73 6d 62 66 73 22 2c 20 20 4c 4f 43 4b 49   "smbfs",  LOCKI
6730: 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 7d 2c 0a  NG_STYLE_AFP },.
6740: 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d 62  #else.    { "smb
6750: 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54  fs",  LOCKING_ST
6760: 59 4c 45 5f 46 4c 4f 43 4b 20 7d 2c 0a 23 65 6e  YLE_FLOCK },.#en
6770: 64 69 66 0a 20 20 20 20 7b 20 22 6d 73 64 6f 73  dif.    { "msdos
6780: 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ",  LOCKING_STYL
6790: 45 5f 44 4f 54 46 49 4c 45 20 7d 2c 0a 20 20 20  E_DOTFILE },.   
67a0: 20 7b 20 22 77 65 62 64 61 76 22 2c 20 4c 4f 43   { "webdav", LOC
67b0: 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20  KING_STYLE_NONE 
67c0: 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
67d0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
67e0: 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
67f0: 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
6800: 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 72 65  lePath ){.    re
6810: 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  turn LOCKING_STY
6820: 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  LE_NONE;.  }.  i
6830: 66 28 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  f( pVfs->pAppDat
6840: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
6850: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
6860: 54 28 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  T(pVfs->pAppData
6870: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
6880: 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
6890: 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
68a0: 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
68b0: 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
68c0: 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
68d0: 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  turn LOCKING_STY
68e0: 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  LE_NONE;.    }. 
68f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
6900: 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
6910: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6920: 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
6930: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
6940: 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
6950: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6960: 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 65  return aMap[i].e
6970: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
6980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6990: 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
69a0: 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
69b0: 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
69c0: 73 22 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  s". */.  return 
69d0: 74 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  testLockingStyle
69e0: 28 66 64 29 3b 20 20 0a 23 65 6e 64 69 66 20 2f  (fd);  .#endif /
69f0: 2a 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52  * if defined(__R
6a00: 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  TP__) || defined
6a10: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 2a 2f  (_WRS_KERNEL) */
6a20: 0a 20 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e  .  return LOCKIN
6a30: 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 3b 0a 7d  G_STYLE_POSIX;.}
6a40: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
6a50: 20 64 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74   detectLockingSt
6a60: 79 6c 65 28 78 2c 79 2c 7a 29 20 4c 4f 43 4b 49  yle(x,y,z) LOCKI
6a70: 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 0a 23  NG_STYLE_POSIX.#
6a80: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
6a90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
6aa0: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
6ab0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
6ac0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
6ad0: 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e  cate lockInfo an
6ae0: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
6af0: 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73  ures that.** des
6b00: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
6b10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
6b20: 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66  eate new ones if
6b30: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
6b40: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
6b50: 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  s might be unini
6b60: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
6b70: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
6b80: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
6b90: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6ba0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
6bb0: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
6bc0: 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
6bf0: 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74  riptor used in t
6c00: 68 65 20 6b 65 79 20 2a 2f 0a 23 69 66 20 64 65  he key */.#if de
6c10: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c  fined(__RTP__) |
6c20: 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b  | defined(_WRS_K
6c30: 45 52 4e 45 4c 29 0a 20 20 76 6f 69 64 20 2a 72  ERNEL).  void *r
6c40: 6e 61 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  nam,            
6c50: 20 20 20 20 20 20 2f 2a 20 76 78 57 6f 72 6b 73        /* vxWorks
6c60: 20 72 65 61 6c 6e 61 6d 65 20 2a 2f 0a 23 65 6e   realname */.#en
6c70: 64 69 66 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  dif.  struct loc
6c80: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
6c90: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
6ca0: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
6cb0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
6cc0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
6cd0: 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65  pOpen      /* Re
6ce0: 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74  turn the openCnt
6cf0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
6d00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6d10: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79    struct lockKey
6d20: 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20   key1;.  struct 
6d30: 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20  openKey key2;.  
6d40: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
6d50: 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  buf;.  struct lo
6d60: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
6d70: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
6d80: 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66  *pOpen;.  rc = f
6d90: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
6da0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
6db0: 29 7b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  ){.#ifdef EOVERF
6dc0: 4c 4f 57 0a 20 20 20 20 69 66 28 20 65 72 72 6e  LOW.    if( errn
6dd0: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
6de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
6df0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
6e00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6e10: 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  RR;.  }..  /* On
6e20: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
6e30: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
6e40: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
6e50: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
6e60: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
6e70: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
6e80: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
6e90: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
6ea0: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
6eb0: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
6ec0: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
6ed0: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
6ee0: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
6ef0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
6f00: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
6f10: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
6f20: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
6f30: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
6f40: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6f50: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
6f60: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
6f70: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
6f80: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
6f90: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
6fa0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
6fb0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
6fc0: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
6fd0: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
6fe0: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
6ff0: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
7000: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
7010: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
7020: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
7030: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
7040: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
7050: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
7060: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
7070: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
7080: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
7090: 0a 20 20 20 20 77 72 69 74 65 28 66 64 2c 20 22  .    write(fd, "
70a0: 53 22 2c 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  S", 1);.    rc =
70b0: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
70c0: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
70d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
70e0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
70f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
7100: 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20  emset(&key1, 0, 
7110: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20  sizeof(key1));. 
7120: 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74   key1.dev = stat
7130: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
7140: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
7150: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
7160: 5f 4b 45 52 4e 45 4c 29 0a 20 20 6b 65 79 31 2e  _KERNEL).  key1.
7170: 72 6e 61 6d 20 3d 20 72 6e 61 6d 3b 0a 23 65 6c  rnam = rnam;.#el
7180: 73 65 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  se.  key1.ino = 
7190: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
71a0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
71b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 69  E_THREADSAFE.  i
71c0: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
71d0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
71e0: 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54  s<0 ){.    testT
71f0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
7200: 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20  vior(fd);.  }.  
7210: 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61  key1.tid = threa
7220: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
7230: 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20  hersLocks ? 0 : 
7240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
7250: 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28  #endif.  memset(
7260: 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66  &key2, 0, sizeof
7270: 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e  (key2));.  key2.
7280: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
7290: 5f 64 65 76 3b 0a 23 69 66 20 64 65 66 69 6e 65  _dev;.#if define
72a0: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
72b0: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
72c0: 4c 29 0a 20 20 6b 65 79 32 2e 72 6e 61 6d 20 3d  L).  key2.rnam =
72d0: 20 72 6e 61 6d 3b 0a 23 65 6c 73 65 0a 20 20 6b   rnam;.#else.  k
72e0: 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey2.ino = statbu
72f0: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
7300: 0a 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c  .  pLock = lockL
7310: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  ist;.  while( pL
7320: 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26 6b  ock && memcmp(&k
7330: 65 79 31 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ey1, &pLock->key
7340: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 20  , sizeof(key1)) 
7350: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  ){.    pLock = p
7360: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Lock->pNext;.  }
7370: 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20  .  if( pLock==0 
7380: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73  ){.    pLock = s
7390: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
73a0: 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b  izeof(*pLock) );
73b0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d  .    if( pLock==
73c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
73d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
73e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
73f0: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
7400: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79  }.    pLock->key
7410: 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f   = key1;.    pLo
7420: 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ck->nRef = 1;.  
7430: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
7440: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
7450: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ktype = 0;.    p
7460: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c 6f  Lock->pNext = lo
7470: 63 6b 4c 69 73 74 3b 0a 20 20 20 20 70 4c 6f 63  ckList;.    pLoc
7480: 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  k->pPrev = 0;.  
7490: 20 20 69 66 28 20 6c 6f 63 6b 4c 69 73 74 20 29    if( lockList )
74a0: 20 6c 6f 63 6b 4c 69 73 74 2d 3e 70 50 72 65 76   lockList->pPrev
74b0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 6c 6f   = pLock;.    lo
74c0: 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63 6b 3b 0a  ckList = pLock;.
74d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
74e0: 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  ck->nRef++;.  }.
74f0: 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63    *ppLock = pLoc
7500: 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21  k;.  if( ppOpen!
7510: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20  =0 ){.    pOpen 
7520: 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20  = openList;.    
7530: 77 68 69 6c 65 28 20 70 4f 70 65 6e 20 26 26 20  while( pOpen && 
7540: 6d 65 6d 63 6d 70 28 26 6b 65 79 32 2c 20 26 70  memcmp(&key2, &p
7550: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
7560: 66 28 6b 65 79 32 29 29 20 29 7b 0a 20 20 20 20  f(key2)) ){.    
7570: 20 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d    pOpen = pOpen-
7580: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
7590: 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29    if( pOpen==0 )
75a0: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20  {.      pOpen = 
75b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
75c0: 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29  sizeof(*pOpen) )
75d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65  ;.      if( pOpe
75e0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
75f0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
7600: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  pLock);.        
7610: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7620: 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
7630: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
7640: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
7650: 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65   pOpen->key = ke
7660: 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  y2;.      pOpen-
7670: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
7680: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20   pOpen->nLock = 
7690: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
76a0: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
76b0: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
76c0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
76d0: 4f 70 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 6f 70  Open->pNext = op
76e0: 65 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4f  enList;.      pO
76f0: 70 65 6e 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  pen->pPrev = 0;.
7700: 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 4c 69        if( openLi
7710: 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e 70  st ) openList->p
7720: 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Prev = pOpen;.  
7730: 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70      openList = p
7740: 4f 70 65 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65  Open;.#if define
7750: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
7760: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
7770: 4c 29 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  L).      pOpen->
7780: 70 53 65 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pSem = NULL;.   
7790: 20 20 20 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61     pOpen->aSemNa
77a0: 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 23 65  me[0] = '\0';.#e
77b0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
77c0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
77d0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
77e0: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
77f0: 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f    }..exit_findlo
7800: 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e  ckinfo:.  return
7810: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
7820: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
7830: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
7840: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
7850: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
7860: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
7870: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
7880: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
7890: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
78a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
78b0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
78c0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
78d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
78e0: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
78f0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
7900: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
7910: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
7920: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
7930: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
7940: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
7950: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
7960: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
7970: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
7980: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
7990: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
79a0: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
79b0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
79c0: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
79d0: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
79e0: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
79f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  if../*.** If we 
7a00: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7a10: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
7a20: 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72  ead than the thr
7a30: 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ead that the.** 
7a40: 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e  unixFile argumen
7a50: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68  t belongs to, th
7a60: 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65  en transfer owne
7a70: 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69  rship of the uni
7a80: 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f  xFile.** over to
7a90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
7aa0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69  ead..**.** A uni
7ab0: 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77  xFile is only ow
7ac0: 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  ned by a thread 
7ad0: 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  on systems where
7ae0: 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a   one thread is.*
7af0: 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72  * unable to over
7b00: 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74  ride locks creat
7b10: 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  ed by a differen
7b20: 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61  t thread.  RedHa
7b30: 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d  t9 is.** an exam
7b40: 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79  ple of such a sy
7b50: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65  stem..**.** Owne
7b60: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
7b70: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69  s only allowed i
7b80: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69  f the unixFile i
7b90: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
7ba0: 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  cked..** If the 
7bb0: 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b  unixFile is lock
7bc0: 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73  ed and an owners
7bd0: 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68  hip is wrong, th
7be0: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  en return.** SQL
7bf0: 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c  ITE_MISUSE.  SQL
7c00: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
7c10: 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
7c20: 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53   works..*/.#if S
7c30: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
7c50: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e  sferOwnership(un
7c60: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
7c70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
7c80: 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69  ead_t hSelf;.  i
7c90: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
7ca0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
7cb0: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65  s ){.    /* Owne
7cc0: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73 20  rship transfers 
7cd0: 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68  not needed on th
7ce0: 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  is system */.   
7cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7d00: 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d  K;.  }.  hSelf =
7d10: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
7d20: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 65  .  if( pthread_e
7d30: 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c  qual(pFile->tid,
7d40: 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f   hSelf) ){.    /
7d50: 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69  * We are still i
7d60: 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  n the same threa
7d70: 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  d */.    OSTRACE
7d80: 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20  1("No-transfer, 
7d90: 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b  same thread\n");
7da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7db0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
7dc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7dd0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
7de0: 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68   /* We cannot ch
7df0: 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77  ange ownership w
7e00: 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64  hile we are hold
7e10: 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20  ing a lock! */. 
7e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e30: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f  _MISUSE;.  }.  O
7e40: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
7e50: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
7e60: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
7e70: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
7e80: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
7e90: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
7ea0: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
7eb0: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
7ec0: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
7ed0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
7ee0: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
7ef0: 63 6b 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ck);.#if defined
7f00: 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66  (__RTP__) || def
7f10: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
7f20: 29 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ).    rc = findL
7f30: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68  ockInfo(pFile->h
7f40: 2c 20 70 46 69 6c 65 2d 3e 7a 52 65 61 6c 70 61  , pFile->zRealpa
7f50: 74 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63  th, &pFile->pLoc
7f60: 6b 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  k, 0);.#else.   
7f70: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
7f80: 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46  fo(pFile->h, &pF
7f90: 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a  ile->pLock, 0);.
7fa0: 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41  #endif.    OSTRA
7fb0: 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
7fc0: 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29  is now %s(%s,%d)
7fd0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
7fe0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
7ff0: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
8000: 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
8010: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
8020: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c  (pFile->pLock->l
8030: 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d  ocktype), pFile-
8040: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20  >pLock->cnt);.  
8050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8060: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
8070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8080: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f  }.}.#else.  /* O
8090: 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  n single-threade
80a0: 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73  d builds, owners
80b0: 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20  hip transfer is 
80c0: 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66  a no-op */.# def
80d0: 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  ine transferOwne
80e0: 72 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f  rship(X) SQLITE_
80f0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
8100: 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
8110: 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
8120: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8130: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
8140: 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
8150: 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
8160: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8170: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
8180: 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
8190: 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
81a0: 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
81b0: 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
81c0: 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
81d0: 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
81e0: 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
81f0: 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
8200: 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
8210: 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
8220: 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
8230: 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
8240: 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
8250: 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
8260: 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
8270: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
8280: 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
8290: 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
82a0: 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
82b0: 32 36 38 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  2681..*/.static 
82c0: 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
82d0: 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
82e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
82f0: 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
8300: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
8310: 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66  got;.  i64 newOf
8320: 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54  fset;.  TIMER_ST
8330: 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
8340: 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
8350: 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c  t = pread(id->h,
8360: 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
8370: 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
8380: 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
8390: 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
83a0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
83b0: 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69   got = pread64(i
83c0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
83d0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
83e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
83f0: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
8400: 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
8410: 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
8420: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
8430: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
8440: 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
8450: 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
8460: 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65  offset ){.    re
8470: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67  turn -1;.  }.  g
8480: 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c  ot = read(id->h,
8490: 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
84a0: 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
84b0: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52 45 41  .  OSTRACE5("REA
84c0: 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
84d0: 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
84e0: 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
84f0: 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
8500: 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
8510: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
8520: 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
8530: 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
8540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
8550: 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
8560: 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
8570: 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
8580: 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
8590: 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
85a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85b0: 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
85c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
85d0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
85e0: 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
85f0: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
8600: 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
8610: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
8620: 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  got = seekAndRea
8630: 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  d((unixFile*)id,
8640: 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
8650: 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
8660: 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
8670: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8680: 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
8690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
86a0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
86b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
86c0: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
86d0: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
86e0: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
86f0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
8700: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
8710: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
8720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8730: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8740: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
8750: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
8760: 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
8770: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
8780: 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
8790: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
87a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
87b0: 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
87c0: 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
87d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
87e0: 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
87f0: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
8800: 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
8810: 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
8820: 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
8830: 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20  64 newOffset;.  
8840: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
8850: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
8860: 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69  AD).  got = pwri
8870: 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
8880: 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65  cnt, offset);.#e
8890: 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
88a0: 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d  PREAD64).  got =
88b0: 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c   pwrite64(id->h,
88c0: 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
88d0: 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77  et);.#else.  new
88e0: 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
88f0: 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
8900: 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e  EK_SET);.  if( n
8910: 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
8920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
8930: 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77  1;.  }.  got = w
8940: 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
8950: 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20  , cnt);.#endif. 
8960: 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
8970: 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
8980: 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
8990: 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
89a0: 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
89b0: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
89c0: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
89d0: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
89e0: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
89f0: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
8a00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
8a10: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
8a20: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
8a30: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
8a40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8a50: 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
8a60: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
8a70: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
8a80: 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
8a90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
8aa0: 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72  set .){.  int wr
8ab0: 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
8ac0: 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
8ad0: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68  t( amt>0 );.  wh
8ae0: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
8af0: 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
8b00: 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ite((unixFile*)i
8b10: 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  d, offset, pBuf,
8b20: 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20   amt))>0 ){.    
8b30: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
8b40: 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74    offset += wrot
8b50: 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
8b60: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
8b70: 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  te];.  }.  Simul
8b80: 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f  ateIOError(( wro
8b90: 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29  te=(-1), amt=1 )
8ba0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
8bb0: 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f  kfullError(( wro
8bc0: 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  te=0, amt=1 ));.
8bd0: 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
8be0: 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29     if( wrote<0 )
8bf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8c00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8c10: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
8c20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c30: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
8c40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8c50: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
8c60: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
8c70: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
8c80: 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
8c90: 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
8ca0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
8cb0: 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
8cc0: 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
8cd0: 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
8ce0: 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
8cf0: 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
8d00: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
8d10: 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
8d20: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
8d30: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
8d40: 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61 73  * Use the fdatas
8d50: 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69  ync() API only i
8d60: 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54 41  f the HAVE_FDATA
8d70: 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
8d80: 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  fined..** Otherw
8d90: 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29 20  ise use fsync() 
8da0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f  in its place..*/
8db0: 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44  .#ifndef HAVE_FD
8dc0: 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  ATASYNC.# define
8dd0: 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
8de0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
8df0: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
8e00: 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
8e10: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
8e20: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
8e30: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
8e40: 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
8e50: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
8e60: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
8e70: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
8e80: 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
8e90: 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
8ea0: 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
8eb0: 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
8ec0: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
8ed0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8ee0: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
8ef0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8f00: 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
8f10: 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
8f20: 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
8f30: 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
8f40: 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
8f50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
8f60: 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
8f70: 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
8f80: 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
8f90: 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
8fa0: 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
8fb0: 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
8fc0: 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
8fd0: 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
8fe0: 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
8ff0: 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
9000: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
9010: 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
9020: 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
9030: 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
9040: 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
9050: 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
9060: 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
9070: 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
9080: 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
9090: 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
90a0: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
90b0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
90c0: 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
90d0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
90e0: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
90f0: 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
9100: 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
9110: 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
9120: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
9130: 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
9140: 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
9150: 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
9160: 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
9170: 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
9180: 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
9190: 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
91a0: 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
91b0: 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
91c0: 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
91d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
91e0: 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
91f0: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
9200: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9210: 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
9220: 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
9230: 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
9240: 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
9250: 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
9260: 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
9270: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
9280: 6c 53 79 6e 63 29 3b 0a 23 65 6c 73 65 0a 20 20  lSync);.#else.  
9290: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
92a0: 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
92b0: 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
92c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
92d0: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
92e0: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
92f0: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
9300: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
9310: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
9320: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
9330: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
9340: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
9350: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
9360: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
9370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
9380: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
9390: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
93a0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
93b0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
93c0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
93d0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
93e0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
93f0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
9400: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
9410: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
9420: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9430: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
9440: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
9450: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
9460: 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
9470: 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
9480: 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
9490: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
94a0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
94b0: 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
94c0: 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
94d0: 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
94e0: 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
94f0: 0a 20 20 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .   * It shouldn
9500: 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
9510: 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
9520: 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
9530: 6c 20 0a 20 20 20 2a 20 66 69 6c 65 20 73 79 73  l .   * file sys
9540: 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
9550: 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
9560: 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
9570: 43 0a 20 20 20 2a 20 69 73 6e 27 74 20 73 75 70  C.   * isn't sup
9580: 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
9590: 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
95a0: 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
95b0: 63 20 0a 20 20 20 2a 20 61 6e 64 20 28 66 6f 72  c .   * and (for
95c0: 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
95d0: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
95e0: 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
95f0: 20 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74   call.  .   * It
9600: 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
9610: 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
9620: 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
9630: 64 20 61 76 6f 69 64 20 0a 20 20 20 2a 20 74 68  d avoid .   * th
9640: 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
9650: 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
9660: 63 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  called..   */.  
9670: 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
9680: 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20  ync(fd);..#else 
9690: 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20  .  if( dataOnly 
96a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74  ){.    rc = fdat
96b0: 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69  async(fd);.    i
96c0: 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( IS_VXWORKS &&
96d0: 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
96e0: 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
96f0: 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
9700: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9710: 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
9720: 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
9730: 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
9740: 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
9750: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
9760: 0a 20 20 69 66 28 20 49 53 5f 56 58 57 4f 52 4b  .  if( IS_VXWORK
9770: 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
9780: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
9790: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
97a0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
97b0: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
97c0: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
97d0: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
97e0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
97f0: 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
9800: 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
9810: 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
9820: 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
9830: 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
9840: 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
9850: 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
9860: 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
9870: 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
9880: 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
9890: 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
98a0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
98b0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
98c0: 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
98d0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
98e0: 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
98f0: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
9900: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
9910: 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
9920: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
9930: 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
9940: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
9950: 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
9960: 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
9970: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
9980: 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
9990: 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
99a0: 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
99b0: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
99c0: 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
99d0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
99e0: 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
99f0: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
9a00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
9a10: 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
9a20: 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
9a30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
9a40: 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
9a50: 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
9a60: 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
9a70: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
9a80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
9a90: 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
9aa0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
9ab0: 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
9ac0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
9ad0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
9ae0: 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
9af0: 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
9b00: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
9b10: 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
9b20: 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
9b30: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
9b40: 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
9b50: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
9b60: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
9b70: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
9b80: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
9b90: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
9ba0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
9bb0: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
9bc0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
9bd0: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
9be0: 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
9bf0: 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
9c00: 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
9c10: 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
9c20: 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
9c30: 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
9c40: 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
9c50: 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
9c60: 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
9c70: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
9c80: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
9c90: 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
9ca0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
9cb0: 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e  .  OSTRACE2("SYN
9cc0: 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
9cd0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20  ile->h);.  rc = 
9ce0: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
9cf0: 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
9d00: 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
9d10: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9d20: 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
9d30: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
9d40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
9d50: 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
9d60: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
9d70: 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44  .    OSTRACE4("D
9d80: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76  IRSYNC %-3d (hav
9d90: 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
9da0: 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
9db0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20  pFile->dirfd,.  
9dc0: 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
9dd0: 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
9de0: 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53  sync);.#ifndef S
9df0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
9e00: 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65  RSYNC.    /* The
9e10: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
9e20: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
9e30: 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20  d if full_fsync 
9e40: 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64  is.    ** turned
9e50: 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61   off or unavaila
9e60: 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f  ble.  If a full_
9e70: 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61  fsync occurred a
9e80: 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  bove,.    ** the
9e90: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
9ea0: 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75  sync is superflu
9eb0: 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ous..    */.    
9ec0: 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46  if( (!HAVE_FULLF
9ed0: 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73  SYNC || !isFulls
9ee0: 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79  ync) && full_fsy
9ef0: 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  nc(pFile->dirfd,
9f00: 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  0,0) ){.       /
9f10: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68  *.       ** We h
9f20: 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c  ave received mul
9f30: 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66  tiple reports of
9f40: 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69   fsync() returni
9f50: 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72  ng.       ** err
9f60: 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64  ors when applied
9f70: 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20   to directories 
9f80: 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20  on certain file 
9f90: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20  systems..       
9fa0: 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65  ** A failed dire
9fb0: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f  ctory sync is no
9fc0: 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53  t a big deal.  S
9fd0: 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20  o it seems.     
9fe0: 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69    ** better to i
9ff0: 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
a000: 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20    Ticket #1657. 
a010: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a020: 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
a030: 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
a040: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73  .#endif.    clos
a050: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
a060: 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74    /* Only need t
a070: 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
a080: 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74  close the direct
a090: 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ory */.    pFile
a0a0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  ->dirfd = -1;   
a0b0: 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20   /* when we are 
a0c0: 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  done. */.  }.  r
a0d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
a0f0: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
a100: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
a110: 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
a120: 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
a130: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
a140: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
a150: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
a160: 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74   id );.  Simulat
a170: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
a180: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
a190: 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d  UNCATE );.  rc =
a1a0: 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69   ftruncate(((uni
a1b0: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  xFile*)id)->h, (
a1c0: 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
a1d0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
a1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a1f0: 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65  R_TRUNCATE;.  }e
a200: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
a210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
a220: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
a230: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
a240: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
a250: 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
a260: 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
a270: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
a280: 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
a290: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
a2a0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
a2b0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
a2c0: 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
a2d0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
a2e0: 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
a2f0: 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
a300: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
a310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a320: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
a330: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
a340: 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
a350: 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
a360: 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
a370: 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f 63 6b 49  e, the findLockI
a380: 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
a390: 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
a3a0: 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
a3b0: 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
a3c0: 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
a3d0: 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
a3e0: 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
a3f0: 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
a400: 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
a410: 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
a420: 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
a430: 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
a440: 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
a450: 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
a460: 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
a470: 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
a480: 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
a490: 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
a4a0: 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
a4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a4d0: 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  outine translate
a4e0: 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53  s a standard POS
a4f0: 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e  IX errno code in
a500: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
a510: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c  useful to the cl
a520: 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c  ients of the sql
a530: 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ite3 functions. 
a540: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
a550: 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64  t is.** intended
a560: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20   to translate a 
a570: 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20  variety of "try 
a580: 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e  again" errors in
a590: 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a  to SQLITE_BUSY.*
a5a0: 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20  * and a variety 
a5b0: 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65  of "please close
a5c0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
a5d0: 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73  ptor NOW" errors
a5e0: 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45   into .** SQLITE
a5f0: 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72  _IOERR.** .** Er
a600: 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74  rors during init
a610: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f  ialization of lo
a620: 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73  cks, or file sys
a630: 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20  tem support for 
a640: 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  locks,.** should
a650: 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20   handle ENOLCK, 
a660: 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53  ENOTSUP, EOPNOTS
a670: 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  UPP separately..
a680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a690: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
a6a0: 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69  ixError(int posi
a6b0: 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69  xError, int sqli
a6c0: 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69  teIOErr) {.  swi
a6d0: 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29  tch (posixError)
a6e0: 20 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20   {.  case 0: .  
a6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a700: 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  OK;.    .  case 
a710: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
a720: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
a730: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
a740: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
a750: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
a760: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
a770: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
a780: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
a790: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
a7a0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
a7b0: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
a7c0: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
a7d0: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
a7e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
a7f0: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
a800: 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41  CCES: .    /* EA
a810: 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47  CCES is like EAG
a820: 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69  AIN during locki
a830: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62  ng operations, b
a840: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72  ut not any other
a850: 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20   time*/.    if( 
a860: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
a870: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
a880: 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49  K) || ..(sqliteI
a890: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
a8a0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20  OERR_UNLOCK) || 
a8b0: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
a8c0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
a8d0: 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69  DLOCK) ||..(sqli
a8e0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
a8f0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
a900: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
a910: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a920: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
a930: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
a940: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
a950: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
a960: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
a970: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45  .    .  case EDE
a980: 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e  ADLK:.    return
a990: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
a9a0: 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20  OCKED;.    .#if 
a9b0: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
a9c0: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
a9d0: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
a9e0: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
a9f0: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
aa00: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
aa10: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
aa20: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
aa30: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
aa40: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
aa50: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
aa60: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
aa70: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
aa80: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
aa90: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
aaa0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
aab0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
aac0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
aad0: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
aae0: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
aaf0: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
ab00: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
ab10: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
ab20: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
ab30: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
ab40: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
ab50: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
ab60: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61  ase ENOENT:.  ca
ab70: 73 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73  se ESTALE:.  cas
ab80: 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a  e ENOSYS:.    /*
ab90: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f   these should fo
aba0: 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rce the client t
abb0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  o close the file
abc0: 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a   and reconnect *
abd0: 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  /.    .  default
abe0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
abf0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
ac00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ac10: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
ac20: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
ac30: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
ac40: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
ac50: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
ac60: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
ac70: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
ac80: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
ac90: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
aca0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
acb0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
acc0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
acd0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
ace0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
acf0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
ad00: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
ad10: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
ad20: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
ad30: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
ad40: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ad50: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ad60: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
ad70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ad80: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
ad90: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
ada0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
adb0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
adc0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
add0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
ade0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
adf0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
ae00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ae10: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
ae20: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
ae30: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
ae40: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
ae50: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
ae60: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
ae70: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
ae80: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
ae90: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
aea0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  Lock->locktype>S
aeb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
aec0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
aed0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
aee0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
aef0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
af00: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
af10: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
af20: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
af30: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
af40: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
af50: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
af60: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
af70: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
af80: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
af90: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
afa0: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31  RLCK;.    if (-1
afb0: 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d   == fcntl(pFile-
afc0: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
afd0: 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74  ck)) {.      int
afe0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
aff0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b000: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
b010: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
b020: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b030: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
b040: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
b050: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
b060: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
b070: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
b080: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
b090: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
b0a0: 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61 76 65 4d  .  }.  .  leaveM
b0b0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
b0c0: 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
b0d0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
b0e0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
b0f0: 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  rved);..  *pResO
b100: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
b110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b120: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
b130: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
b140: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
b150: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
b160: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
b170: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
b180: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
b190: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
b1a0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
b1b0: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
b1c0: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
b1d0: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
b1e0: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
b1f0: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
b200: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
b210: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
b220: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
b230: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
b240: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
b250: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
b260: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
b270: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
b280: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
b290: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
b2a0: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
b2b0: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
b2c0: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
b2d0: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
b2e0: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
b2f0: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
b300: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
b310: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
b320: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
b330: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
b340: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
b350: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
b360: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
b370: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
b380: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
b390: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
b3a0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
b3b0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
b3c0: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
b3d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b3e0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
b3f0: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
b400: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
b410: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
b420: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
b430: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
b440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
b450: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
b460: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
b470: 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20  type){.  /* The 
b480: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
b490: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
b4a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
b4b0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
b4c0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
b4d0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
b4e0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
b4f0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
b500: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
b510: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
b520: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
b530: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
b540: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
b550: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
b560: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
b570: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
b580: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
b590: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
b5a0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
b5b0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
b5c0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
b5d0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
b5e0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
b5f0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
b600: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
b610: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
b620: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
b630: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
b640: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
b650: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
b660: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
b670: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
b680: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
b690: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
b6a0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
b6b0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
b6c0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b6d0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
b6e0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
b6f0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
b700: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
b710: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
b720: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
b730: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
b740: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
b750: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
b760: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
b770: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
b780: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
b790: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
b7a0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
b7b0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
b7c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b7d0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
b7e0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b7f0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b800: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
b810: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
b820: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
b830: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
b840: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
b850: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
b860: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
b870: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
b880: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
b890: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
b8a0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
b8b0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
b8c0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
b8d0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
b8e0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
b8f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b900: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
b910: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
b920: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b930: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
b940: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
b950: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
b960: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
b970: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
b980: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
b990: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
b9a0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
b9b0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
b9c0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
b9d0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
b9e0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
b9f0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
ba00: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
ba10: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
ba20: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
ba30: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
ba40: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
ba50: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
ba60: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
ba70: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
ba80: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
ba90: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
baa0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
bab0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
bac0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
bad0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
bae0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
baf0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
bb00: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
bb10: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
bb20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
bb30: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
bb40: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
bb50: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
bb60: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
bb70: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
bb80: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
bb90: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
bba0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
bbb0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
bbc0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
bbd0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
bbe0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
bbf0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
bc00: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
bc10: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
bc20: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
bc30: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
bc40: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
bc50: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
bc60: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
bc70: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
bc80: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
bc90: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
bca0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
bcb0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bcc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
bcd0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
bce0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
bcf0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
bd00: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
bd10: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
bd20: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
bd30: 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   s;..  assert( p
bd40: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
bd50: 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E7("LOCK    %d %
bd60: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
bd70: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
bd80: 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  ->h,.      lockt
bd90: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
bda0: 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  ), locktypeName(
bdb0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
bdc0: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
bdd0: 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  Name(pLock->lock
bde0: 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e  type), pLock->cn
bdf0: 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  t , getpid());..
be00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
be10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
be20: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
be30: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
be40: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
be50: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
be60: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
be70: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
be80: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e  path, as.  ** en
be90: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
bea0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
beb0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
bec0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
bed0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
bee0: 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
bef0: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
bf00: 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
bf10: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
bf20: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
bf30: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  locktype));.    
bf40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bf50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
bf60: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
bf70: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
bf80: 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
bf90: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
bfa0: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
bfb0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
bfc0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
bfd0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
bfe0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
bff0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
c000: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
c010: 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
c020: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
c030: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
c040: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
c050: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
c060: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
c070: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
c080: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
c090: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
c0a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
c0b0: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
c0c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
c0d0: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
c0e0: 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
c0f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c100: 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28  .    leaveMutex(
c110: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
c120: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20  ;.  }.  pLock = 
c130: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20  pFile->pLock;.. 
c140: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
c150: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
c160: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
c170: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
c180: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
c190: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
c1a0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
c1b0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
c1c0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
c1d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
c1e0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
c1f0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
c200: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  Lock->locktype>=
c210: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
c220: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
c230: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
c240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
c250: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
c260: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
c270: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
c280: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
c290: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
c2a0: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
c2b0: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
c2c0: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
c2d0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
c2e0: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
c2f0: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
c300: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
c310: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  OK..  */.  if( l
c320: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
c330: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
c340: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
c350: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c360: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
c370: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
c380: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( 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 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
c3b0: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
c3c0: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ype==0 );.    as
c3d0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
c3e0: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
c3f0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
c400: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  ED_LOCK;.    pLo
c410: 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70  ck->cnt++;.    p
c420: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
c430: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
c440: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
c450: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c460: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ..  lock.l_whenc
c470: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20  e = SEEK_SET;.. 
c480: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
c490: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
c4a0: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
c4b0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
c4c0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
c4d0: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
c4e0: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
c4f0: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
c500: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
c510: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
c520: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
c530: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
c540: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f  CK .      || (lo
c550: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
c560: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
c570: 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e  >locktype<PENDIN
c580: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c590: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c5a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
c5b0: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
c5c0: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
c5d0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
c5e0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d  NG_BYTE;.    s =
c5f0: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
c600: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
c610: 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31  ;.    if( s==(-1
c620: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ) ){.      int t
c630: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c640: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c650: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
c660: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
c670: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
c680: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
c690: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
c6a0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c6b0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c6d0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c6e0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
c6f0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
c700: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
c710: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
c720: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
c730: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
c740: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
c750: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
c760: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
c770: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
c780: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  OCK ){.    int t
c790: 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 61  Errno = 0;.    a
c7a0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
c7b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
c7c0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
c7d0: 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  ype==0 );..    /
c7e0: 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
c7f0: 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
c800: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c810: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c820: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
c830: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66  RED_SIZE;.    if
c840: 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70 46 69  ( (s = fcntl(pFi
c850: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c860: 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b  &lock))==(-1) ){
c870: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c880: 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  errno;.    }.   
c890: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
c8a0: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
c8b0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
c8c0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
c8d0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
c8e0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
c8f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
c900: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
c910: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
c920: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
c930: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
c940: 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  s != -1 ){.     
c950: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
c960: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
c970: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
c980: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
c990: 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20   errno; .       
c9a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
c9b0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
c9c0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
c9d0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20  OERR_UNLOCK); . 
c9e0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
c9f0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ca00: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ca10: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ca20: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
ca30: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
ca40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lock;.      }.  
ca50: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28    }.    if( s==(
ca60: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
ca70: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ca80: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ca90: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
caa0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
cab0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
cac0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
cad0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cae0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
caf0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
cb00: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
cb10: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
cb20: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
cb30: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
cb40: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
cb50: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
cb60: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
cb70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
cb80: 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20  && pLock->cnt>1 
cb90: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
cba0: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
cbb0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
cbc0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
cbd0: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
cbe0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
cbf0: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
cc00: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
cc10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cc20: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
cc30: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
cc40: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
cc50: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
cc60: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
cc70: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
cc80: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
cc90: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
cca0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
ccb0: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
ccc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
ccd0: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
cce0: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f  cktype );.    lo
ccf0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
cd00: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
cd10: 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20   locktype ){.   
cd20: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
cd30: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
cd40: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
cd50: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
cd60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cd70: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
cd80: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
cd90: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
cda0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
cdb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
cdc0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
cdd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cde0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
cdf0: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
ce00: 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e     }.    s = fcn
ce10: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
ce20: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
ce30: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
ce40: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
ce50: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ce60: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ce70: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ce80: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ce90: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
cea0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
ceb0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
cec0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ced0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
cee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cef0: 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
cf00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
cf10: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
cf20: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c  locktype;.    pL
cf30: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
cf40: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
cf50: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
cf60: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
cf70: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
cf80: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
cf90: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
cfa0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
cfb0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
cfc0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65  nd_lock:.  leave
cfd0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
cfe0: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
cff0: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
d000: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
d010: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
d020: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
d030: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
d040: 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
d050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
d060: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
d070: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
d080: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
d090: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
d0a0: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
d0b0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
d0c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
d0d0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
d0e0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
d0f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d100: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
d110: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
d120: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
d130: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
d140: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
d160: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
d170: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
d180: 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63  cktype){.  struc
d190: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
d1a0: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
d1b0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
d1c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d1d0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d1e0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d1f0: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73  .  int h;..  ass
d200: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d210: 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b  OSTRACE7("UNLOCK
d220: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
d230: 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c  d,%d) pid=%d\n",
d240: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
d250: 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ype,.      pFile
d260: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
d270: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
d280: 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  pe, pFile->pLock
d290: 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29  ->cnt, getpid())
d2a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  ;..  assert( loc
d2b0: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
d2c0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
d2d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63  e->locktype<=loc
d2e0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
d2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d300: 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54   }.  if( CHECK_T
d310: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29  HREADID(pFile) )
d320: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d330: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
d340: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
d350: 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a    h = pFile->h;.
d360: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
d370: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
d380: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
d390: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
d3a0: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
d3b0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
d3c0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
d3d0: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
d3e0: 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75  type );.    Simu
d3f0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
d400: 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
d410: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
d420: 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
d430: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
d440: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
d450: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
d460: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
d470: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
d480: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
d490: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
d4a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d4b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d4c0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d4d0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d4e0: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  E;.      if( fcn
d4f0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
d500: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
d510: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
d520: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d530: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d540: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d550: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d560: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
d570: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
d580: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
d590: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
d5a0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d5b0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
d5c0: 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c  ....goto end_unl
d5d0: 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ock;.      }.   
d5e0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
d5f0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
d600: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d610: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d620: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d630: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d640: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
d650: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
d660: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
d670: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
d680: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
d690: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
d6a0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  1) ){.      pLoc
d6b0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  k->locktype = SH
d6c0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
d6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
d6e0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d6f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d700: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d710: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d720: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
d740: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
d750: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
d760: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d770: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 09 09 09  rno;.      }....
d780: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d7a0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
d7b0: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
d7c0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
d7d0: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
d7e0: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
d7f0: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
d800: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
d810: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
d820: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
d830: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
d840: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
d850: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
d860: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
d870: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b      */.    pLock
d880: 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  ->cnt--;.    if(
d890: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
d8a0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
d8b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
d8c0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
d8d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d8e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d8f0: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
d900: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
d910: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
d920: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
d930: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
d940: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
d950: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
d960: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
d970: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d980: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
d990: 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  .        pLock->
d9a0: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
d9b0: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
d9c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
d9d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d9f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
da00: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
da10: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
da20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
da30: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
da50: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
da60: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
da70: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  }.        pLock-
da80: 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09 09 67 6f  >cnt = 1;.....go
da90: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
daa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dab0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
dac0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
dad0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
dae0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
daf0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
db00: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
db10: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
db20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
db30: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
db40: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
db50: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
db60: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
db70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
db80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
db90: 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c      pOpen = pFil
dba0: 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20  e->pOpen;.      
dbb0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  pOpen->nLock--;.
dbc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
dbd0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
dbe0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
dbf0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
dc00: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
dc10: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
dc20: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
dc30: 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
dc40: 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
dc50: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65        close(pOpe
dc60: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b  n->aPending[i]);
dc70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
dc90: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
dca0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
dcb0: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
dcc0: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50         pOpen->aP
dcd0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
dce0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a    }.    }.  }...
dcf0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 6c 65  end_unlock:.  le
dd00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
dd10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd20: 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ) pFile->locktyp
dd30: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
dd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dd50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
dd60: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
dd70: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
dd80: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
dd90: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
dda0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
ddb0: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
ddc0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
ddd0: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
dde0: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
ddf0: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
de00: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
de10: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
de20: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2f 0a  ucture to 0..*/.
de30: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
de40: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
de50: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
de60: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
de70: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
de80: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
de90: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
dea0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  fd>=0 ){.      c
deb0: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
dec0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
ded0: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
dee0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69  .      close(pFi
def0: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d 0a 23 69  le->h);.    }.#i
df00: 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  f defined(__RTP_
df10: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57  _) || defined(_W
df20: 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20 69  RS_KERNEL).    i
df30: 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65  f( pFile->isDele
df40: 74 65 20 26 26 20 70 46 69 6c 65 2d 3e 7a 52 65  te && pFile->zRe
df50: 61 6c 70 61 74 68 20 29 7b 0a 20 20 20 20 20 20  alpath ){.      
df60: 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 52  unlink(pFile->zR
df70: 65 61 6c 70 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ealpath);.    }.
df80: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a      if( pFile->z
df90: 52 65 61 6c 70 61 74 68 20 29 7b 0a 20 20 20 20  Realpath ){.    
dfa0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
dfb0: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  m;.      int n =
dfc0: 20 73 74 72 6c 65 6e 28 70 46 69 6c 65 2d 3e 7a   strlen(pFile->z
dfd0: 52 65 61 6c 70 61 74 68 29 20 2b 20 31 3b 0a 20  Realpath) + 1;. 
dfe0: 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 73 71 6c       pElem = sql
dff0: 69 74 65 33 48 61 73 68 46 69 6e 64 45 6c 65 6d  ite3HashFindElem
e000: 28 26 6e 61 6d 65 48 61 73 68 2c 20 70 46 69 6c  (&nameHash, pFil
e010: 65 2d 3e 7a 52 65 61 6c 70 61 74 68 2c 20 6e 29  e->zRealpath, n)
e020: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6c 65  ;.      if( pEle
e030: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 6f 6e  m ){.        lon
e040: 67 20 63 6e 74 20 3d 20 28 6c 6f 6e 67 29 70 45  g cnt = (long)pE
e050: 6c 65 6d 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  lem->data;.     
e060: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 20 20     cnt--;.      
e070: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
e080: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e090: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6e 61 6d  3HashInsert(&nam
e0a0: 65 48 61 73 68 2c 20 70 46 69 6c 65 2d 3e 7a 52  eHash, pFile->zR
e0b0: 65 61 6c 70 61 74 68 2c 20 6e 2c 20 30 29 3b 0a  ealpath, n, 0);.
e0c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e0d0: 20 20 20 20 20 20 20 20 20 70 45 6c 65 6d 2d 3e           pElem->
e0e0: 64 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 63 6e  data = (void*)cn
e0f0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e100: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
e110: 66 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22  f.    OSTRACE2("
e120: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
e130: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
e140: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
e150: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
e160: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
e170: 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72  xFile));.  }.  r
e180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e1a0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
e1b0: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
e1c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e1d0: 29 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  ){.  if( id ){. 
e1e0: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
e1f0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
e200: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
e210: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
e220: 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78  ;.    enterMutex
e230: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
e240: 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c  e->pOpen && pFil
e250: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  e->pOpen->nLock 
e260: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
e270: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
e280: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
e290: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
e2a0: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
e2b0: 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
e2c0: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
e2d0: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
e2e0: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
e2f0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
e300: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
e310: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
e320: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
e330: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
e340: 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
e350: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
e360: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
e370: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   */.      int *a
e380: 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63  New;.      struc
e390: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
e3a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
e3b0: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71  .      aNew = sq
e3c0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f  lite3_realloc(pO
e3d0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28  pen->aPending, (
e3e0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
e3f0: 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  1)*sizeof(int) )
e400: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
e410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
e420: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
e430: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
e440: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e450: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  or */.      }els
e460: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  e{.        pOpen
e470: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
e480: 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  w;.        pOpen
e490: 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e  ->aPending[pOpen
e4a0: 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46  ->nPending] = pF
e4b0: 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20  ile->h;.        
e4c0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
e4d0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  +;.        pFile
e4e0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
e4f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  }.    }.    rele
e500: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
e510: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
e520: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
e530: 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  ile->pOpen);.   
e540: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e550: 64 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74  d);.    leaveMut
e560: 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
e570: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e580: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
e590: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e5a0: 45 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  E..#if !defined(
e5b0: 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
e5c0: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
e5d0: 29 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41  ).#pragma mark A
e5e0: 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20  FP Support../*. 
e5f0: 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** The afpLockin
e600: 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
e610: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
e620: 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  afp lock specifi
e630: 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65  c state. */.type
e640: 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
e650: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
e660: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
e670: 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
e680: 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73  gContext {.  uns
e690: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
e6a0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a  sharedLockByte;.
e6b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
e6c0: 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75  lePath;.};..stru
e6d0: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
e6e0: 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
e6f0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
e700: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
e710: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
e720: 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
e730: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
e740: 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
e750: 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
e760: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
e770: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
e780: 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
e790: 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
e7a0: 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
e7b0: 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
e7c0: 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
e7d0: 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
e7e0: 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
e7f0: 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
e800: 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
e810: 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
e820: 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
e830: 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
e840: 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
e850: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e870: 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
e880: 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
e890: 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
e8a0: 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
e8b0: 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
e8c0: 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
e8d0: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
e8e0: 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a 20 2a  LockPB2)../* . *
e8f0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
e900: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
e910: 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
e920: 69 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74 61 74 69  ilure.. */.stati
e930: 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74 4c  c int _AFPFSSetL
e940: 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
e950: 72 20 2a 70 61 74 68 2c 20 0a 20 20 75 6e 69 78  r *path, .  unix
e960: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  File *pFile, .  
e970: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
e980: 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 75 6e  ng offset, .  un
e990: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
e9a0: 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e 74 20   length, .  int 
e9b0: 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a 20  setLockFlag.){. 
e9c0: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
e9d0: 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20 20 70  eLockPB2       p
e9e0: 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20 20  b;.  int        
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
ea00: 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
ea10: 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
ea20: 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
ea30: 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
ea40: 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
ea50: 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
ea60: 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
ea70: 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
ea80: 3e 68 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22  >h;.  OSTRACE5("
ea90: 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67 20  AFPLOCK setting 
eaa0: 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64 20 69  lock %s for %d i
eab0: 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
eac0: 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
ead0: 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
eae0: 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f  F"), pFile->h, o
eaf0: 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a  ffset, length);.
eb00: 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
eb10: 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
eb20: 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
eb30: 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
eb40: 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
eb50: 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
eb60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
eb70: 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50 4c    OSTRACE4("AFPL
eb80: 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
eb90: 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
eba0: 5c 6e 22 2c 20 70 61 74 68 2c 20 74 45 72 72 6e  \n", path, tErrn
ebb0: 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
ebc0: 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  no));.    rc = s
ebd0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
ebe0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ebf0: 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
ec00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ec10: 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
ec20: 55 4e 4c 4f 43 4b 29 3b 20 2f 2a 20 65 72 72 6f  UNLOCK); /* erro
ec30: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  r */.    if( IS_
ec40: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
ec50: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
ec60: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ec70: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
ec80: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
ec90: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
eca0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
ecb0: 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 72 65 73  /* AFP-style res
ecc0: 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65 63 6b  erved lock check
ecd0: 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ing following th
ece0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 0a 2a  e behavior of .*
ecf0: 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  * unixCheckReser
ed00: 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65  vedLock, see the
ed10: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
ed20: 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f 6e 20  edLock function 
ed30: 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74  comments */.stat
ed40: 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
ed50: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
ed60: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
ed70: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
ed80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ed90: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
eda0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
edb0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
edc0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
edd0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
ede0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
edf0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
ee00: 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
ee10: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
ee20: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
ee30: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
ee40: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
ee50: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
ee60: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
ee70: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
ee80: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
ee90: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
eea0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
eeb0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eec0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
eed0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
eee0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
eef0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
ef00: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
ef10: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
ef20: 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
ef30: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
ef40: 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
ef50: 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
ef60: 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  c = _AFPFSSetLoc
ef70: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
ef80: 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
ef90: 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
efa0: 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
efb0: 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
efc0: 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
efd0: 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
efe0: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
eff0: 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
f000: 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
f010: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
f020: 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
f030: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
f040: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
f050: 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
f060: 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
f070: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
f080: 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
f090: 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
f0a0: 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
f0b0: 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
f0c0: 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
f0d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
f0e0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
f0f0: 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
f100: 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
f110: 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41  }.  }.  .  OSTRA
f120: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
f130: 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70  K %d %d %d\n", p
f140: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
f150: 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a 70 52  erved);.  .  *pR
f160: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
f170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f180: 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c  ../* AFP-style l
f190: 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ocking following
f1a0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
f1b0: 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74   unixLock, see t
f1c0: 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20  he unixLock .** 
f1d0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  function comment
f1e0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66  s for details of
f1f0: 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74   lock management
f200: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
f210: 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
f220: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
f230: 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
f240: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f250: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f260: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
f270: 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
f280: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
f290: 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
f2a0: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
f2b0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
f2d0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
f2e0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
f2f0: 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %s pid=%d\n", 
f300: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
f310: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
f320: 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
f330: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
f340: 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64  ocktype), getpid
f350: 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ());..  /* If th
f360: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
f370: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
f380: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
f390: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
f3a0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
f3b0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
f3c0: 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
f3d0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
f3e0: 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74  as.  ** enterMut
f3f0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
f400: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
f410: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f420: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
f430: 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
f440: 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  3("LOCK    %d %s
f450: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
f460: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
f470: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
f480: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
f490: 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
f4a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
f4b0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f4c0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
f4d0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
f4e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
f4f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
f500: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
f510: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
f520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
f530: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
f540: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
f550: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
f560: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
f570: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
f580: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
f590: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
f5a0: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
f5b0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
f5c0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
f5d0: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e  hreads.  */.  en
f5e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
f5f0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
f600: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f  current thread o
f610: 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20  wns the pFile.. 
f620: 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73   */.  rc = trans
f630: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69  ferOwnership(pFi
f640: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
f650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f660: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
f670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
f680: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
f690: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
f6a0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
f6b0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
f6c0: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
f6d0: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
f6e0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
f6f0: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
f700: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
f710: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
f720: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
f730: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
f740: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
f750: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
f760: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
f770: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f780: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
f790: 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
f7a0: 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
f7b0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
f7c0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
f7d0: 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
f7e0: 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
f7f0: 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
f800: 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
f810: 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
f820: 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
f830: 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
f840: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
f850: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
f860: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
f870: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
f880: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f890: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
f8a0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
f8b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
f8c0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f8d0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c  K ){.    int lk,
f8e0: 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
f8f0: 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20 20 20  1Errno;.    .   
f900: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
f910: 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
f920: 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
f930: 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
f940: 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
f950: 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
f960: 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
f970: 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
f980: 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74  dom(); .    cont
f990: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
f9a0: 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66  yte = (lk & 0x7f
f9b0: 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
f9c0: 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
f9d0: 72 63 31 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  rc1 = _AFPFSSetL
f9e0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f9f0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  ePath, pFile, . 
fa00: 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
fa10: 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
fa20: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
fa30: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
fa40: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
fa50: 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
fa60: 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
fa70: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
fa80: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
fa90: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
faa0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
fab0: 32 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  2 = _AFPFSSetLoc
fac0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
fad0: 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
fae0: 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
faf0: 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
fb00: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
fb10: 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
fb20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
fb30: 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
fb40: 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
fb50: 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
fb60: 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
fb70: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fb80: 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
fb90: 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
fba0: 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
fbb0: 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
fbc0: 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
fbd0: 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
fbe0: 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
fbf0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
fc00: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
fc10: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
fc20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
fc30: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
fc40: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
fc50: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
fc60: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
fc70: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
fc80: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
fc90: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
fca0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
fcb0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
fcc0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
fcd0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
fce0: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
fcf0: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66  cktype );.    if
fd00: 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45   (locktype >= RE
fd10: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
fd20: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c  File->locktype <
fd30: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
fd40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
fd50: 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
fd60: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
fd70: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
fd80: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
fd90: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
fda0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
fdb0: 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1,1);.    }.    
fdc0: 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c  if (!failed && l
fdd0: 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55  ocktype == EXCLU
fde0: 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
fdf0: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
fe00: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
fe10: 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
fe20: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
fe30: 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
fe40: 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
fe50: 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
fe60: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
fe70: 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
fe80: 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
fe90: 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
fea0: 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
feb0: 2f 0a 20 20 20 20 20 20 69 66 20 28 21 28 66 61  /.      if (!(fa
fec0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
fed0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
fee0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  lePath, pFile, S
fef0: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
ff20: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
ff30: 31 2c 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20  1, 0))) {.      
ff40: 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
ff50: 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
ff60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
ff70: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
ff80: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
ff90: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ffa0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  ePath, pFile, SH
ffb0: 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
ffe0: 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
fff0: 20 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20       if (failed 
10000 26 26 20 28 66 61 69 6c 65 64 20 3d 20 5f 41 46  && (failed = _AF
10010 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
10020 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
10030 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
10050 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74  RED_FIRST + cont
10060 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
10070 79 74 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a 20  yte, 1, 1))) {. 
10080 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61           rc = fa
10090 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
100a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
100b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
100c0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
100d0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
100e0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
100f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
10100 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
10110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10120 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10130 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
10140 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
10150 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
10160 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
10170 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
10180 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
10190 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c  fp_end_lock:.  l
101a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
101b0 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
101c0 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
101d0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
101e0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
101f0 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
10200 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
10210 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
10220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10230 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
10240 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
10250 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
10260 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
10270 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
10280 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10290 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
102a0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
102b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
102c0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
102d0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
102e0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
102f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10300 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10310 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10320 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10330 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
10340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10350 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
10360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10370 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
10380 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10390 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
103a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
103b0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
103c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
103d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
103e0 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
103f0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
10400 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
10410 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
10420 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
10430 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
10440 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10450 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  e, getpid());.. 
10460 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
10470 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
10480 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
10490 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
104a0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
104b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
104c0 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
104d0 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
104e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
104f0 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e  MISUSE;.  }.  en
10500 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 6e  terMutex();.  in
10510 74 20 66 61 69 6c 65 64 20 3d 20 53 51 4c 49 54  t failed = SQLIT
10520 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46 69 6c  E_OK;.  if( pFil
10530 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
10540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
10550 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
10560 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  RED_LOCK ){..   
10570 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65     /* unlock the
10580 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
10590 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62   - then re-estab
105a0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
105b0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66  lock */.      if
105c0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
105d0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
105e0 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69  K) {.        fai
105f0 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
10600 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
10610 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  ePath, pFile, SH
10620 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
10650 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
10660 20 20 20 20 20 20 20 69 66 20 28 21 66 61 69 6c         if (!fail
10670 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ed) {.          
10680 2f 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  /* successfully 
10690 72 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c  removed the excl
106a0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
106b0 20 20 20 20 20 20 20 20 69 66 20 28 28 66 61 69          if ((fai
106c0 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
106d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
106e0 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  ePath, pFile, SH
106f0 41 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20  ARED_FIRST+.    
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
10720 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
10730 20 31 2c 20 31 29 29 29 20 7b 0a 20 20 20 20 20   1, 1))) {.     
10740 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64         /* failed
10750 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68   to re-establish
10760 20 6f 75 72 20 73 68 61 72 65 64 20 6c 6f 63 6b   our shared lock
10770 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10780 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
10790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
107a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
107b0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
107c0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
107d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
107e0 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
107f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
10800 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
10810 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
10820 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53  (failed = _AFPFS
10830 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
10840 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
10850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
10880 45 2c 20 31 2c 20 30 29 29 29 7b 0a 20 20 20 20  E, 1, 0))){.    
10890 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
108a0 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 65 6e   release the pen
108b0 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ding lock */.   
108c0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
108d0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
108e0 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20   .    if (rc == 
108f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
10900 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
10910 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
10920 20 20 20 20 20 69 66 20 28 28 66 61 69 6c 65 64       if ((failed
10930 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
10940 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
10950 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 45                RE
10980 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
10990 30 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  0))) {.        /
109a0 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65  * failed to rele
109b0 61 73 65 20 74 68 65 20 72 65 73 65 72 76 65 64  ase the reserved
109c0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
109d0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a   rc = failed;  .
109e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
109f0 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
10a00 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
10a10 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
10a20 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
10a30 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
10a40 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
10a70 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73  RST + context->s
10a80 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
10a90 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 0);.    if (fa
10aa0 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
10ab0 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a 20 20 20   = failed;  .   
10ac0 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20   }.  }.  if (rc 
10ad0 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  == SQLITE_OK).  
10ae0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10af0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10b00 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
10b10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10b20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
10b30 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
10b40 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
10b50 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
10b60 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
10b70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10b80 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
10b90 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
10ba0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10bb0 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
10bc0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10be0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
10bf0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
10c00 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
10c10 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 23 70  File(id);.}...#p
10c20 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b  ragma mark flock
10c30 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67  () style locking
10c40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c 6f 63  ../*.** The floc
10c50 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10c60 69 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f 0a 74  is not used.*/.t
10c70 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63  ypedef void floc
10c80 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
10c90 0a 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74 79 6c 65  ../* flock-style
10ca0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63   reserved lock c
10cb0 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  hecking followin
10cc0 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  g the behavior o
10cd0 66 20 0a 20 2a 2a 20 75 6e 69 78 43 68 65 63 6b  f . ** unixCheck
10ce0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65  ReservedLock, se
10cf0 65 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52  e the unixCheckR
10d00 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63  eservedLock func
10d10 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tion comments */
10d20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
10d30 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10d40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10d50 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
10d60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
10d70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
10d80 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
10d90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10da0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10db0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
10dc0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10dd0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10de0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
10df0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
10e00 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
10e10 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
10e20 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10e30 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10e40 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
10e50 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
10e60 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
10e70 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
10e80 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
10e90 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
10ea0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
10eb0 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
10ec0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
10ed0 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
10ee0 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
10ef0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f     int lrc = flo
10f00 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
10f10 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
10f20 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
10f30 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
10f40 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
10f50 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
10f60 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
10f70 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
10f80 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
10f90 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
10fa0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10fb0 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
10fc0 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
10fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
10fe0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10ff0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11000 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11010 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  _UNLOCK); .     
11020 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11030 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
11040 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11050 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11060 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
11070 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
11080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
11090 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
110a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
110b0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
110c0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
110d0 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
110e0 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
110f0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
11100 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11110 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11120 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11130 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
11140 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
11150 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
11160 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11170 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11180 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
11190 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
111a0 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52  STRACE4("TEST WR
111b0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e  -LOCK %d %d %d\n
111c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
111d0 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a   reserved);..  *
111e0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
111f0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
11200 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
11210 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
11220 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
11230 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74  ocktype) {.  int
11240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11250 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11260 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11270 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
11280 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
11290 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
112a0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
112b0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
112c0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
112d0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
112e0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
112f0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
11300 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
11310 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
11320 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
11330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11340 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11350 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11360 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11370 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c    if (flock(pFil
11380 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
11390 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
113a0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
113b0 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
113c0 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
113d0 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
113e0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
113f0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11400 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
11410 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
11420 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
11430 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
11440 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11450 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  no;.    }.  } el
11460 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
11470 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11480 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11490 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
114a0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
114b0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
114c0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
114d0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
114e0 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
114f0 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
11500 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
11510 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
11520 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
11530 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
11540 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
11550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11560 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11570 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11580 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11590 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
115a0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
115b0 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
115c0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
115d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
115e0 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
115f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11600 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
11610 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
11620 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
11630 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
11640 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
11650 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
11660 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
11670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11690 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
116a0 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
116b0 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
116c0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
116d0 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
116e0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
116f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
11700 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
11710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11720 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11730 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
11740 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74  unlock. */.  int
11750 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c   rc = flock(pFil
11760 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
11770 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20    if (rc) {.    
11780 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20  int r, tErrno = 
11790 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73  errno;.    r = s
117a0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
117b0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
117c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
117d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
117e0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20  S_LOCK_ERROR(r) 
117f0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
11800 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11810 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
11820 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65  turn r;.  } else
11830 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
11840 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
11850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
11870 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
11880 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11890 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
118a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
118b0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
118c0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
118d0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
118e0 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
118f0 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e  File(id);.}..#en
11900 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11910 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
11920 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
11930 29 20 2a 2f 0a 0a 23 70 72 61 67 6d 61 20 6d 61  ) */..#pragma ma
11940 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c  rk Old-School .l
11950 6f 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c  ock file based l
11960 6f 63 6b 69 6e 67 0a 0a 2f 2a 20 44 6f 74 6c 6f  ocking../* Dotlo
11970 63 6b 2d 73 74 79 6c 65 20 72 65 73 65 72 76 65  ck-style reserve
11980 64 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 20  d lock checking 
11990 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65  following the be
119a0 68 61 76 69 6f 72 20 6f 66 20 0a 2a 2a 20 75 6e  havior of .** un
119b0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
119c0 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69  ock, see the uni
119d0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
119e0 63 6b 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d  ck function comm
119f0 65 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  ents */.static i
11a00 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
11a10 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
11a20 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11a30 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
11a40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11a50 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
11a60 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
11a70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11a80 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
11a90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11ab0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11ac0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11ad0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
11ae0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
11af0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
11b00 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
11b10 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
11b20 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
11b30 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
11b40 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
11b50 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
11b60 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
11b70 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11b80 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
11b90 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
11ba0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  ){.    char *zLo
11bb0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11bc0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11bd0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75  ontext;.    stru
11be0 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
11bf0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c 73  .    .    if( ls
11c00 74 61 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 26  tat(zLockFile, &
11c10 73 74 61 74 42 75 66 29 3d 3d 30 20 29 7b 0a 20  statBuf)==0 ){. 
11c20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65 78 69       /* file exi
11c30 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  sts, someone els
11c40 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 2a  e has the lock *
11c50 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  /.      reserved
11c60 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
11c70 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64  .      /* file d
11c80 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77  oes not exist, w
11c90 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
11ca0 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
11cb0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
11cc0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
11cd0 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
11ce0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
11cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11d00 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11d10 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11d20 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11d30 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
11d40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11d50 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
11d60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11d70 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20 57  OSTRACE4("TEST W
11d80 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c  R-LOCK %d %d %d\
11d90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11da0 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20  , reserved);..  
11db0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
11dc0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
11dd0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
11de0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
11df0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11e00 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
11e10 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11e20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11e30 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61  .  int fd;.  cha
11e40 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
11e50 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
11e60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
11e70 69 6e 74 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  int rc=SQLITE_OK
11e80 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
11e90 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
11ea0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
11eb0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
11ec0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
11ed0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
11ee0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
11ef0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20  ile->locktype > 
11f00 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
11f10 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
11f20 20 6c 6f 63 6b 74 79 70 65 3b 0a 23 69 66 20 21   locktype;.#if !
11f30 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
11f40 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52   && !defined(_WR
11f50 53 5f 4b 45 52 4e 45 4c 29 20 20 20 20 0a 20 20  S_KERNEL)    .  
11f60 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
11f70 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
11f80 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
11f90 20 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 7a   */.    utimes(z
11fa0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11fb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
11fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11fd0 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64  goto dotlock_end
11fe0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
11ff0 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  /* check to see 
12000 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  if lock file alr
12010 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
12020 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
12030 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
12040 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73 74 61  t(zLockFile,&sta
12050 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20  tBuf) == 0){.   
12060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
12070 59 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62  Y; /* it does, b
12080 75 73 79 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  usy */.    goto 
12090 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63 6b  dotlock_end_lock
120a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
120b0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
120c0 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f  lock */.  fd = o
120d0 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f  pen(zLockFile,O_
120e0 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
120f0 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
12100 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  f( fd<0 ){.    /
12110 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
12120 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
12130 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  , someone else m
12140 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74  ay have stolen t
12150 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
12160 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12170 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
12180 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
12190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
121a0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
121b0 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
121c0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
121d0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
121e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
121f0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
12200 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
12210 20 29 7b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74   ){..pFile->last
12220 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12240 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65    goto dotlock_e
12250 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 20 0a 20 20  nd_lock;.  } .  
12260 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20  close(fd);.  .  
12270 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
12280 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
12290 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
122a0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
122b0 6b 74 79 70 65 3b 0a 0a 20 64 6f 74 6c 6f 63 6b  ktype;.. dotlock
122c0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
122d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
122e0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
122f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12300 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
12310 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
12320 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12330 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
12340 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
12350 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
12360 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61  ingContext;..  a
12370 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12380 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f    OSTRACE5("UNLO
12390 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
123a0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
123b0 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
123c0 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  .   pFile->lockt
123d0 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
123e0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
123f0 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
12400 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
12410 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
12420 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
12430 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
12440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
12460 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
12470 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
12480 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
12490 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
124a0 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
124b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
124c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
124d0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
124e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
124f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12500 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
12510 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
12520 28 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c  (unlink(zLockFil
12530 65 29 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  e) ) {.    int r
12540 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
12550 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  o;.    if( ENOEN
12560 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
12570 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12580 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12590 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
125a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
125b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
125c0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
125d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
125e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
125f0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
12600 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12610 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
12620 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
12630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12640 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
12650 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
12660 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12670 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
12680 65 20 2a 69 64 29 20 7b 0a 23 69 66 20 64 65 66  e *id) {.#if def
12690 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c  ined(__RTP__) ||
126a0 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45   defined(_WRS_KE
126b0 52 4e 45 4c 29 0a 20 20 69 6e 74 20 72 63 3b 0a  RNEL).  int rc;.
126c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 64 20  #endif.  if( id 
126d0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
126e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
126f0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
12700 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
12710 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
12720 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
12730 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
12740 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
12750 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66  (__RTP__) || def
12760 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
12770 29 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ).  enterMutex()
12780 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
12790 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 6c 65  ixFile(id);.  le
127a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
127b0 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20  turn rc;.#else. 
127c0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
127d0 78 46 69 6c 65 28 69 64 29 3b 0a 23 65 6e 64 69  xFile(id);.#endi
127e0 66 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  f.}..#if defined
127f0 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66  (__RTP__) || def
12800 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
12810 29 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  )..#pragma mark 
12820 50 4f 53 49 58 2f 76 78 57 6f 72 6b 73 20 6e 61  POSIX/vxWorks na
12830 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 62 61  med semaphore ba
12840 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 20  sed locking../* 
12850 4e 61 6d 65 64 73 65 6d 2d 73 74 79 6c 65 20 72  Namedsem-style r
12860 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65  eserved lock che
12870 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
12880 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
12890 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73  .** unixCheckRes
128a0 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74  ervedLock, see t
128b0 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  he unixCheckRese
128c0 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f  rvedLock functio
128d0 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74  n comments */.st
128e0 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 64 73 65  atic int namedse
128f0 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
12900 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12910 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
12920 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
12930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12940 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
12950 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12960 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12970 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
12980 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
12990 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
129a0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
129b0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
129c0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
129d0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
129e0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
129f0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
12a00 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12a10 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
12a20 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12a30 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12a40 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12a50 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12a60 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
12a70 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
12a80 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
12a90 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
12aa0 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3b 0a  e->pOpen->pSem;.
12ab0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
12ac0 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
12ad0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
12ae0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
12af0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12b00 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
12b10 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
12b20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12b30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12b40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12b50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
12b60 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12b70 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
12b80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12b90 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
12ba0 73 65 20 7b 0a 09 2f 2a 20 73 6f 6d 65 6f 6e 65  se {../* someone
12bb0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
12bc0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
12bd0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 09 72 65  n NO_LOCK */..re
12be0 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
12bf0 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53 48 41 52  >locktype < SHAR
12c00 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
12c10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
12c20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
12c30 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
12c40 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
12c50 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
12c60 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
12c70 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E4("TEST WR-LOCK
12c80 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 70 46   %d %d %d\n", pF
12c90 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
12ca0 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  rved);..  *pResO
12cb0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
12cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12cd0 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 64 73  tatic int nameds
12ce0 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
12cf0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
12d00 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
12d10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12d20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
12d30 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
12d40 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  Sem = pFile->pOp
12d50 65 6e 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  en->pSem;.  int 
12d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12d70 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
12d80 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
12d90 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
12da0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
12db0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
12dc0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
12dd0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
12de0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
12df0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12e00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
12e10 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 63 20  ocktype;.    rc 
12e20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12e30 20 67 6f 74 6f 20 6e 61 6d 65 64 73 65 6d 5f 65   goto namedsem_e
12e40 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
12e50 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
12e60 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
12e70 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
12e80 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
12e90 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
12ea0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
12eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
12ec0 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 61 6d 65 64  ;.    goto named
12ed0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
12ee0 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
12ef0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
12f00 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
12f10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
12f20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20 6e 61  = locktype;.. na
12f30 6d 65 64 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  medsem_end_lock:
12f40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f50 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
12f60 64 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  dsemUnlock(sqlit
12f70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12f80 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
12f90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12fa0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12fb0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
12fc0 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70 53  pFile->pOpen->pS
12fd0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
12fe0 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
12ff0 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
13000 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE5("UNLOCK  %d
13010 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
13020 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
13030 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70 46  locktype,..   pF
13040 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
13050 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65  etpid());.  asse
13060 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
13070 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
13080 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
13090 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
130a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
130b0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
130c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
130d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
130e0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
130f0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
13100 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
13110 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
13120 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f (locktype==SHA
13130 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
13140 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
13150 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
13160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13170 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
13180 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
13190 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
131a0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
131b0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
131c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
131d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
131e0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
131f0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13200 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
13210 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13220 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13230 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13240 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
13250 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
13260 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
13270 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
13280 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
13290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
132a0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
132b0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
132c0 61 6d 65 64 73 65 6d 43 6c 6f 73 65 28 73 71 6c  amedsemClose(sql
132d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
132e0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
132f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13300 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13310 3b 0a 20 20 20 20 6e 61 6d 65 64 73 65 6d 55 6e  ;.    namedsemUn
13320 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13330 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13340 46 69 6c 65 20 29 3b 0a 20 20 20 20 65 6e 74 65  File );.    ente
13350 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
13360 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
13370 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
13380 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
13390 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20  pFile->pOpen);. 
133a0 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
133b0 28 69 64 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d  (id);.    leaveM
133c0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
133d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133e0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
133f0 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c  ined(__RTP__) ||
13400 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45   defined(_WRS_KE
13410 52 4e 45 4c 29 20 2a 2f 0a 0a 23 65 6e 64 69 66  RNEL) */..#endif
13420 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13430 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13440 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f  */../*.** The no
13450 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
13460 78 74 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79  xt is void.*/.ty
13470 70 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63  pedef void noloc
13480 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
13490 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
134a0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
134b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
134c0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
134d0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
134e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
134f0 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f  tUsed);.  *pResO
13500 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
13510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
13520 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
13530 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13540 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
13550 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
13560 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
13570 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
13580 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13590 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
135a0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
135b0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
135c0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
135d0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
135e0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
135f0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
13600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13610 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13620 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
13630 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
13640 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
13650 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
13660 63 3b 0a 20 20 69 66 28 20 49 53 5f 56 58 57 4f  c;.  if( IS_VXWO
13670 52 4b 53 20 29 20 65 6e 74 65 72 4d 75 74 65 78  RKS ) enterMutex
13680 28 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  ();.  rc = close
13690 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
136a0 69 66 28 20 49 53 5f 56 58 57 4f 52 4b 53 20 29  if( IS_VXWORKS )
136b0 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
136c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
136d0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
136e0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
136f0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
13700 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
13710 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
13720 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
13730 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
13740 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
13750 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
13760 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
13770 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
13780 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
13790 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
137a0 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  )->locktype;.   
137b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
137c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
137d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
137e0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
137f0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
13800 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
13810 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
13820 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
13830 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
13840 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
13850 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
13860 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
13870 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
13880 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
13890 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
138a0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
138b0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
138c0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
138d0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
138e0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
138f0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
13900 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
13910 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
13920 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
13930 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
13940 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
13950 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
13960 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
13970 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
13980 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
13990 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
139a0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
139b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
139c0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
139d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
139e0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
139f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13a00 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
13a10 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
13a20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
13a30 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
13a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13a50 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
13a60 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
13a70 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
13a80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13a90 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
13aa0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13ab0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
13ac0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13ad0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
13ae0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
13af0 62 79 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  by pId..**.** Wh
13b00 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e  en locking exten
13b10 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65  sions are enable
13b20 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68 20  d, the filepath 
13b30 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  and locking styl
13b40 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65 64  e .** are needed
13b50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13b60 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68  e unixFile pMeth
13b70 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f  od to use for lo
13b80 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
13b90 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ..** The locking
13ba0 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20  -style specific 
13bb0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  lockingContext d
13bc0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
13bd0 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64   created .** and
13be0 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20 61   assigned here a
13bf0 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lso..*/.static i
13c00 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
13c10 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
13c20 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
13c30 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
13c40 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
13c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13c60 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
13c70 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
13c80 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
13c90 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20  */.  int dirfd, 
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13cb0 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
13cc0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
13cd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
13ce0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
13cf0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
13d00 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
13d10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13d20 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
13d30 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13d40 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
13d50 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20    int noLock,   
13d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
13d70 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75  t locking if tru
13d80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c  e */.  int isDel
13d90 65 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ete            /
13da0 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
13db0 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  e if true */.){.
13dc0 20 20 69 6e 74 20 65 4c 6f 63 6b 69 6e 67 53 74    int eLockingSt
13dd0 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
13de0 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
13df0 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
13e00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13e10 20 20 2f 2a 20 4d 61 63 72 6f 20 74 6f 20 64 65    /* Macro to de
13e20 66 69 6e 65 20 74 68 65 20 73 74 61 74 69 63 20  fine the static 
13e30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e 20 73  contents of an s
13e40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
13e50 73 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  s .  ** structur
13e60 65 20 66 6f 72 20 61 20 75 6e 69 78 20 62 61 63  e for a unix bac
13e70 6b 65 6e 64 20 66 69 6c 65 2e 20 44 69 66 66 65  kend file. Diffe
13e80 72 65 6e 74 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  rent locking met
13e90 68 6f 64 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  hods.  ** requir
13ea0 65 20 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63  e different func
13eb0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 78 43  tions for the xC
13ec0 6c 6f 73 65 2c 20 78 4c 6f 63 6b 2c 20 78 55 6e  lose, xLock, xUn
13ed0 6c 6f 63 6b 20 61 6e 64 0a 20 20 2a 2a 20 78 43  lock and.  ** xC
13ee0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13ef0 20 6d 65 74 68 6f 64 73 2e 0a 20 20 2a 2f 0a 20   methods..  */. 
13f00 20 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f   #define IOMETHO
13f10 44 53 28 78 43 6c 6f 73 65 2c 20 78 4c 6f 63 6b  DS(xClose, xLock
13f20 2c 20 78 55 6e 6c 6f 63 6b 2c 20 78 43 68 65 63  , xUnlock, xChec
13f30 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 20 7b  kReservedLock) {
13f40 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
13f70 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
13f90 0a 20 20 20 20 78 43 6c 6f 73 65 2c 20 20 20 20  .    xClose,    
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
13fe0 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14000 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 57       \.    unixW
14030 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
14040 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
14050 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 5c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61  \.    unixTrunca
14080 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
14090 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
140a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
140b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
140c0 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140e0 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
14110 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
14120 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
14130 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 5c 0a 20 20 20 20 78 4c 6f 63 6b 2c 20 20 20   \.    xLock,   
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
141a0 20 20 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20    xUnlock,      
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
141c0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 43 68         \.    xCh
141f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
14200 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
14210 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
14220 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
14230 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65    \.    unixFile
14240 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
14250 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
14260 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
14280 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
14290 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
142a0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
142d0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
142e0 72 69 73 74 69 63 73 20 20 20 2f 2a 20 78 44 65  ristics   /* xDe
142f0 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
14300 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
14310 20 20 20 5c 0a 20 20 7d 0a 20 20 73 74 61 74 69     \.  }.  stati
14320 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  c sqlite3_io_met
14330 68 6f 64 73 20 61 49 6f 4d 65 74 68 6f 64 5b 5d  hods aIoMethod[]
14340 20 3d 20 7b 0a 20 20 20 20 49 4f 4d 45 54 48 4f   = {.    IOMETHO
14350 44 53 28 75 6e 69 78 43 6c 6f 73 65 2c 20 75 6e  DS(unixClose, un
14360 69 78 4c 6f 63 6b 2c 20 75 6e 69 78 55 6e 6c 6f  ixLock, unixUnlo
14370 63 6b 2c 20 75 6e 69 78 43 68 65 63 6b 52 65 73  ck, unixCheckRes
14380 65 72 76 65 64 4c 6f 63 6b 29 20 0a 20 20 20 2c  ervedLock) .   ,
14390 49 4f 4d 45 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b  IOMETHODS(nolock
143a0 43 6c 6f 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63  Close, nolockLoc
143b0 6b 2c 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  k, nolockUnlock,
143c0 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
143d0 72 76 65 64 4c 6f 63 6b 29 0a 23 69 66 20 53 51  rvedLock).#if SQ
143e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
143f0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 2c 49 4f  ING_STYLE.   ,IO
14400 4d 45 54 48 4f 44 53 28 64 6f 74 6c 6f 63 6b 43  METHODS(dotlockC
14410 6c 6f 73 65 2c 20 64 6f 74 6c 6f 63 6b 4c 6f 63  lose, dotlockLoc
14420 6b 2c 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  k, dotlockUnlock
14430 2c 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73  ,dotlockCheckRes
14440 65 72 76 65 64 4c 6f 63 6b 29 0a 23 69 66 20 64  ervedLock).#if d
14450 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
14460 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f  || defined(_WRS_
14470 4b 45 52 4e 45 4c 29 0a 20 20 20 2c 49 4f 4d 45  KERNEL).   ,IOME
14480 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73  THODS(nolockClos
14490 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e  e, nolockLock, n
144a0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c  olockUnlock, nol
144b0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
144c0 4c 6f 63 6b 29 0a 20 20 20 2c 49 4f 4d 45 54 48  Lock).   ,IOMETH
144d0 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  ODS(nolockClose,
144e0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c   nolockLock, nol
144f0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63  ockUnlock, noloc
14500 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
14510 63 6b 29 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44  ck).   ,IOMETHOD
14520 53 28 6e 61 6d 65 64 73 65 6d 43 6c 6f 73 65 2c  S(namedsemClose,
14530 20 6e 61 6d 65 64 73 65 6d 4c 6f 63 6b 2c 20 6e   namedsemLock, n
14540 61 6d 65 64 73 65 6d 55 6e 6c 6f 63 6b 2c 20 6e  amedsemUnlock, n
14550 61 6d 65 64 73 65 6d 43 68 65 63 6b 52 65 73 65  amedsemCheckRese
14560 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6c 73 65 0a  rvedLock).#else.
14570 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28 66 6c     ,IOMETHODS(fl
14580 6f 63 6b 43 6c 6f 73 65 2c 20 66 6c 6f 63 6b 4c  ockClose, flockL
14590 6f 63 6b 2c 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  ock, flockUnlock
145a0 2c 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  , flockCheckRese
145b0 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20 2c 49 4f  rvedLock).   ,IO
145c0 4d 45 54 48 4f 44 53 28 61 66 70 43 6c 6f 73 65  METHODS(afpClose
145d0 2c 20 61 66 70 4c 6f 63 6b 2c 20 61 66 70 55 6e  , afpLock, afpUn
145e0 6c 6f 63 6b 2c 20 61 66 70 43 68 65 63 6b 52 65  lock, afpCheckRe
145f0 73 65 72 76 65 64 4c 6f 63 6b 29 0a 20 20 20 2c  servedLock).   ,
14600 49 4f 4d 45 54 48 4f 44 53 28 6e 6f 6c 6f 63 6b  IOMETHODS(nolock
14610 43 6c 6f 73 65 2c 20 6e 6f 6c 6f 63 6b 4c 6f 63  Close, nolockLoc
14620 6b 2c 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  k, nolockUnlock,
14630 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
14640 72 76 65 64 4c 6f 63 6b 29 0a 23 65 6e 64 69 66  rvedLock).#endif
14650 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 2f  .#endif.  };.  /
14660 2a 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 74  * The order of t
14670 68 65 20 49 4f 4d 45 54 48 4f 44 53 20 6d 61 63  he IOMETHODS mac
14680 72 6f 73 20 61 62 6f 76 65 20 69 73 20 69 6d 70  ros above is imp
14690 6f 72 74 61 6e 74 2e 20 20 49 74 20 6d 75 73 74  ortant.  It must
146a0 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   be the.  ** sam
146b0 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20 4c  e order as the L
146c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 6e 75 6d  OCKING_STYLE num
146d0 62 65 72 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  bers.  */.  asse
146e0 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  rt(LOCKING_STYLE
146f0 5f 50 4f 53 49 58 3d 3d 31 29 3b 0a 20 20 61 73  _POSIX==1);.  as
14700 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59  sert(LOCKING_STY
14710 4c 45 5f 4e 4f 4e 45 3d 3d 32 29 3b 0a 20 20 61  LE_NONE==2);.  a
14720 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54  ssert(LOCKING_ST
14730 59 4c 45 5f 44 4f 54 46 49 4c 45 3d 3d 33 29 3b  YLE_DOTFILE==3);
14740 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e  .  assert(LOCKIN
14750 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 3d 3d 34  G_STYLE_FLOCK==4
14760 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b  );.  assert(LOCK
14770 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 3d 3d 35  ING_STYLE_AFP==5
14780 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b  );.  assert(LOCK
14790 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45 44 53  ING_STYLE_NAMEDS
147a0 45 4d 3d 3d 36 29 3b 0a 0a 20 20 61 73 73 65 72  EM==6);..  asser
147b0 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d  t( pNew->pLock==
147c0 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
147d0 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e  ( pNew->pOpen==N
147e0 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ULL );..  OSTRAC
147f0 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
14800 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
14810 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65  name);    .  pNe
14820 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
14830 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
14840 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
14850 70 4e 65 77 29 3b 0a 0a 23 69 66 20 64 65 66 69  pNew);..#if defi
14860 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20  ned(__RTP__) || 
14870 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
14880 4e 45 4c 29 0a 20 20 7b 0a 20 20 20 20 48 61 73  NEL).  {.    Has
14890 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
148a0 20 20 63 68 61 72 20 2a 7a 52 65 61 6c 6e 61 6d    char *zRealnam
148b0 65 20 3d 20 76 78 72 65 61 6c 70 61 74 68 28 7a  e = vxrealpath(z
148c0 46 69 6c 65 6e 61 6d 65 2c 20 31 29 3b 0a 20 20  Filename, 1);.  
148d0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4e 65    int n;.    pNe
148e0 77 2d 3e 7a 52 65 61 6c 70 61 74 68 20 3d 20 30  w->zRealpath = 0
148f0 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 65 61 6c  ;.    if( !zReal
14900 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 72 63  name ){.      rc
14910 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14920 0a 20 20 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53  .      eLockingS
14930 74 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53  tyle = LOCKING_S
14940 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  TYLE_NONE;.    }
14950 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
14960 73 74 72 6c 65 6e 28 7a 52 65 61 6c 6e 61 6d 65  strlen(zRealname
14970 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 65 6e 74  ) + 1;.      ent
14980 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
14990 20 70 45 6c 65 6d 20 3d 20 73 71 6c 69 74 65 33   pElem = sqlite3
149a0 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 26 6e 61  HashFindElem(&na
149b0 6d 65 48 61 73 68 2c 20 7a 52 65 61 6c 6e 61 6d  meHash, zRealnam
149c0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  e, n);.      if(
149d0 20 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20   pElem ){.      
149e0 20 20 6c 6f 6e 67 20 63 6e 74 20 3d 20 28 6c 6f    long cnt = (lo
149f0 6e 67 29 70 45 6c 65 6d 2d 3e 64 61 74 61 3b 0a  ng)pElem->data;.
14a00 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
14a10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 52 65         pNew->zRe
14a20 61 6c 70 61 74 68 20 3d 20 70 45 6c 65 6d 2d 3e  alpath = pElem->
14a30 70 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 45  pKey;.        pE
14a40 6c 65 6d 2d 3e 64 61 74 61 20 3d 20 28 76 6f 69  lem->data = (voi
14a50 64 2a 29 63 6e 74 3b 0a 20 20 20 20 20 20 7d 65  d*)cnt;.      }e
14a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
14a70 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
14a80 72 74 28 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52  rt(&nameHash, zR
14a90 65 61 6c 6e 61 6d 65 2c 20 6e 2c 20 28 76 6f 69  ealname, n, (voi
14aa0 64 2a 29 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  d*)1)==0 ){.    
14ab0 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 73 71        pElem = sq
14ac0 6c 69 74 65 33 48 61 73 68 46 69 6e 64 45 6c 65  lite3HashFindEle
14ad0 6d 28 26 6e 61 6d 65 48 61 73 68 2c 20 7a 52 65  m(&nameHash, zRe
14ae0 61 6c 6e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  alname, n);.    
14af0 20 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d 20        if( pElem 
14b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14b10 4e 65 77 2d 3e 7a 52 65 61 6c 70 61 74 68 20 3d  New->zRealpath =
14b20 20 70 45 6c 65 6d 2d 3e 70 4b 65 79 3b 0a 20 20   pElem->pKey;.  
14b30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14b40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14b50 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6e 61  e3HashInsert(&na
14b60 6d 65 48 61 73 68 2c 20 7a 52 65 61 6c 6e 61 6d  meHash, zRealnam
14b70 65 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, n, 0);.      
14b80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14b90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
14ba0 20 20 20 20 20 65 4c 6f 63 6b 69 6e 67 53 74 79       eLockingSty
14bb0 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  le = LOCKING_STY
14bc0 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  LE_NONE;.       
14bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 65 61       }.      lea
14bf0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
14c00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
14c10 65 61 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ealname);.    }.
14c20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
14c30 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( noLock ){.    
14c40 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  eLockingStyle = 
14c50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f  LOCKING_STYLE_NO
14c60 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
14c70 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   eLockingStyle =
14c80 20 64 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74   detectLockingSt
14c90 79 6c 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  yle(pVfs, zFilen
14ca0 61 6d 65 2c 20 68 29 3b 0a 20 20 7d 0a 0a 20 20  ame, h);.  }..  
14cb0 73 77 69 74 63 68 28 20 65 4c 6f 63 6b 69 6e 67  switch( eLocking
14cc0 53 74 79 6c 65 20 29 7b 0a 0a 20 20 20 20 63 61  Style ){..    ca
14cd0 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  se LOCKING_STYLE
14ce0 5f 50 4f 53 49 58 3a 20 7b 0a 20 20 20 20 20 20  _POSIX: {.      
14cf0 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 23 69  enterMutex();.#i
14d00 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  f defined(__RTP_
14d10 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57  _) || defined(_W
14d20 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20 20  RS_KERNEL).     
14d30 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
14d40 66 6f 28 68 2c 20 70 4e 65 77 2d 3e 7a 52 65 61  fo(h, pNew->zRea
14d50 6c 70 61 74 68 2c 20 26 70 4e 65 77 2d 3e 70 4c  lpath, &pNew->pL
14d60 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
14d70 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  n);.#else.      
14d80 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
14d90 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63  o(h, &pNew->pLoc
14da0 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29  k, &pNew->pOpen)
14db0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6c  ;.#endif.      l
14dc0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
14dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14de0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
14df0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14e00 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
14e10 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
14e20 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
14e30 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e  .    case LOCKIN
14e40 47 5f 53 54 59 4c 45 5f 41 46 50 3a 20 7b 0a 20  G_STYLE_AFP: {. 
14e50 20 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b       /* AFP lock
14e60 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
14e70 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
14e80 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
14e90 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  d in.      ** th
14ea0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
14eb0 65 78 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ext..      */.  
14ec0 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
14ed0 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
14ee0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
14ef0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
14f00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
14f10 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
14f20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  ;.      if( pCtx
14f30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
14f40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14f50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14f60 20 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46         /* NB: zF
14f70 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
14f80 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
14f90 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
14fa0 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
14fb0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
14fc0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
14fd0 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
14fe0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
14ff0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f   a.        ** co
15000 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
15010 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  me. */.        p
15020 43 74 78 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20  Ctx->filePath = 
15030 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
15040 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
15050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15060 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
15070 69 66 0a 0a 20 20 20 20 63 61 73 65 20 4c 4f 43  if..    case LOC
15080 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49  KING_STYLE_DOTFI
15090 4c 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  LE: {.      /* D
150a0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
150b0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
150c0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
150d0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
150e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74        ** the dot
150f0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
15100 78 74 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  xt .      */.   
15110 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
15120 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  le;.      int nF
15130 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ilename;.      n
15140 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65  Filename = strle
15150 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
15160 3b 0a 20 20 20 20 20 20 7a 4c 6f 63 6b 46 69 6c  ;.      zLockFil
15170 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
15180 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
15190 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
151a0 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
151b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
151c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
151d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
151e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
151f0 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
15200 63 6b 46 69 6c 65 2c 20 22 25 73 2e 6c 6f 63 6b  ckFile, "%s.lock
15210 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
15220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
15230 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
15240 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
15250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15260 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  }..#if defined(_
15270 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
15280 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
15290 20 20 20 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47      case LOCKING
152a0 5f 53 54 59 4c 45 5f 4e 41 4d 45 44 53 45 4d 3a  _STYLE_NAMEDSEM:
152b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   {.      /* Name
152c0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
152d0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
152e0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
152f0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a  ds to be.      *
15300 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
15310 65 20 6e 61 6d 65 64 73 65 6d 4c 6f 63 6b 69 6e  e namedsemLockin
15320 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 20 20 2a  gContext.      *
15330 2f 0a 20 20 20 20 20 20 65 6e 74 65 72 4d 75 74  /.      enterMut
15340 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
15350 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c   findLockInfo(h,
15360 20 70 4e 65 77 2d 3e 7a 52 65 61 6c 70 61 74 68   pNew->zRealpath
15370 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
15380 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
15390 20 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51       if( (rc==SQ
153a0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
153b0 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d  w->pOpen->pSem==
153c0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
153d0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
153e0 3d 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61  = pNew->pOpen->a
153f0 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  SemName;.       
15400 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
15410 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
15420 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
15430 53 65 6d 4e 61 6d 65 2c 20 22 25 73 2e 73 65 6d  SemName, "%s.sem
15440 22 2c 20 70 4e 65 77 2d 3e 7a 52 65 61 6c 70 61  ", pNew->zRealpa
15450 74 68 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  th);.        for
15460 28 20 6e 3d 30 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=0; zSemName[
15470 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
15480 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
15490 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
154a0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
154b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65        pNew->pOpe
154c0 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  n->pSem = sem_op
154d0 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
154e0 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
154f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
15500 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d  ->pOpen->pSem ==
15510 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
15520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15540 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65        pNew->pOpe
15550 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  n->aSemName[0] =
15560 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
15570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
15580 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
15590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
155a0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
155b0 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
155c0 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
155d0 45 52 4e 45 4c 29 0a 20 20 20 20 63 61 73 65 20  ERNEL).    case 
155e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c  LOCKING_STYLE_FL
155f0 4f 43 4b 3a 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK: .#endif.   
15600 20 63 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54   case LOCKING_ST
15610 59 4c 45 5f 4e 4f 4e 45 3a 20 0a 20 20 20 20 20  YLE_NONE: .     
15620 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20   break;.#endif. 
15630 20 7d 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61   }.  .  pNew->la
15640 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
15650 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f   defined(__RTP__
15660 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52  ) || defined(_WR
15670 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 69 66 28 20  S_KERNEL).  if( 
15680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15690 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
156a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
156b0 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
156c0 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
156d0 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
156e0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
156f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15700 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
15710 65 28 64 69 72 66 64 29 3b 0a 20 20 20 20 63 6c  e(dirfd);.    cl
15720 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  ose(h);.  }else{
15730 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
15740 6f 64 20 3d 20 26 61 49 6f 4d 65 74 68 6f 64 5b  od = &aIoMethod[
15750 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2d 31 5d  eLockingStyle-1]
15760 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
15770 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
15780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15790 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
157a0 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
157b0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
157c0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
157d0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
157e0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
157f0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
15800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15810 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
15820 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
15830 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
15840 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
15850 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
15860 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
15870 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
15880 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
15890 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
158a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
158b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
158c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
158d0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
158e0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
158f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
15900 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
15910 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
15920 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
15930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
15940 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
15950 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
15960 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
15970 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
15980 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
15990 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
159a0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
159b0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
159c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
159d0 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  i=strlen(zDirnam
159e0 65 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69  e); ii>=0 && zDi
159f0 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
15a00 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
15a10 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
15a20 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
15a30 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72    fd = open(zDir
15a40 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
15a50 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
15a60 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
15a70 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
15a80 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20        fcntl(fd, 
15a90 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66  F_SETFD, fcntl(f
15aa0 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
15ab0 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
15ac0 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
15ad0 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
15ae0 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
15af0 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rname);.    }.  
15b00 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
15b10 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
15b20 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f  QLITE_OK:SQLITE_
15b30 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a  CANTOPEN);.}../*
15b40 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
15b50 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
15b60 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
15b70 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
15b80 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
15b90 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
15ba0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
15bb0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
15bc0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
15bd0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
15be0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
15bf0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
15c00 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
15c10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
15c20 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
15c30 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
15c40 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
15c50 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
15c60 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
15c70 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
15c80 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
15c90 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
15ca0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
15cb0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
15cc0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
15cd0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
15ce0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
15cf0 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
15d00 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
15d10 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
15d20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20  *zDir = ".";..  
15d30 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
15d40 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
15d50 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
15d60 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
15d70 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
15d80 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
15d90 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
15da0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
15db0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
15dc0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
15dd0 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
15de0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15df0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
15e00 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
15e10 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
15e20 65 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d  ectory;.  for(i=
15e30 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
15e40 7a 44 69 72 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  zDirs); i++){.  
15e50 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d    if( azDirs[i]=
15e60 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
15e70 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69     if( stat(azDi
15e80 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63  rs[i], &buf) ) c
15e90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15ea0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
15eb0 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
15ec0 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73  e;.    if( acces
15ed0 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29  s(azDirs[i], 07)
15ee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15ef0 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69   zDir = azDirs[i
15f00 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
15f10 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
15f20 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
15f30 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
15f40 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
15f50 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
15f60 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
15f70 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
15f80 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
15f90 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
15fa0 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
15fb0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
15fc0 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28  EFIX) + 17) >= (
15fd0 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
15fe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15ff0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
16000 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
16010 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c  nprintf(nBuf-17,
16020 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
16030 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
16040 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
16050 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
16060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
16070 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
16080 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
16090 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
160a0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
160b0 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
160c0 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
160d0 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
160e0 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
160f0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
16100 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
16110 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c  le( access(zBuf,
16120 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
16130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16140 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
16150 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
16160 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
16170 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
16180 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
16190 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
161a0 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
161b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
161c0 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
161d0 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
161e0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
161f0 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
16200 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
16210 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
16220 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
16230 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
16240 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
16250 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
16260 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
16270 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
16280 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
16290 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
162a0 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
162b0 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
162c0 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
162d0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
162e0 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
162f0 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
16300 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
16310 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
16320 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
16330 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
16340 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
16350 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
16360 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
16370 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
16380 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
16390 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
163a0 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
163b0 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
163c0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
163d0 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
163e0 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
163f0 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
16400 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
16410 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
16420 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
16430 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
16440 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
16450 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
16460 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16470 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67  File,.  int flag
16480 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
16490 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20  ags.){.  int fd 
164a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
164b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
164c0 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
164d0 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
164e0 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d  .  int dirfd = -
164f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16500 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
16510 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
16520 2f 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d  /.  int oflags =
16530 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16540 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
16550 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
16560 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
16570 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
16580 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
16590 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
165a0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165c0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
165d0 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
165e0 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
165f0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
16600 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
16610 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
16620 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
16630 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16640 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
16650 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
16660 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
16670 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
16680 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
16690 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
166a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
166b0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
166c0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
166d0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
166e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
166f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  );..  /* If crea
16700 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
16710 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
16720 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
16730 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
16740 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
16750 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
16760 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
16770 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
16780 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
16790 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
167a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
167b0 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
167c0 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
167d0 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65    */.  int isOpe
167e0 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73  nDirectory = (is
167f0 43 72 65 61 74 65 20 26 26 20 0a 20 20 20 20 20  Create && .     
16800 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f   (eType==SQLITE_
16810 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
16820 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
16830 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
16840 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20  OURNAL).  );..  
16850 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
16860 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
16870 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
16880 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
16890 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
168a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
168b0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
168c0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
168d0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
168e0 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
168f0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
16900 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16910 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
16920 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
16930 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
16940 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
16950 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
16960 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
16970 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
16980 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
16990 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
169a0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
169b0 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
169c0 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
169d0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
169e0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
169f0 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
16a00 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
16a10 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
16a20 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
16a30 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
16a40 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
16a50 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
16a60 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
16a70 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
16a80 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
16a90 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
16aa0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
16ab0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
16ac0 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
16ad0 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
16ae0 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
16af0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
16b00 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
16b10 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
16b20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
16b30 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
16b40 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  al, and master j
16b50 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
16b60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
16b70 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f   ** deleted.  */
16b80 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
16b90 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
16ba0 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65  IN_DB || !isDele
16bb0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
16bc0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
16bd0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
16be0 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
16bf0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
16c00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
16c10 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21  TER_JOURNAL || !
16c20 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  isDelete );..  /
16c30 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
16c40 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
16c50 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
16c60 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
16c70 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
16c80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
16c90 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
16ca0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
16cb0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
16cc0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
16cd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
16ce0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
16cf0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
16d00 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
16d10 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
16d20 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
16d30 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
16d40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
16d50 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
16d60 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
16d70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
16d80 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
16d90 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
16da0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
16db0 29 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d  ));..  if( !zNam
16dc0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
16dd0 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
16de0 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44  lete && !isOpenD
16df0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72  irectory);.    r
16e00 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
16e10 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
16e20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
16e30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16e40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16e50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
16e60 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
16e70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
16e80 61 64 6f 6e 6c 79 20 29 20 20 6f 66 6c 61 67 73  adonly )  oflags
16e90 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
16ea0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
16eb0 29 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  ) oflags |= O_RD
16ec0 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
16ed0 74 65 20 29 20 20 20 20 6f 66 6c 61 67 73 20 7c  te )    oflags |
16ee0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
16ef0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
16f00 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  flags |= (O_EXCL
16f10 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
16f20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  oflags |= (O_LAR
16f30 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
16f40 3b 0a 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  ;..  fd = open(z
16f50 4e 61 6d 65 2c 20 6f 66 6c 61 67 73 2c 20 69 73  Name, oflags, is
16f60 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49  Delete?0600:SQLI
16f70 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
16f80 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
16f90 4f 53 54 52 41 43 45 34 28 22 4f 50 45 4e 58 20  OSTRACE4("OPENX 
16fa0 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
16fb0 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 66 6c  , fd, zName, ofl
16fc0 61 67 73 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ags);.  if( fd<0
16fd0 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
16fe0 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
16ff0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
17000 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65   ){.    /* Faile
17010 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
17020 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
17030 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
17040 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
17050 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
17060 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17070 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
17080 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20  ATE);.    flags 
17090 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
170a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74  EADONLY;.    ret
170b0 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66  urn unixOpen(pVf
170c0 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c  s, zPath, pFile,
170d0 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
170e0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  s);.  }.  if( fd
170f0 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
17100 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
17110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65  ;.  }.  if( isDe
17120 6c 65 74 65 20 29 7b 0a 23 69 66 20 64 65 66 69  lete ){.#if defi
17130 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20  ned(__RTP__) || 
17140 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
17150 4e 45 4c 29 0a 20 20 20 20 7a 50 61 74 68 20 3d  NEL).    zPath =
17160 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
17170 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b    unlink(zName);
17180 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
17190 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
171a0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
171b0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73  flags;.  }..  as
171c0 73 65 72 74 28 66 64 21 3d 30 29 3b 0a 20 20 69  sert(fd!=0);.  i
171d0 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  f( isOpenDirecto
171e0 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ry ){.    int rc
171f0 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
17200 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
17210 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17230 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 20  close(fd);.     
17240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17250 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
17260 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
17270 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
17280 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
17290 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
172a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
172b0 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
172c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
172d0 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 6c 49  ;.  return fillI
172e0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
172f0 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
17300 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
17310 20 69 73 44 65 6c 65 74 65 29 3b 0a 7d 0a 0a 2f   isDelete);.}../
17320 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
17330 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
17340 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
17350 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
17360 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
17370 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
17380 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
17390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
173a0 75 6e 69 78 44 65 6c 65 74 65 28 73 71 6c 69 74  unixDelete(sqlit
173b0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
173c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
173d0 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
173e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
173f0 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
17400 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
17410 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
17420 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
17430 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
17440 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61  E);.  unlink(zPa
17450 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  th);.#ifndef SQL
17460 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
17470 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e  YNC.  if( dirSyn
17480 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
17490 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
174a0 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
174b0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
174c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
174d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  f defined(__RTP_
174e0 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57  _) || defined(_W
174f0 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20 20  RS_KERNEL).     
17500 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
17510 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
17520 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
17530 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
17540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17550 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
17560 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
17570 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
17580 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
17590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
175a0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
175b0 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63  istance of or ac
175c0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
175d0 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
175e0 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
175f0 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
17600 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
17610 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
17620 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
17630 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
17640 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
17650 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
17660 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
17670 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
17680 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
17690 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
176a0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
176b0 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
176c0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
176d0 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
176e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
176f0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
17700 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
17710 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
17720 4e 6f 74 55 73 65 64 2c 20 0a 20 20 63 6f 6e 73  NotUsed, .  cons
17730 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a  t char *zPath, .
17740 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20    int flags, .  
17750 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a  int *pResOut.){.
17760 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
17770 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17780 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
17790 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
177a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
177b0 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
177c0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
177d0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
177e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
177f0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
17800 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
17810 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
17820 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
17830 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
17840 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
17850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
17860 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
17870 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
17880 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
17890 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
178a0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
178b0 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
178c0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
178d0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
178e0 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
178f0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65  amode)==0);.  re
17900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17910 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
17920 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
17930 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
17940 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
17950 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
17960 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
17970 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
17980 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
17990 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
179a0 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
179b0 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
179c0 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
179d0 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
179e0 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
179f0 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
17a00 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
17a10 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
17a20 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
17a30 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
17a40 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
17a50 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
17a60 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
17a70 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
17a80 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
17a90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17aa0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
17ab0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17ac0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
17ad0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
17ae0 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
17af0 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17b20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
17b30 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
17b40 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
17b60 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
17b70 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
17b80 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
17b90 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
17ba0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
17bb0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
17bc0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
17bd0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
17be0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
17bf0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
17c00 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
17c10 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
17c20 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
17c30 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
17c40 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
17c50 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6c 79  working directly
17c60 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
17c70 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
17c80 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17c90 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
17ca0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
17cb0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
17cc0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
17cd0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52  .#if defined(__R
17ce0 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  TP__) || defined
17cf0 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20  (_WRS_KERNEL).  
17d00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 61  {.    char *zRea
17d10 6c 6e 61 6d 65 20 3d 20 76 78 72 65 61 6c 70 61  lname = vxrealpa
17d20 74 68 28 7a 50 61 74 68 2c 20 30 29 3b 0a 20 20  th(zPath, 0);.  
17d30 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 27 5c 30 27    zOut[0] = '\0'
17d40 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 65 61 6c  ;.    if( !zReal
17d50 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 72 65  name ){.      re
17d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
17d70 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OPEN;.    }.    
17d80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
17d90 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
17da0 22 2c 20 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a 20  ", zRealname);. 
17db0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17dc0 7a 52 65 61 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  zRealname);.    
17dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17de0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7a 4f  ;.  }.#else.  zO
17df0 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
17e00 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
17e10 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
17e20 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
17e30 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
17e40 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
17e50 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
17e60 20 20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a      if( getcwd(z
17e70 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
17e80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17e90 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
17ea0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
17eb0 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  = strlen(zOut);.
17ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
17ed0 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20  intf(nOut-nCwd, 
17ee0 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25  &zOut[nCwd], "/%
17ef0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  s", zPath);.  }.
17f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f10 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a  OK;..#if 0.  /*.
17f20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f    ** Remove "/./
17f30 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20  " path elements 
17f40 61 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f  and convert "/A/
17f50 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74  ./" path element
17f60 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22  s.  ** to just "
17f70 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  /"..  */.  if( z
17f80 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  Full ){.    int 
17f90 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d  i, j;.    for(i=
17fa0 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69  j=0; zFull[i]; i
17fb0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
17fc0 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Full[i]=='/' ){.
17fd0 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c          if( zFul
17fe0 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  l[i+1]=='/' ) co
17ff0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
18000 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
18010 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32  '.' && zFull[i+2
18020 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
18030 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
18040 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18060 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d    if( zFull[i+1]
18070 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
18080 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c  +2]=='.' && zFul
18090 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  l[i+3]=='/' ){. 
180a0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
180b0 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31  j>0 && zFull[j-1
180c0 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d  ]!='/' ){ j--; }
180d0 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
180e0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  3;.          con
180f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
18100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
18110 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c  Full[j++] = zFul
18120 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l[i];.    }.    
18130 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20  zFull[j] = 0;.  
18140 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
18150 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
18160 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
18170 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
18180 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
18190 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
181a0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
181b0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
181c0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
181d0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
181e0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
181f0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
18200 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
18210 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
18220 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
18230 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
18240 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
18250 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
18260 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
18270 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
18280 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
18290 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
182a0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
182b0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
182c0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
182d0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
182e0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
182f0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
18300 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
18310 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
18320 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
18330 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
18340 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
18350 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
18360 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
18370 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
18380 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
18390 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
183a0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
183b0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
183c0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
183d0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
183e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
183f0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
18400 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
18410 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
18420 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a  ufOut){.  char *
18430 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
18440 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
18450 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28  );.  enterMutex(
18460 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
18470 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
18480 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
18490 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
184a0 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
184b0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61 76  Err);.  }.  leav
184c0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
184d0 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53  ic void *unixDlS
184e0 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
184f0 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
18500 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
18510 61 72 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 55  ar*zSymbol){.  U
18520 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18530 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
18540 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65  rn dlsym(pHandle
18550 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74  , zSymbol);.}.st
18560 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
18570 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
18580 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
18590 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
185a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
185b0 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
185c0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
185d0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
185e0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
185f0 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
18600 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
18610 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
18620 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
18630 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
18640 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
18650 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
18660 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
18670 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
18680 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
18690 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
186a0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
186b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
186c0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
186d0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
186e0 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
186f0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
18700 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
18710 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
18720 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
18730 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
18740 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
18750 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
18760 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
18770 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
18780 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
18790 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
187a0 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
187b0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
187c0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
187d0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
187e0 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
187f0 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
18800 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
18810 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
18820 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
18830 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
18840 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
18850 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
18860 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
18870 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
18880 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
18890 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
188a0 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
188b0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
188c0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
188d0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
188e0 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
188f0 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
18900 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
18910 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
18920 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
18930 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
18940 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
18950 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
18960 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
18970 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
18980 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
18990 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
189a0 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
189b0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
189c0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
189d0 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
189e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
189f0 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
18a00 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
18a10 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
18a20 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
18a30 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
18a40 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
18a50 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
18a60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
18a70 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
18a80 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
18a90 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
18aa0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
18ab0 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
18ac0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
18ad0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
18ae0 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
18af0 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
18b00 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
18b10 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
18b20 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
18b30 65 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  e{.      nBuf = 
18b40 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
18b50 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
18b60 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
18b70 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
18b80 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
18b90 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
18ba0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
18bb0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
18bc0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
18bd0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
18be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
18bf0 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
18c00 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
18c10 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
18c20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18c30 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
18c40 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
18c50 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
18c60 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
18c70 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
18c80 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
18c90 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
18ca0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
18cb0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
18cc0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
18cd0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
18ce0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
18cf0 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
18d00 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
18d10 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
18d20 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 64 65  seconds){.#if de
18d30 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c  fined(__RTP__) |
18d40 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b  | defined(_WRS_K
18d50 45 52 4e 45 4c 29 0a 20 20 73 74 72 75 63 74 20  ERNEL).  struct 
18d60 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
18d70 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
18d80 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
18d90 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
18da0 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
18db0 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
18dc0 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
18dd0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 72 65  &sp, NULL);.  re
18de0 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
18df0 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
18e00 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
18e10 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
18e20 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
18e30 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ds);.  return mi
18e40 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
18e50 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
18e60 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
18e70 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
18e80 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
18e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
18ea0 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
18eb0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
18ec0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
18ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
18ee0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
18ef0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
18f00 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
18f10 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
18f20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
18f30 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
18f40 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
18f50 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
18f60 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
18f70 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
18f80 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
18f90 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
18fa0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
18fb0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
18fc0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
18fd0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
18fe0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
18ff0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
19000 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
19010 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
19020 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
19030 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
19040 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
19050 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
19060 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
19070 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
19080 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
19090 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
190a0 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65   *prNow){.#if de
190b0 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c  fined(__RTP__) |
190c0 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b  | defined(_WRS_K
190d0 45 52 4e 45 4c 29 0a 20 20 73 74 72 75 63 74 20  ERNEL).  struct 
190e0 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
190f0 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
19100 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
19110 73 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  sNow);.  *prNow 
19120 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
19130 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
19140 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  0 + sNow.tv_nsec
19150 2f 38 36 34 30 30 30 30 30 30 30 30 30 30 30 2e  /86400000000000.
19160 30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  0;.#elif defined
19170 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
19180 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
19190 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
191a0 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
191b0 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74  87.5;.#else.  st
191c0 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
191d0 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
191e0 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
191f0 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e  prNow = 2440587.
19200 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f  5 + sNow.tv_sec/
19210 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74  86400.0 + sNow.t
19220 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30  v_usec/864000000
19230 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  00.0;.#endif..#i
19240 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19250 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
19260 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
19270 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
19280 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
19290 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
192a0 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
192b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
192c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
192d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
192e0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
192f0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
19300 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
19310 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
19320 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
19330 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19340 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
19350 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
19360 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
19370 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
19380 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
19390 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
193a0 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
193b0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
193c0 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
193d0 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
193e0 69 64 29 7b 20 0a 20 20 2f 2a 20 4d 61 63 72 6f  id){ .  /* Macro
193f0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 73   to define the s
19400 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73 20 6f  tatic contents o
19410 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  f an sqlite3_vfs
19420 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 0a 20   structure for. 
19430 20 2a 2a 20 74 68 65 20 75 6e 69 78 20 62 61 63   ** the unix bac
19440 6b 65 6e 64 2e 20 54 68 65 20 74 77 6f 20 70 61  kend. The two pa
19450 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
19460 20 76 61 6c 75 65 73 20 74 6f 20 75 73 65 20 66   values to use f
19470 6f 72 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  or.  ** the sqli
19480 74 65 33 5f 76 66 73 2e 7a 4e 61 6d 65 20 61 6e  te3_vfs.zName an
19490 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 41  d sqlite3_vfs.pA
194a0 70 70 44 61 74 61 20 66 69 65 6c 64 73 2c 20 72  ppData fields, r
194b0 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
194c0 2a 20 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  * .  */.  #defin
194d0 65 20 55 4e 49 58 56 46 53 28 7a 56 66 73 4e 61  e UNIXVFS(zVfsNa
194e0 6d 65 2c 20 70 56 66 73 41 70 70 44 61 74 61 29  me, pVfsAppData)
194f0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
19500 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
19550 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
19560 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
19590 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
195a0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
195c0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
195d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
195e0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
195f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19600 20 20 7a 56 66 73 4e 61 6d 65 2c 20 20 20 20 20    zVfsName,     
19610 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
19620 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
19630 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
19640 28 76 6f 69 64 20 2a 29 70 56 66 73 41 70 70 44  (void *)pVfsAppD
19650 61 74 61 2c 20 20 2f 2a 20 70 41 70 70 44 61 74  ata,  /* pAppDat
19660 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
19670 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
19680 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
19690 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
196c0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
196d0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
19700 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
19710 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
19740 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
19750 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
19760 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19770 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
19780 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
19790 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
197b0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
197c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
197d0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
197e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
197f0 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
19800 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
19810 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
19820 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
19830 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
19840 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
19850 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
19860 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
19870 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
19880 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
19890 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
198a0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
198b0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
198c0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
198f0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
19900 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
19910 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
19920 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
19930 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a  astError      /*
19940 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
19950 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
19960 5c 0a 20 20 7d 0a 0a 20 20 73 74 61 74 69 63 20  \.  }..  static 
19970 73 71 6c 69 74 65 33 5f 76 66 73 20 75 6e 69 78  sqlite3_vfs unix
19980 56 66 73 20 3d 20 55 4e 49 58 56 46 53 28 22 75  Vfs = UNIXVFS("u
19990 6e 69 78 22 2c 20 30 29 3b 0a 23 69 66 20 53 51  nix", 0);.#if SQ
199a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
199b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
199c0 69 3b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  i;.  static sqli
199d0 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
199e0 20 7b 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22   {.    UNIXVFS("
199f0 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 4c  unix-posix",   L
19a00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53  OCKING_STYLE_POS
19a10 49 58 29 2c 20 0a 20 20 20 20 55 4e 49 58 56 46  IX), .    UNIXVF
19a20 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20  S("unix-afp",   
19a30 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f    LOCKING_STYLE_
19a40 41 46 50 29 2c 20 0a 20 20 20 20 55 4e 49 58 56  AFP), .    UNIXV
19a50 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c  FS("unix-flock",
19a60 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
19a70 5f 46 4c 4f 43 4b 29 2c 20 0a 20 20 20 20 55 4e  _FLOCK), .    UN
19a80 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66  IXVFS("unix-dotf
19a90 69 6c 65 22 2c 20 4c 4f 43 4b 49 4e 47 5f 53 54  ile", LOCKING_ST
19aa0 59 4c 45 5f 44 4f 54 46 49 4c 45 29 2c 20 0a 20  YLE_DOTFILE), . 
19ab0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
19ac0 2d 6e 6f 6e 65 22 2c 20 20 20 20 4c 4f 43 4b 49  -none",    LOCKI
19ad0 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 29 2c 0a  NG_STYLE_NONE),.
19ae0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
19af0 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 4c 4f 43 4b  x-namedsem",LOCK
19b00 49 4e 47 5f 53 54 59 4c 45 5f 4e 41 4d 45 44 53  ING_STYLE_NAMEDS
19b10 45 4d 29 2c 0a 20 20 7d 3b 0a 20 20 66 6f 72 28  EM),.  };.  for(
19b20 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
19b30 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
19b40 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
19b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
19b60 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
19b70 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  i], 0);.  }.#end
19b80 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
19b90 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
19ba0 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
19bb0 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
19bc0 74 28 26 6e 61 6d 65 48 61 73 68 2c 20 31 29 3b  t(&nameHash, 1);
19bd0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
19be0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
19bf0 75 6e 69 78 56 66 73 2c 20 31 29 3b 0a 20 20 72  unixVfs, 1);.  r
19c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19c10 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64   .}../*.** Shutd
19c20 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e  own the operatin
19c30 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
19c40 63 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  ce. This is a no
19c50 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  -op for unix..*/
19c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
19c70 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65  end(void){ .  re
19c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
19c90 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}. .#endif /* S
19ca0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f  QLITE_OS_UNIX */
19cb0 0a                                               .