/ Hex Artifact Content
Login

Artifact 800138f4b9e2c26c89b0f8085441ec188fd5c19e:


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 31   os_unix.c,v 1.1
01d0: 38 39 20 32 30 30 38 2f 30 36 2f 32 35 20 31 37  89 2008/06/25 17
01e0: 3a 31 39 3a 30 31 20 64 61 6e 69 65 6c 6b 31 39  :19:01 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 4f 53 5f 55 4e 49 58 20 20  h".#if OS_UNIX  
0220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0230: 68 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64  his file is used
0240: 20 6f 6e 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f   on unix only */
0250: 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 53 51 4c  ../* #define SQL
0260: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0270: 4e 47 5f 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f  NG_STYLE 0 */../
0280: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0290: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
02a0: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
02b0: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
02c0: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
02d0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
02e0: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
02f0: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
0300: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
0310: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
0320: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
0330: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
0340: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
0350: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0360: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0370: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0380: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0390: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
03a0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
03b0: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
03c0: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
03d0: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
03e0: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
03f0: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
0400: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
0410: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
0420: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
0430: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
0440: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
0450: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0460: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0470: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0480: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0490: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
04a0: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
04b0: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
04c0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
04d0: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
04e0: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
04f0: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
0500: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
0510: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
0520: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
0530: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
0540: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
0550: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0560: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0570: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0580: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0590: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
05a0: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
05b0: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
05c0: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
05d0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
05e0: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
05f0: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
0600: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0610: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0620: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
0630: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0640: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
0650: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23  lude <errno.h>.#
0660: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0670: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0680: 45 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  E.#include <sys/
0690: 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64  ioctl.h>.#includ
06a0: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
06b0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f  #include <sys/mo
06c0: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a  unt.h>.#endif /*
06d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
06e0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
06f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
0700: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
0710: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
0720: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
0730: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
0740: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0750: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
0760: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
0770: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
0780: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
0790: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
07a0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
07b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
07c0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
07d0: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
07e0: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
07f0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0800: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
0810: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0820: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
0830: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
0840: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0850: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
0860: 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23  ath-length..*/.#
0870: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e  define MAX_PATHN
0880: 41 4d 45 20 35 31 32 0a 0a 0a 2f 2a 0a 2a 2a 20  AME 512.../*.** 
0890: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
08a0: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
08b0: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
08c0: 6c 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20  le specific for 
08d0: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74  the unix.** prot
08e0: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
08f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0900: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
0910: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
0920: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
0930: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
0940: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
0950: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
0960: 65 6e 74 72 79 20 2a 2f 0a 23 69 66 64 65 66 20  entry */.#ifdef 
0970: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
0980: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
0990: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
09a0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
09b0: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
09c0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
09d0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
09e0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
09f0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
0a00: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
0a10: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
0a20: 69 66 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e  if.  struct open
0a30: 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 2f  Cnt *pOpen;    /
0a40: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c  * Info about all
0a50: 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20 74 68   open fd's on th
0a60: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74  is inode */.  st
0a70: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
0a80: 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66 6f 20  Lock;   /* Info 
0a90: 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74  about locks on t
0aa0: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23 69 66  his inode */.#if
0ab0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0ac0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ad0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
0ae0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c  ontext;     /* L
0af0: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65  ocking style spe
0b00: 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 23  cific state */.#
0b10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0b20: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0b30: 54 59 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  TYLE */.  int h;
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
0b60: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
0b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f  unsigned char lo
0b80: 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54 68 65  cktype;   /* The
0b90: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
0ba0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
0bb0: 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20 20  .  int dirfd;   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0bd0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
0be0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
0bf0: 79 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  y */.#if SQLITE_
0c00: 54 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68  THREADSAFE.  pth
0c10: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0c20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0c30: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0c40: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
0c50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0c60: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
0c70: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
0c80: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
0c90: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
0ca0: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
0cb0: 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f  .** Define vario
0cc0: 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61  us macros that a
0cd0: 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  re missing from 
0ce0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  some systems..*/
0cf0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .#ifndef O_LARGE
0d00: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
0d10: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
0d20: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
0d30: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75  _DISABLE_LFS.# u
0d40: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
0d50: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
0d60: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
0d70: 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f  ifndef O_NOFOLLO
0d80: 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46  W.# define O_NOF
0d90: 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23  OLLOW 0.#endif.#
0da0: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a  ifndef O_BINARY.
0db0: 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52  # define O_BINAR
0dc0: 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  Y 0.#endif../*.*
0dd0: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
0de0: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
0df0: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
0e00: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
0e10: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
0e20: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
0e30: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
0e40: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
0e50: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
0e60: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
0e70: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0e80: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
0e90: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
0ea0: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
0eb0: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
0ec0: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
0ed0: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
0ee0: 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c  _.# define fcntl
0ef0: 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66  (A,B,C) 0.#endif
0f00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
0f10: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
0f20: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
0f30: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
0f40: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
0f50: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
0f60: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
0f70: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
0f80: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
0f90: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
0fa0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
0fb0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
0fc0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68  ./*.** Set or ch
0fd0: 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65  eck the unixFile
0fe0: 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69  .tid field.  Thi
0ff0: 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77  s field is set w
1000: 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a  hen an unixFile.
1010: 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  ** is first open
1020: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
1030: 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20  ent uses of the 
1040: 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20  unixFile verify 
1050: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
1060: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
1070: 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78  ting on the unix
1080: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
1090: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
10a0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
10b0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
10c0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
10d0: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
10e0: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
10f0: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
1100: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1110: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
1120: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
1130: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1140: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1150: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1160: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
1170: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
1180: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
1190: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
11a0: 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69  -01-15):  unixFi
11b0: 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20  le can be moved 
11c0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20  from one thread 
11d0: 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73  to.** another as
11e0: 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20   long as we are 
11f0: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73  running on a sys
1200: 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74  tem that support
1210: 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65  s threads.** ove
1220: 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68  rriding each oth
1230: 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68  ers locks (which
1240: 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f   now the most co
1250: 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a  mmon behavior).*
1260: 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73  * or if no locks
1270: 20 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20   are held.  But 
1280: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f  the unixFile.pLo
1290: 63 6b 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74  ck field needs t
12a0: 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74  o be.** recomput
12b0: 65 64 20 62 65 63 61 75 73 65 20 69 74 73 20 6b  ed because its k
12c0: 65 79 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  ey includes the 
12d0: 74 68 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20  thread-id.  See 
12e0: 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72  the .** transfer
12f0: 4f 77 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63  Ownership() func
1300: 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61  tion below for a
1310: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1320: 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ation.*/.#if SQL
1330: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1340: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
1350: 41 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74  ADID(X)   (X)->t
1360: 69 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  id = pthread_sel
1370: 66 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  f().# define CHE
1380: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28  CK_THREADID(X) (
1390: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
13a0: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d  achOthersLocks==
13b0: 30 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20  0 && \.         
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61     !pthread_equa
13e0: 6c 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72  l((X)->tid, pthr
13f0: 65 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c  ead_self())).#el
1400: 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f  se.# define SET_
1410: 54 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65  THREADID(X).# de
1420: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
1430: 44 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a  DID(X) 0.#endif.
1440: 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74  ./*.** Here is t
1450: 68 65 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58  he dirt on POSIX
1460: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a   advisory locks:
1470: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
1480: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
1490: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
14a0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
14b0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
14c0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
14d0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
14e0: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
14f0: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
1500: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
1510: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
1520: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
1530: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
1540: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
1550: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
1560: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
1570: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
1580: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1590: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
15a0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
15b0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
15c0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
15d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
15e0: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
15f0: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
1600: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
1610: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
1620: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
1630: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
1640: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
1650: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
1660: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
1670: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
1680: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
1690: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
16a0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
16b0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
16c0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
16d0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16e0: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
16f0: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
1700: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
1710: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
1720: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
1730: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
1740: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
1750: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
1760: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
1770: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
1780: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
1790: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
17a0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
17b0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
17c0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
17d0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
17e0: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
17f0: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
1800: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
1810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1820: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
1830: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
1840: 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49  **.** Bummer.  I
1850: 66 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68  f you ask me, th
1860: 69 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42  is is broken.  B
1870: 61 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74  adly broken.  It
1880: 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77   means.** that w
1890: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
18a0: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
18b0: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
18c0: 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d  ess among.** com
18d0: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
18e0: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
18f0: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
1900: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
1910: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
1920: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
1930: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
1940: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
1950: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
1960: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
1970: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
1980: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
1990: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
19a0: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
19b0: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
19c0: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
19d0: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
19e0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
19f0: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
1a00: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
1a10: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
1a20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a30: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
1a40: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1a50: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
1a60: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
1a70: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
1a80: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
1a90: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
1aa0: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
1ab0: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
1ac0: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
1ad0: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
1ae0: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
1af0: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
1b00: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
1b10: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
1b20: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
1b30: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
1b40: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
1b50: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
1b60: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
1b70: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
1b80: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1b90: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
1ba0: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
1bb0: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
1bc0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
1bd0: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
1be0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
1bf0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
1c00: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1c10: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
1c20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
1c30: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1c40: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
1c50: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
1c60: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1c70: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
1c80: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
1c90: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
1ca0: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
1cb0: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
1cc0: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
1cd0: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
1ce0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1cf0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1d00: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1d10: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1d20: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1d30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1d40: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1d50: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1d60: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1d70: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
1d80: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
1d90: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
1da0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
1db0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
1dc0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
1dd0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1de0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1df0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1e00: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1e10: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1e20: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1e30: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1e40: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1e50: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1e60: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1e70: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
1e80: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
1e90: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
1ea0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
1eb0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
1ec0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
1ed0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
1ee0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
1ef0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
1f00: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
1f10: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
1f20: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
1f30: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
1f40: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
1f50: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
1f60: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
1f70: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
1f80: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
1f90: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
1fa0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
1fb0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
1fc0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
1fd0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
1fe0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
1ff0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
2000: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
2010: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
2020: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2030: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2040: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2050: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2060: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
2070: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
2080: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2090: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
20a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
20b0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
20c0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
20d0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
20e0: 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69  re.** per open i
20f0: 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e  node, which mean
2100: 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  s that multiple 
2110: 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f 69  unixFile can poi
2120: 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  nt to a single.*
2130: 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e  * openCnt.  When
2140: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2150: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
2160: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
2170: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
2180: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
2190: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
21a0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
21b0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
21c0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
21d0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
21e0: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
21f0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
2200: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
2210: 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  The openCnt stru
2220: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
2230: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
2240: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
2250: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
2260: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
2270: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
2280: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
2290: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
22a0: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74  ars..**.** First
22b0: 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68  , under Linux th
22c0: 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20 65  reads, because e
22d0: 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 61  ach thread has a
22e0: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f   separate.** pro
22f0: 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70  cess ID, lock op
2300: 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20  erations in one 
2310: 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76  thread do not ov
2320: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
2330: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
2340: 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   in other thread
2350: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2360: 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a  s behave like.**
2370: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
2380: 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73 70  ses in this resp
2390: 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f  ect.  But, if yo
23a0: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a  u close a file.*
23b0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20  * descriptor in 
23c0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61  linux threads, a
23d0: 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65  ll locks are cle
23e0: 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73  ared, even locks
23f0: 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72  .** on other thr
2400: 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68  eads and even th
2410: 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20 74  ough the other t
2420: 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66 66  hreads have diff
2430: 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73  erent.** process
2440: 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72   IDs.  Linux thr
2450: 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73  eads is inconsis
2460: 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73  tent in this res
2470: 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65  pect..** (I'm be
2480: 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b  ginning to think
2490: 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65   that linux thre
24a0: 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e  ads is an abomin
24b0: 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54  ation too.).** T
24c0: 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f  he consequence o
24d0: 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68  f this all is th
24e0: 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  at the hash tabl
24f0: 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e  e for the lockIn
2500: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
2510: 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  has to include t
2520: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61 73  he process id as
2530: 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79   part of its key
2540: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b   because.** lock
2550: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74  s in different t
2560: 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61 74  hreads are treat
2570: 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20  ed as distinct. 
2580: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65   But the .** ope
2590: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 73  nCnt structure s
25a0: 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64  hould not includ
25b0: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64  e the process id
25c0: 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62   in its.** key b
25d0: 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63  ecause close() c
25e0: 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c  lears lock on al
25f0: 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a  l threads, not j
2600: 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ust the current.
2610: 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72 65  ** thread.  Were
2620: 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73   it not for this
2630: 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69   goofiness in li
2640: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65 20  nux threads, we 
2650: 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65  could.** combine
2660: 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e   the lockInfo an
2670: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
2680: 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ures into a sing
2690: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  le structure..**
26a0: 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a  .** 2004-Jun-28:
26b0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73  .** On some vers
26c0: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74  ions of linux, t
26d0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
26e0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
26f0: 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68  locks..** On oth
2700: 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69  ers not.  Someti
2710: 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e  mes you can chan
2720: 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ge the behavior 
2730: 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  on the same.** s
2740: 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67  ystem by setting
2750: 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b   the LD_ASSUME_K
2760: 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e  ERNEL environmen
2770: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65  t variable.  The
2780: 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61  .** POSIX standa
2790: 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20  rd is silent as 
27a0: 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69 6f  to which behavio
27b0: 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73  r is correct, as
27c0: 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e   far.** as I can
27d0: 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20   tell, so other 
27e0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
27f0: 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65 20   might show the 
2800: 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73  same.** inconsis
2810: 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73  tency.  There is
2820: 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74   no little doubt
2830: 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74   in my mind that
2840: 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f   posix.** adviso
2850: 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e  ry locks and lin
2860: 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20 70  ux threads are p
2870: 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e  rofoundly broken
2880: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
2890: 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e  around the incon
28a0: 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68  sistencies, we h
28b0: 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20 72  ave to test at r
28c0: 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68  untime .** wheth
28d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
28e0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
28f0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2900: 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20  .  This test.** 
2910: 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65  is run once, the
2920: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
2930: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
2940: 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a  d.  A static .**
2950: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
2960: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72   to record the r
2970: 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74  esults of this t
2980: 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a  est for future.*
2990: 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  * use..*/../*.**
29a0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
29b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
29c0: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
29d0: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
29e0: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
29f0: 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66  rticular lockInf
2a00: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
2a10: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
2a20: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
2a30: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
2a40: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c  ch others locks,
2a50: 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68 65   then we set the
2a60: 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20  .** lockKey.tid 
2a70: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
2a80: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
2a90: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
2aa0: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
2ab0: 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69  locks then tid i
2ac0: 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
2ad0: 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d  zero.  tid is om
2ae0: 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20 63  itted.** if we c
2af0: 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74  ompile without t
2b00: 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74  hreading support
2b10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b  ..*/.struct lock
2b20: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
2b30: 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69  v;       /* Devi
2b40: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
2b50: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
2b60: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
2b70: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
2b80: 52 45 41 44 53 41 46 45 0a 20 20 70 74 68 72 65  READSAFE.  pthre
2b90: 61 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54  ad_t tid;   /* T
2ba0: 68 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f  hread ID or zero
2bb0: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
2bc0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2bd0: 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  her */.#endif.};
2be0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2bf0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2c00: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2c10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
2c20: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
2c30: 64 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61  de on each threa
2c40: 64 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  d with a differe
2c50: 6e 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20  nt process ID.  
2c60: 28 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a  (Threads have.**
2c70: 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
2c80: 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c  ss IDs on linux,
2c90: 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74   but not on most
2ca0: 20 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a   other unixes.).
2cb0: 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69  **.** A single i
2cc0: 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75  node can have mu
2cd0: 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63  ltiple file desc
2ce0: 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68  riptors, so each
2cf0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
2d00: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
2d10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2d20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
2d30: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73   object and this
2d40: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73  .** object keeps
2d50: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
2d60: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69  number of unixFi
2d70: 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  le pointing to i
2d80: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2d90: 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  kInfo {.  struct
2da0: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f   lockKey key;  /
2db0: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2de0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
2df0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  ocks held */.  i
2e00: 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  nt locktype;    
2e10: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
2e20: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
2e30: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
2e40: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
2e50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e60: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
2e70: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
2e80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
2e90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2ea0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2eb0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
2ec0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
2ed0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
2ee0: 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73 74 72  ular openCnt str
2ef0: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
2f00: 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a   inode.  This.**
2f10: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2f20: 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65  the lockKey exce
2f30: 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65  pt that the thre
2f40: 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64  ad ID is omitted
2f50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e  ..*/.struct open
2f60: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
2f70: 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e  v;   /* Device n
2f80: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74  umber */.  ino_t
2f90: 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65   ino;   /* Inode
2fa0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   number */.};../
2fb0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2fc0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2fd0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2fe0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2ff0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
3000: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3010: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
3020: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
3030: 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  cks on that.** i
3040: 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f 73  node.  If a clos
3050: 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  e is attempted a
3060: 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20  gainst an inode 
3070: 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a  that is holding.
3080: 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c  ** locks, the cl
3090: 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ose is deferred 
30a0: 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20  until all locks 
30b0: 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67 20  clear by adding 
30c0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
30d0: 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f  riptor to be clo
30e0: 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64 69  sed to the pendi
30f0: 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ng list..*/.stru
3100: 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73  ct openCnt {.  s
3110: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
3120: 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  y;   /* The look
3130: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
3140: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3160: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
3170: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3180: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
3190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31a0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
31b0: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
31c0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  nding;         /
31d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  * Number of pend
31e0: 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72  ing close() oper
31f0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
3200: 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20  *aPending;      
3210: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70    /* Malloced sp
3220: 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73  ace holding fd's
3230: 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73   awaiting a clos
3240: 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  e() */.};../* .*
3250: 2a 20 54 68 65 73 65 20 68 61 73 68 20 74 61 62  * These hash tab
3260: 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65 73 20 61  les map inodes a
3270: 6e 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  nd file descript
3280: 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20 6c 6f 63  ors (really, loc
3290: 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e  kKey and.** open
32a0: 4b 65 79 20 73 74 72 75 63 74 75 72 65 73 29 20  Key structures) 
32b0: 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e  into lockInfo an
32c0: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
32d0: 75 72 65 73 2e 20 20 41 63 63 65 73 73 20 74 6f  ures.  Access to
32e0: 20 0a 2a 2a 20 74 68 65 73 65 20 68 61 73 68 20   .** these hash 
32f0: 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20 70  tables must be p
3300: 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 6d 75  rotected by a mu
3310: 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48  tex..*/.static H
3320: 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b  ash lockHash = {
3330: 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41  SQLITE_HASH_BINA
3340: 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  RY, 0, 0, 0, 0, 
3350: 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20  0};.static Hash 
3360: 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51 4c 49  openHash = {SQLI
3370: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3380: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
33a0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
33b0: 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f  YLE./*.** The lo
33c0: 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61 72 65  cking styles are
33d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33e0: 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 66   the different f
33f0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
3400: 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 70 70  apabilities supp
3410: 6f 72 74 65 64 20 62 79 20 64 69 66 66 65 72 65  orted by differe
3420: 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  nt file systems.
3430: 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c    .**.** POSIX l
3440: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66 75 6c  ocking style ful
3450: 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68 61 72  ly supports shar
3460: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
3470: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
3480: 73 20 0a 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e  s .** ADP lockin
3490: 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  g only supports 
34a0: 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
34b0: 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c  ange locks.** FL
34c0: 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  OCK only support
34d0: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d  s a single file-
34e0: 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69 76 65  global exclusive
34f0: 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b   lock.** DOTLOCK
3500: 20 69 73 6e 27 74 20 61 20 74 72 75 65 20 6c 6f   isn't a true lo
3510: 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69 74 20  cking style, it 
3520: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 75 73  refers to the us
3530: 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c 0a 2a  e of a special.*
3540: 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64 20 74  *   file named t
3550: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64  he same as the d
3560: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
3570: 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65  h a '.lock' exte
3580: 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20  nsion, this.**  
3590: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
35a0: 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61  file systems tha
35b0: 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61  t do not offer a
35c0: 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69 6c 65  ny reliable file
35d0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c   locking.** NO l
35e0: 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74 68 61  ocking means tha
35f0: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
3600: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3610: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3620: 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d  d for.**   read-
3630: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
3640: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55  s currently.** U
3650: 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61 6e 73  NSUPPORTED means
3660: 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67   that no locking
3670: 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74   will be attempt
3680: 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  ed, this is only
3690: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66   used for.**   f
36a0: 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61 74  ile systems that
36b0: 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   are known to be
36c0: 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a   unsupported.*/.
36d0: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20  typedef enum {. 
36e0: 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
36f0: 6c 65 20 3d 20 30 2c 20 20 20 20 20 20 20 2f 2a  le = 0,       /*
3700: 20 73 74 61 6e 64 61 72 64 20 70 6f 73 69 78 2d   standard posix-
3710: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 2a  advisory locks *
3720: 2f 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74  /.  afpLockingSt
3730: 79 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yle,            
3740: 20 2f 2a 20 75 73 65 20 61 66 70 20 6c 6f 63 6b   /* use afp lock
3750: 73 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  s */.  flockLock
3760: 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20  ingStyle,       
3770: 20 20 20 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b      /* use flock
3780: 28 29 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  () */.  dotlockL
3790: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
37a0: 20 20 20 20 20 2f 2a 20 75 73 65 20 3c 66 69 6c       /* use <fil
37b0: 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65 73 20 2a 2f  e>.lock files */
37c0: 0a 20 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c  .  noLockingStyl
37d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
37e0: 2f 2a 20 75 73 65 66 75 6c 20 66 6f 72 20 72 65  /* useful for re
37f0: 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73  ad-only file sys
3800: 74 65 6d 20 2a 2f 0a 20 20 75 6e 73 75 70 70 6f  tem */.  unsuppo
3810: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
3820: 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61 74        /* indicat
3830: 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66  es unsupported f
3840: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20  ile system */.} 
3850: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
3860: 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  yle;.#endif /* S
3870: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3880: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
3890: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
38a0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
38b0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
38c0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
38d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38e0: 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20 20  enterMutex(){.  
38f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3900: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
3910: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
3920: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
3930: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
3940: 64 20 6c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a  d leaveMutex(){.
3950: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3960: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
3970: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
3980: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
3990: 45 52 29 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ER));.}..#if SQL
39a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 2f  ITE_THREADSAFE./
39b0: 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62  *.** This variab
39c0: 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  le records wheth
39d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
39e0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
39f0: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
3a00: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
3a10: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
3a20: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
3a30: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
3a40: 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ..**    1:  Yes.
3a50: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
3a60: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
3a70: 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d  rs locks..**   -
3a80: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
3a90: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
3aa0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
3ab0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
3ac0: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
3ad0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
3ae0: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
3af0: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
3b00: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
3b10: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
3b20: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
3b30: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
3b40: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
3b50: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
3b60: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
3b70: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
3b80: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
3b90: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
3ba0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3bb0: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
3bc0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
3bd0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
3be0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
3bf0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
3c00: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
3c10: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
3c20: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
3c30: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
3c40: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
3c50: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
3c60: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
3c70: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
3c80: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
3c90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
3ca0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
3cb0: 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  DE_LOCK.# define
3cc0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3cd0: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a  VERRIDE_LOCK -1.
3ce0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
3cf0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68  LITE_TEST.int th
3d00: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3d10: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
3d20: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3d30: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73  RRIDE_LOCK;.#els
3d40: 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 72  e.static int thr
3d50: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
3d60: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51  OthersLocks = SQ
3d70: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3d80: 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RIDE_LOCK;.#endi
3d90: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
3da0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
3db0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
3dc0: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
3dd0: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
3de0: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
3df0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
3e00: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
3e10: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
3e20: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
3e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e40: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
3e50: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
3e60: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
3e70: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
3e80: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
3e90: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
3ea0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
3eb0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
3ec0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
3ed0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
3ee0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
3ef0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
3f00: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
3f10: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
3f20: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
3f30: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
3f40: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
3f50: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
3f60: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
3f70: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
3f80: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
3f90: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
3fa0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
3fb0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
3fc0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
3fd0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
3fe0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
3ff0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
4000: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
4010: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
4020: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
4030: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
4040: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
4050: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
4060: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
4070: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
4080: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
4090: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
40a0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
40b0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
40c0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
40d0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
40e0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
40f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4100: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
4110: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
4120: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
4130: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
4140: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
4150: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
4160: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
4170: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
4180: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
4190: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
41a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
41b0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
41c0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
41d0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
41e0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
41f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4200: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
4210: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
4220: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
4230: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
4240: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
4250: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4260: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
4270: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4280: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
4290: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
42a0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
42b0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
42c0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
42d0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
42e0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
42f0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
4300: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
4310: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
4320: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
4330: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
4340: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
4350: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
4360: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
4370: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
4380: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4390: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
43a0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
43b0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
43c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
43d0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
43e0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
43f0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
4400: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
4410: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4420: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
4430: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4440: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4450: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
4460: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
4470: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
4480: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
4490: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
44a0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
44b0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
44c0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
44d0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
44e0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
44f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4500: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
4510: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74 54  ./*.** The testT
4520: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
4530: 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 6c  vior() routine l
4540: 61 75 6e 63 68 65 73 20 74 77 6f 20 73 65 70 61  aunches two sepa
4550: 72 61 74 65 0a 2a 2a 20 74 68 72 65 61 64 73 20  rate.** threads 
4560: 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  on this routine.
4570: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
4580: 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 6b 20  ttempts to lock 
4590: 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  a file.** descri
45a0: 70 74 6f 72 20 74 68 65 6e 20 72 65 74 75 72 6e  ptor then return
45b0: 73 2e 20 20 54 68 65 20 73 75 63 63 65 73 73 20  s.  The success 
45c0: 6f 72 20 66 61 69 6c 75 72 65 20 6f 66 20 74 68  or failure of th
45d0: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 61 6c  at attempt.** al
45e0: 6c 6f 77 73 20 74 68 65 20 74 65 73 74 54 68 72  lows the testThr
45f0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
4600: 6f 72 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  or() procedure t
4610: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
4620: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
4630: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
4640: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
4650: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
4660: 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b  void *threadLock
4670: 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41  ingTest(void *pA
4680: 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68  rg){.  struct th
4690: 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70 44  readTestData *pD
46a0: 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74 68  ata = (struct th
46b0: 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70 41  readTestData*)pA
46c0: 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73  rg;.  pData->res
46d0: 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74  ult = fcntl(pDat
46e0: 61 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  a->fd, F_SETLK, 
46f0: 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20  &pData->lock);. 
4700: 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a   return pArg;.}.
4710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
4720: 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20 74  edure attempts t
4730: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
4740: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
4750: 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69  ds.** can overri
4760: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
4770: 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20 74  ocks then sets t
4780: 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76  he .** threadsOv
4790: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
47a0: 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20 61  Locks variable a
47b0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f  ppropriately..*/
47c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
47d0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
47e0: 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72  havior(int fd_or
47f0: 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  ig){.  int fd;. 
4800: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
4810: 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20 70  stData d[2];.  p
4820: 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a  thread_t t[2];..
4830: 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72    fd = dup(fd_or
4840: 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  ig);.  if( fd<0 
4850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
4860: 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(d, 0, sizeof(
4870: 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20 3d  d));.  d[0].fd =
4880: 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b   fd;.  d[0].lock
4890: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
48a0: 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c  K;.  d[0].lock.l
48b0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30 5d  _len = 1;.  d[0]
48c0: 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20  .lock.l_start = 
48d0: 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c  0;.  d[0].lock.l
48e0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
48f0: 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b 30  ET;.  d[1] = d[0
4900: 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c  ];.  d[1].lock.l
4910: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
4920: 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61 74  .  pthread_creat
4930: 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72 65  e(&t[0], 0, thre
4940: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26  adLockingTest, &
4950: 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61 64  d[0]);.  pthread
4960: 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20 30  _create(&t[1], 0
4970: 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54  , threadLockingT
4980: 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20 70  est, &d[1]);.  p
4990: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d  thread_join(t[0]
49a0: 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64 5f  , 0);.  pthread_
49b0: 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a 20  join(t[1], 0);. 
49c0: 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74 68   close(fd);.  th
49d0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
49e0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 20  hOthersLocks =  
49f0: 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20 26  d[0].result==0 &
4a00: 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d 30  & d[1].result==0
4a10: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
4a30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  */../*.** Releas
4a40: 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  e a lockInfo str
4a50: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
4a60: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
4a70: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a  indLockInfo()..*
4a80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
4a90: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74  leaseLockInfo(st
4aa0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
4ab0: 4c 6f 63 6b 29 7b 0a 20 20 69 66 20 28 70 4c 6f  Lock){.  if (pLo
4ac0: 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  ck == NULL).    
4ad0: 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d  return;.  pLock-
4ae0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
4af0: 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Lock->nRef==0 ){
4b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
4b10: 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68  Insert(&lockHash
4b20: 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73  , &pLock->key, s
4b30: 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79  izeof(pLock->key
4b40: 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ), 0);.    sqlit
4b50: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
4b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
4b70: 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73  ease a openCnt s
4b80: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
4b90: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
4ba0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
4bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4bc0: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
4bd0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
4be0: 4f 70 65 6e 29 7b 0a 20 20 69 66 20 28 70 4f 70  Open){.  if (pOp
4bf0: 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  en == NULL).    
4c00: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 65 6e 2d  return;.  pOpen-
4c10: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
4c20: 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Open->nRef==0 ){
4c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
4c40: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68  Insert(&openHash
4c50: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73  , &pOpen->key, s
4c60: 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79  izeof(pOpen->key
4c70: 29 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  ), 0);.    free(
4c80: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
4c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4ca0: 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d  ee(pOpen);.  }.}
4cb0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4cc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
4cd0: 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74 73  TYLE./*.** Tests
4ce0: 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f   a byte-range lo
4cf0: 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20 73  cking query to s
4d00: 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67 65  ee if byte range
4d10: 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20 73   locks are .** s
4d20: 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f 74  upported, if not
4d30: 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   we fall back to
4d40: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53   dotlockLockingS
4d50: 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tyle..*/.static 
4d60: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
4d70: 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73 74 4c  yle sqlite3TestL
4d80: 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20 63  ockingStyle(.  c
4d90: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
4da0: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a 29  ath, .  int fd.)
4db0: 7b 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65  {.  /* test byte
4dc0: 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
4dd0: 67 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72  g fcntl */.  str
4de0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
4df0: 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66  fo;.  .  lockInf
4e00: 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
4e10: 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
4e20: 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
4e30: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
4e40: 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
4e50: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
4e60: 3b 0a 20 20 0a 20 20 69 66 28 20 66 63 6e 74 6c  ;.  .  if( fcntl
4e70: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
4e80: 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
4e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69  .    return posi
4ea0: 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  xLockingStyle;. 
4eb0: 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73 74   } .  .  /* test
4ec0: 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63 61  ing for flock ca
4ed0: 6e 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73  n give false pos
4ee0: 69 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69  itives.  So if i
4ef0: 66 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74  f the above test
4f00: 0a 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68 65  .  ** fails, the
4f10: 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  n we fall back t
4f20: 6f 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b  o using dot-lock
4f30: 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a   style locking..
4f40: 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20    */  .  return 
4f50: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
4f60: 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45  yle;.}../* .** E
4f70: 78 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66 73  xamines the f_fs
4f80: 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69  typename entry i
4f90: 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72  n the statfs str
4fa0: 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e  ucture as return
4fb0: 65 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28 29  ed by .** stat()
4fc0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73 79   for the file sy
4fd0: 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65  stem hosting the
4fe0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
4ff0: 61 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a 20  assigns the .** 
5000: 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
5010: 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20  ing style based 
5020: 6f 6e 20 69 74 73 20 76 61 6c 75 65 2e 20 20 54  on its value.  T
5030: 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64 20  hese values and 
5040: 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73 20  .** assignments 
5050: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61 72  are based on Dar
5060: 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f 72  win/OSX behavior
5070: 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62 65   and have not be
5080: 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a  en tested on .**
5090: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
50b0: 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73 71  3LockingStyle sq
50c0: 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69  lite3DetectLocki
50d0: 6e 67 53 74 79 6c 65 28 0a 20 20 63 6f 6e 73 74  ngStyle(.  const
50e0: 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
50f0: 20 0a 20 20 69 6e 74 20 66 64 0a 29 7b 0a 0a 23   .  int fd.){..#
5100: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 46 49 58  ifdef SQLITE_FIX
5110: 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ED_LOCKING_STYLE
5120: 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
5130: 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 29 53  e3LockingStyle)S
5140: 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b  QLITE_FIXED_LOCK
5150: 49 4e 47 5f 53 54 59 4c 45 3b 0a 23 65 6c 73 65  ING_STYLE;.#else
5160: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
5170: 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20   fsInfo;..  if( 
5180: 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
5190: 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
51a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
51b0: 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67  lite3TestLocking
51c0: 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20  Style(filePath, 
51d0: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  fd);.  }.  if( f
51e0: 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
51f0: 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
5200: 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69    return noLocki
5210: 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69  ngStyle;.  }.  i
5220: 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
5230: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5240: 68 66 73 22 29 3d 3d 30 20 7c 7c 0a 20 20 20 20  hfs")==0 ||.    
5250: 20 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e    strcmp(fsInfo.
5260: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75  f_fstypename, "u
5270: 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  fs")==0 ){.    r
5280: 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69  eturn posixLocki
5290: 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69  ngStyle;.  }.  i
52a0: 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
52b0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
52c0: 61 66 70 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20  afpfs")==0 ){.  
52d0: 20 20 72 65 74 75 72 6e 20 61 66 70 4c 6f 63 6b    return afpLock
52e0: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20  ingStyle;.  }.  
52f0: 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
5300: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5310: 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
5320: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
5330: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
5340: 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20  filePath, fd);. 
5350: 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
5360: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
5370: 61 6d 65 2c 20 22 73 6d 62 66 73 22 29 3d 3d 30  ame, "smbfs")==0
5380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66   ){.    return f
5390: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
53a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
53b0: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
53c0: 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22 29  pename, "msdos")
53d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
53e0: 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  n dotlockLocking
53f0: 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Style;.  }.  if(
5400: 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
5410: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77 65  _fstypename, "we
5420: 62 64 61 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20  bdav")==0 ){.   
5430: 20 72 65 74 75 72 6e 20 75 6e 73 75 70 70 6f 72   return unsuppor
5440: 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  tedLockingStyle;
5450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
5460: 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67  lite3TestLocking
5470: 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20  Style(filePath, 
5480: 66 64 29 3b 20 20 0a 23 65 6e 64 69 66 20 2f 2a  fd);  .#endif /*
5490: 20 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f   SQLITE_FIXED_LO
54a0: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 7d  CKING_STYLE */.}
54b0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
54c0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
54d0: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
54e0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
54f0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
5500: 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  e lockInfo and o
5510: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
5520: 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  s that.** descri
5530: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
5540: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
5550: 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65  e new ones if ne
5560: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
5570: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d   return values m
5580: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
5590: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
55a0: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
55b0: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
55c0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
55d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
55e0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20  findLockInfo(.  
55f0: 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5610: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
5620: 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20  tor used in the 
5630: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
5640: 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  lockInfo **ppLoc
5650: 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  k,    /* Return 
5660: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  the lockInfo str
5670: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
5680: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
5690: 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a  **ppOpen      /*
56a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e   Return the open
56b0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
56c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
56d0: 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  c;.  struct lock
56e0: 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75  Key key1;.  stru
56f0: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b  ct openKey key2;
5700: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
5710: 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74  tatbuf;.  struct
5720: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
5730: 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  ;.  struct openC
5740: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20  nt *pOpen;.  rc 
5750: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
5760: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
5770: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 45 4f 56  =0 ){.#ifdef EOV
5780: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 65  ERFLOW.    if( e
5790: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
57a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
57b0: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
57c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
57d0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 6d 65  IOERR;.  }..  me
57e0: 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20 73  mset(&key1, 0, s
57f0: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
5800: 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74 62  key1.dev = statb
5810: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
5820: 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  1.ino = statbuf.
5830: 73 74 5f 69 6e 6f 3b 0a 23 69 66 20 53 51 4c 49  st_ino;.#if SQLI
5840: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
5850: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
5860: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
5870: 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74  ks<0 ){.    test
5880: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
5890: 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20  avior(fd);.  }. 
58a0: 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72 65   key1.tid = thre
58b0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
58c0: 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a  thersLocks ? 0 :
58d0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
58e0: 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74  .#endif.  memset
58f0: 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f  (&key2, 0, sizeo
5900: 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32  f(key2));.  key2
5910: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
5920: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e  t_dev;.  key2.in
5930: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
5940: 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73  no;.  pLock = (s
5950: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29  truct lockInfo*)
5960: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
5970: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79 31  &lockHash, &key1
5980: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b  , sizeof(key1));
5990: 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20  .  if( pLock==0 
59a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c 6f  ){.    struct lo
59b0: 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20  ckInfo *pOld;.  
59c0: 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65    pLock = sqlite
59d0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
59e0: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
59f0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5a00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5a10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
5a20: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
5a30: 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  kinfo;.    }.   
5a40: 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65   pLock->key = ke
5a50: 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  y1;.    pLock->n
5a60: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  Ref = 1;.    pLo
5a70: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ck->cnt = 0;.   
5a80: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
5a90: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d   = 0;.    pOld =
5aa0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5ab0: 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70  rt(&lockHash, &p
5ac0: 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Lock->key, sizeo
5ad0: 66 28 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b  f(key1), pLock);
5ae0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30  .    if( pOld!=0
5af0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5b00: 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b  ( pOld==pLock );
5b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
5b20: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
5b30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5b40: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
5b50: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
5b60: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  o;.    }.  }else
5b70: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  {.    pLock->nRe
5b80: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f  f++;.  }.  *ppLo
5b90: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66  ck = pLock;.  if
5ba0: 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20  ( ppOpen!=0 ){. 
5bb0: 20 20 20 70 4f 70 65 6e 20 3d 20 28 73 74 72 75     pOpen = (stru
5bc0: 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69  ct openCnt*)sqli
5bd0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 6f 70 65  te3HashFind(&ope
5be0: 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c 20 73 69  nHash, &key2, si
5bf0: 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 20  zeof(key2));.   
5c00: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
5c10: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 6f 70  .      struct op
5c20: 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20  enCnt *pOld;.   
5c30: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
5c40: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
5c50: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
5c60: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
5c80: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
5c90: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
5ca0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5cb0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5cc0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
5ce0: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
5cf0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
5d00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
5d10: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
5d20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
5d30: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
5d40: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
5d50: 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d   0;.      pOld =
5d60: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5d70: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
5d80: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
5d90: 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b  f(key2), pOpen);
5da0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21  .      if( pOld!
5db0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5dc0: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
5dd0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n );.        sql
5de0: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29  ite3_free(pOpen)
5df0: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
5e00: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
5e10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
5e20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5e30: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
5e40: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
5e50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5e60: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
5e70: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
5e80: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
5e90: 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f    }..exit_findlo
5ea0: 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e  ckinfo:.  return
5eb0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
5ec0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
5ed0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
5ee0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
5ef0: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
5f00: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
5f10: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
5f20: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
5f30: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
5f40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5f50: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5f60: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5f70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5f80: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
5f90: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
5fa0: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
5fb0: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
5fc0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5fd0: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
5fe0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
5ff0: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
6000: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
6010: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
6020: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
6030: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
6040: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
6050: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
6060: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
6070: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
6080: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
6090: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  if../*.** If we 
60a0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
60b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
60c0: 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72  ead than the thr
60d0: 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ead that the.** 
60e0: 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e  unixFile argumen
60f0: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68  t belongs to, th
6100: 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65  en transfer owne
6110: 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69  rship of the uni
6120: 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f  xFile.** over to
6130: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
6140: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69  ead..**.** A uni
6150: 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77  xFile is only ow
6160: 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  ned by a thread 
6170: 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  on systems where
6180: 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a   one thread is.*
6190: 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72  * unable to over
61a0: 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74  ride locks creat
61b0: 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  ed by a differen
61c0: 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61  t thread.  RedHa
61d0: 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d  t9 is.** an exam
61e0: 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79  ple of such a sy
61f0: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65  stem..**.** Owne
6200: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
6210: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69  s only allowed i
6220: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69  f the unixFile i
6230: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
6240: 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  cked..** If the 
6250: 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b  unixFile is lock
6260: 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73  ed and an owners
6270: 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68  hip is wrong, th
6280: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  en return.** SQL
6290: 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c  ITE_MISUSE.  SQL
62a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
62b0: 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
62c0: 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53   works..*/.#if S
62d0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
62e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
62f0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e  sferOwnership(un
6300: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
6310: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
6320: 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69  ead_t hSelf;.  i
6330: 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  f( threadsOverri
6340: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
6350: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65  s ){.    /* Owne
6360: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73 20  rship transfers 
6370: 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68  not needed on th
6380: 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20  is system */.   
6390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
63a0: 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d  K;.  }.  hSelf =
63b0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
63c0: 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 65  .  if( pthread_e
63d0: 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c  qual(pFile->tid,
63e0: 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f   hSelf) ){.    /
63f0: 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69  * We are still i
6400: 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  n the same threa
6410: 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45  d */.    OSTRACE
6420: 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20  1("No-transfer, 
6430: 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b  same thread\n");
6440: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6450: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
6460: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6470: 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
6480: 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68   /* We cannot ch
6490: 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77  ange ownership w
64a0: 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64  hile we are hold
64b0: 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20  ing a lock! */. 
64c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
64d0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f  _MISUSE;.  }.  O
64e0: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
64f0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
6500: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
6510: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
6520: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
6530: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
6540: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
6550: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
6560: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
6570: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
6580: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
6590: 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  ck);.    rc = fi
65a0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  ndLockInfo(pFile
65b0: 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f  ->h, &pFile->pLo
65c0: 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52  ck, 0);.    OSTR
65d0: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
65e0: 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64   is now %s(%s,%d
65f0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
6600: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6610: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
6620: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
6630: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
6640: 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  e(pFile->pLock->
6650: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65  locktype), pFile
6660: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20  ->pLock->cnt);. 
6670: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6680: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
6690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
66a0: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   }.}.#else.  /* 
66b0: 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  On single-thread
66c0: 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72  ed builds, owner
66d0: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
66e0: 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65   a no-op */.# de
66f0: 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e  fine transferOwn
6700: 65 72 73 68 69 70 28 58 29 20 53 51 4c 49 54 45  ership(X) SQLITE
6710: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
6720: 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
6730: 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
6740: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6750: 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
6760: 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
6770: 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
6780: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
6790: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
67a0: 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
67b0: 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
67c0: 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
67d0: 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
67e0: 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
67f0: 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
6800: 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
6810: 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
6820: 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
6830: 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
6840: 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
6850: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
6860: 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
6870: 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79   any any form by
6880: 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
6890: 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
68a0: 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
68b0: 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
68c0: 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
68d0: 23 32 36 38 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  #2681..*/.static
68e0: 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
68f0: 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
6900: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
6910: 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
6920: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
6930: 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f   got;.  i64 newO
6940: 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53  ffset;.  TIMER_S
6950: 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
6960: 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
6970: 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
6980: 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
6990: 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
69a0: 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
69b0: 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
69c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
69d0: 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
69e0: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
69f0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
6a00: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
6a10: 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
6a20: 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
6a30: 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
6a40: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
6a50: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
6a60: 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
6a70: 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
6a80: 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72  =offset ){.    r
6a90: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
6aa0: 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68  got = read(id->h
6ab0: 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
6ac0: 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
6ad0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52 45  ;.  OSTRACE5("RE
6ae0: 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
6af0: 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
6b00: 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
6b10: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
6b20: 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
6b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
6b40: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
6b50: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
6b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
6b70: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
6b80: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
6b90: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
6ba0: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
6bb0: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
6bc0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
6bd0: 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
6be0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
6bf0: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
6c00: 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
6c10: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
6c20: 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  .){.  int got;. 
6c30: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
6c40: 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
6c50: 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ad((unixFile*)id
6c60: 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
6c70: 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
6c80: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
6c90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6ca0: 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
6cb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6cc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
6cd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
6ce0: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
6cf0: 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
6d00: 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
6d10: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
6d20: 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
6d30: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
6d40: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
6d50: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
6d60: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
6d70: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
6d80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6d90: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
6da0: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
6db0: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
6dc0: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
6dd0: 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
6de0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
6df0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
6e00: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
6e10: 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66  got;.  i64 newOf
6e20: 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54  fset;.  TIMER_ST
6e30: 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
6e40: 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
6e50: 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68  t = pwrite(id->h
6e60: 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
6e70: 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
6e80: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
6e90: 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
6ea0: 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
6eb0: 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
6ec0: 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
6ed0: 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
6ee0: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
6ef0: 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
6f00: 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
6f10: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
6f20: 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d   got = write(id-
6f30: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
6f40: 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45  #endif.  TIMER_E
6f50: 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22  ND;.  OSTRACE5("
6f60: 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
6f70: 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
6f80: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
6f90: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
6fa0: 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
6fb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6fc0: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
6fd0: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
6fe0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6ff0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
7000: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
7010: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
7020: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
7030: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
7040: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7050: 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
7060: 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
7070: 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
7080: 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
7090: 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
70a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
70b0: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
70c0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74   );.  while( amt
70d0: 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
70e0: 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69  eekAndWrite((uni
70f0: 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65  xFile*)id, offse
7100: 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
7110: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
7120: 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
7130: 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
7140: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
7150: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
7160: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
7170: 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
7180: 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
7190: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
71a0: 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
71b0: 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d  t=1 ));.  if( am
71c0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
71d0: 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  rote<0 ){.      
71e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
71f0: 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
7200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
7210: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
7220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7230: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7240: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7250: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
7260: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
7270: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
7280: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
7290: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
72a0: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
72b0: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
72c0: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
72d0: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
72e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
72f0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
7300: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
7310: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
7320: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68  if../*.** Use th
7330: 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 41 50  e fdatasync() AP
7340: 49 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41  I only if the HA
7350: 56 45 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63  VE_FDATASYNC mac
7360: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  ro is defined..*
7370: 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  * Otherwise use 
7380: 66 73 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70  fsync() in its p
7390: 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  lace..*/.#ifndef
73a0: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a   HAVE_FDATASYNC.
73b0: 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
73c0: 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
73d0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
73e0: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
73f0: 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
7400: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7410: 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
7420: 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
7430: 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
7440: 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
7450: 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
7460: 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
7470: 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
7480: 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
7490: 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
74a0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
74b0: 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
74c0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
74d0: 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
74e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
74f0: 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
7500: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
7510: 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
7520: 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
7530: 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
7540: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
7550: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
7560: 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
7570: 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
7580: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
7590: 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
75a0: 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
75b0: 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
75c0: 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
75d0: 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
75e0: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
75f0: 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
7600: 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
7610: 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
7620: 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
7630: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
7640: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
7650: 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
7660: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
7670: 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
7680: 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
7690: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
76a0: 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
76b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
76c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
76d0: 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
76e0: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
76f0: 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
7700: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63  nt rc;..  /* Rec
7710: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
7720: 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
7730: 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
7740: 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
7750: 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
7760: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
7770: 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
7780: 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
7790: 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
77a0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
77b0: 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
77c0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
77d0: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
77e0: 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
77f0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
7800: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
7810: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
7820: 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
7830: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
7840: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
7850: 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
7860: 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
7870: 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
7880: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
7890: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
78a0: 65 6c 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46  else..#if HAVE_F
78b0: 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
78c0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
78d0: 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  c = fcntl(fd, F_
78e0: 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
78f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7900: 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
7910: 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
7920: 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
7930: 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
7940: 20 66 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49   fsync()..   * I
7950: 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
7960: 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
7970: 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
7980: 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a   the local .   *
7990: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
79a0: 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
79b0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
79c0: 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20   FULLFSYNC.   * 
79d0: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
79e0: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
79f0: 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
7a00: 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a  t an fsync .   *
7a10: 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
7a20: 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
7a30: 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
7a40: 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
7a50: 20 0a 20 20 20 2a 20 49 74 27 64 20 62 65 20 62   .   * It'd be b
7a60: 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
7a70: 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
7a80: 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
7a90: 20 0a 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c   .   * the fcntl
7aa0: 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
7ab0: 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
7ac0: 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  .   */.  if( rc 
7ad0: 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
7ae0: 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20  ;..#else .  if( 
7af0: 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  dataOnly ){.    
7b00: 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
7b10: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
7b20: 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
7b30: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48  .  }.#endif /* H
7b40: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
7b50: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
7b60: 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
7b70: 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  C) */..  return 
7b80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
7b90: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
7ba0: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
7bb0: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
7bc0: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
7bd0: 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
7be0: 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
7bf0: 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
7c00: 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
7c10: 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
7c20: 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
7c30: 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
7c40: 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
7c50: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
7c60: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
7c70: 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
7c80: 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
7c90: 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
7ca0: 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
7cb0: 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
7cc0: 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
7cd0: 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
7ce0: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7cf0: 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
7d00: 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
7d10: 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
7d20: 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
7d30: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
7d40: 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
7d50: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7d60: 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
7d70: 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
7d80: 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
7d90: 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
7da0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
7db0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
7dc0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
7dd0: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
7de0: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
7df0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
7e00: 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
7e10: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
7e20: 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
7e30: 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
7e40: 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
7e50: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
7e60: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7e70: 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
7e80: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7e90: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
7ea0: 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
7eb0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
7ec0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
7ed0: 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
7ee0: 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
7ef0: 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
7f00: 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
7f10: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
7f20: 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
7f30: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
7f40: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
7f50: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
7f60: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
7f70: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
7f80: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
7f90: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
7fa0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
7fb0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
7fc0: 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
7fd0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
7fe0: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
7ff0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
8000: 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
8010: 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46  nc(pFile->h, isF
8020: 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f  ullsync, isDataO
8030: 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
8040: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
8050: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8070: 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
8080: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
8090: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
80a0: 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
80b0: 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
80c0: 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
80d0: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
80e0: 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
80f0: 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
8100: 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23  , isFullsync);.#
8110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
8120: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
8130: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
8140: 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
8150: 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
8160: 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
8170: 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
8180: 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
8190: 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
81a0: 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
81b0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
81c0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
81d0: 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
81e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
81f0: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
8200: 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
8210: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
8220: 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
8230: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
8240: 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
8250: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
8260: 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
8270: 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
8280: 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
8290: 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
82a0: 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
82b0: 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
82c0: 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
82d0: 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
82e0: 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
82f0: 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
8300: 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
8310: 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
8320: 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
8330: 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
8340: 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  .       /* retur
8350: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20  n SQLITE_IOERR; 
8360: 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
8370: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
8380: 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c  >dirfd);  /* Onl
8390: 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
83a0: 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
83b0: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  e directory */. 
83c0: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
83d0: 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e  = -1;    /* when
83e0: 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f   we are done. */
83f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8400: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8410: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
8420: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
8430: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
8440: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
8450: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
8460: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
8470: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  te){.  int rc;. 
8480: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
8490: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
84a0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
84b0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29  IOERR_TRUNCATE )
84c0: 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61  ;.  rc = ftrunca
84d0: 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  te(((unixFile*)i
84e0: 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  d)->h, (off_t)nB
84f0: 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
8500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8510: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
8520: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
8530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8540: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
8550: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
8560: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
8570: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
8580: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8590: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
85a0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
85b0: 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
85c0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
85d0: 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
85e0: 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  d );.  rc = fsta
85f0: 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
8600: 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
8610: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
8620: 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
8630: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
8640: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
8650: 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
8660: 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
8670: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8680: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8690: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
86a0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
86b0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
86c0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
86d0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
86e0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
86f0: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
8700: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
8710: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
8720: 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66  -zero.  If the f
8730: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
8740: 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48  or holds only SH
8750: 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e  ARED locks, then
8760: 0a 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  .** return zero.
8770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8780: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
8790: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
87a0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
87b0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20  Out){.  int r = 
87c0: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
87d0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
87e0: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
87f0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
8800: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
8810: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
8820: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
8830: 46 69 6c 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d  File );.  enterM
8840: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
8850: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
8860: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
8870: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
8880: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
8890: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
88a0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
88b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
88c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
88d0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
88e0: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
88f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
8900: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
8910: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
8920: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
8930: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
8940: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
8950: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
8960: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
8970: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
8980: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
8990: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
89a0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
89b0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
89c0: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
89d0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
89e0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
89f0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
8a00: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
8a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
8a20: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
8a30: 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20 57  OSTRACE3("TEST W
8a40: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c  R-LOCK %d %d\n",
8a50: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a   pFile->h, r);..
8a60: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 3b 0a    *pResOut = r;.
8a70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  OK;.}../*.** Loc
8a90: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
8aa0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
8ab0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
8ac0: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
8ad0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
8ae0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
8af0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
8b00: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
8b10: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
8b20: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
8b30: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
8b40: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
8b50: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
8b60: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
8b70: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
8b80: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
8b90: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
8ba0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
8bb0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
8bc0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
8bd0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
8be0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
8bf0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
8c00: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
8c10: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
8c20: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
8c30: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
8c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
8c50: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
8c60: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
8c70: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
8c80: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
8c90: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
8ca0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
8cb0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
8cc0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
8cd0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
8ce0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
8cf0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
8d00: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
8d10: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
8d20: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
8d30: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
8d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
8d50: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
8d60: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
8d70: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
8d80: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
8d90: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
8da0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
8db0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
8dc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
8dd0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
8de0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
8df0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
8e00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
8e10: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
8e20: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
8e30: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
8e40: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
8e50: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
8e60: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
8e70: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
8e80: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
8e90: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
8ea0: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
8eb0: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
8ec0: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
8ed0: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
8ee0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
8ef0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
8f00: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
8f10: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
8f20: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
8f30: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
8f40: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
8f50: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
8f60: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
8f70: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
8f80: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
8f90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
8fa0: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
8fb0: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
8fc0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
8fd0: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
8fe0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
8ff0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
9000: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
9010: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
9020: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
9030: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
9040: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
9050: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
9060: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
9070: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
9080: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
9090: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
90a0: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
90b0: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
90c0: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
90d0: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
90e0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
90f0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
9100: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
9110: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
9120: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
9130: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
9140: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
9150: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
9160: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
9170: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
9180: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
9190: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
91a0: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
91b0: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
91c0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
91d0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
91e0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
91f0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
9200: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
9210: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
9220: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
9230: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
9240: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
9250: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
9260: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
9270: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
9280: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
9290: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
92a0: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
92b0: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
92c0: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
92d0: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
92e0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
92f0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
9300: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
9310: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
9320: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
9330: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
9340: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
9350: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
9360: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
9370: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
9380: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
9390: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
93a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
93b0: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
93c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
93d0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
93e0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
93f0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
9400: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
9410: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
9420: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
9430: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
9440: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9450: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
9460: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
9470: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
9480: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
9490: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
94a0: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
94b0: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
94c0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
94d0: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
94e0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
94f0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
9500: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
9510: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
9520: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9530: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
9540: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
9550: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
9560: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
9570: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
9580: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
9590: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
95a0: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
95b0: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
95c0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
95d0: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
95e0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
95f0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
9600: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
9610: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
9620: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9630: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
9640: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
9650: 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  )id;.  struct lo
9660: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20  ckInfo *pLock = 
9670: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
9680: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
9690: 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61  k;.  int s;..  a
96a0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
96b0: 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b    OSTRACE7("LOCK
96c0: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
96d0: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%s,%d) pid=%d\n
96e0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
96f0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
9700: 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
9710: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
9720: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
9730: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f  locktypeName(pLo
9740: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
9750: 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70  Lock->cnt , getp
9760: 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
9770: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
9780: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
9790: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
97a0: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
97b0: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
97c0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
97d0: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
97e0: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
97f0: 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78  .  ** enterMutex
9800: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
9810: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
9820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
9830: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
9840: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
9850: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
9860: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
9870: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
9880: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
9890: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
98a0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
98b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
98c0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
98d0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
98e0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
98f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
9900: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
9910: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
9920: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
9930: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
9940: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
9950: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9960: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
9970: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
9980: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
9990: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
99a0: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
99b0: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
99c0: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
99d0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
99e0: 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e 74 65 72  ads.  */.  enter
99f0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
9a00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
9a10: 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
9a20: 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
9a30: 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
9a40: 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
9a50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9a60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61  TE_OK ){.    lea
9a70: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  veMutex();.    r
9a80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9a90: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
9aa0: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  Lock;..  /* If s
9ab0: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
9ac0: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
9ad0: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
9ae0: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
9af0: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
9b00: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
9b10: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
9b20: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
9b30: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f    if( (pFile->lo
9b40: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
9b50: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
9b60: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
9b70: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
9b80: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
9b90: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
9ba0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
9bb0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
9bc0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
9bd0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
9be0: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
9bf0: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
9c00: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
9c10: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
9c20: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
9c30: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
9c40: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
9c50: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
9c60: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
9c70: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
9c80: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
9c90: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
9ca0: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
9cb0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9cc0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
9cd0: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
9ce0: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
9cf0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
9d00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9d10: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
9d20: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  e->locktype==0 )
9d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
9d40: 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20  ock->cnt>0 );.  
9d50: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
9d60: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
9d70: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
9d80: 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  +;.    pFile->pO
9d90: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
9da0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9db0: 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  }..  lock.l_l
9dc0: 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b  en = 1L;..  lock
9dd0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
9de0: 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45  _SET;..  /* A PE
9df0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
9e00: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
9e10: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
9e20: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
9e30: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
9e40: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
9e50: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
9e60: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
9e70: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
9e80: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
9e90: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
9ea0: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
9eb0: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
9ec0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
9ed0: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
9ee0: 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
9ef0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
9f00: 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65  type = (locktype
9f10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
9f20: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
9f30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9f40: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
9f50: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
9f60: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
9f70: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
9f80: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
9f90: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
9fa0: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
9fb0: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
9fc0: 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
9fd0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
9fe0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
9ff0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
a000: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
a010: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
a020: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
a030: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
a040: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
a050: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
a060: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
a070: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a080: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a090: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a  Lock->cnt==0 );.
a0a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
a0b0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  k->locktype==0 )
a0c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
a0d0: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
a0e0: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
a0f0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
a100: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
a110: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
a120: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
a130: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
a140: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20  K, &lock);..    
a150: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
a160: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
a170: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
a180: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
a190: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
a1a0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
a1b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a1c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66  UNLCK;.    if( f
a1d0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a1e0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
a1f0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
a200: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
a210: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
a220: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
a230: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
a240: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
a250: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
a260: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
a270: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
a280: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
a290: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
a2b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
a2c0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
a2d0: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
a2e0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
a2f0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20  Lock->cnt = 1;. 
a300: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a310: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
a320: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  SIVE_LOCK && pLo
a330: 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20  ck->cnt>1 ){.   
a340: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
a350: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
a360: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
a370: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
a380: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
a390: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
a3a0: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
a3b0: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
a3c0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
a3d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
a3e0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
a3f0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
a400: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
a410: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
a420: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
a430: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
a440: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
a450: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
a460: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
a470: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
a480: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
a490: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
a4a0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
a4b0: 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74     switch( lockt
a4c0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
a4d0: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
a4e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a4f0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
a500: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62  _BYTE;.        b
a510: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a520: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
a530: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a540: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
a550: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
a560: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
a570: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
a580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
a590: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
a5a0: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
a5b0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
a5c0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
a5d0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
a5e0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
a5f0: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
a600: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
a610: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
a620: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
a630: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
a640: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
a650: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
a660: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
a670: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
a680: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
a690: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
a6a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
a6b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a6c0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
a6d0: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
a6e0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a6f0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
a700: 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75  _lock:.  leaveMu
a710: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
a720: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
a730: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
a740: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
a750: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
a760: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
a770: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
a780: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a790: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
a7a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
a7b0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
a7c0: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
a7d0: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
a7e0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
a7f0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
a800: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
a810: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
a820: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
a830: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
a840: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
a850: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
a860: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
a870: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
a880: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
a890: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
a8a0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
a8b0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
a8c0: 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20  type){.  struct 
a8d0: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
a8e0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
a8f0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
a900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
a910: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
a920: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
a930: 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72   int h;..  asser
a940: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
a950: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
a960: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
a970: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
a980: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
a990: 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e,.      pFile->
a9a0: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
a9b0: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
a9c0: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
a9d0: 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  cnt, getpid());.
a9e0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
a9f0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
aa00: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
aa10: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
aa20: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
aa30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
aa40: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
aa50: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
aa60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa70: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
aa80: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
aa90: 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  h = pFile->h;.  
aaa0: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
aab0: 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20  Lock;.  assert( 
aac0: 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b  pLock->cnt!=0 );
aad0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
aae0: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
aaf0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
ab00: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
ab10: 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e==pFile->lockty
ab20: 70 65 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  pe );.    Simula
ab30: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
ab40: 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
ab50: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
ab60: 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
ab70: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
ab80: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
ab90: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
aba0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
abb0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
abc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
abd0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
abe0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
abf0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
ac00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
ac10: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ac20: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
ac30: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
ac40: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
ac50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ac60: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
ac70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ac80: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ac90: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
aca0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
acb0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
acc0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
acd0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
ace0: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
acf0: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
ad00: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
ad10: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63  TE );.    if( fc
ad20: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
ad30: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
ad40: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
ad50: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
ad60: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
ad70: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ad80: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ad90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ada0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
adb0: 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  K ){.    struct 
adc0: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
add0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
ade0: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
adf0: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
ae00: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
ae10: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
ae20: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
ae30: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
ae40: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
ae50: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
ae60: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
ae70: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
ae80: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
ae90: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
aea0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
aeb0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
aec0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
aed0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
aee0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
aef0: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
af00: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
af10: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
af20: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
af30: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
af40: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
af50: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
af60: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0);.      if( fc
af70: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
af80: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
af90: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
afa0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
afb0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
afc0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
afd0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
afe0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ;.        pLock-
aff0: 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  >cnt = 1;.      
b000: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b010: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
b020: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
b030: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
b040: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
b050: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
b060: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
b070: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
b080: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
b090: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
b0a0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
b0b0: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
b0c0: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
b0d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b0e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
b0f0: 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
b100: 70 65 6e 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  pen;.      pOpen
b110: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20  ->nLock--;.     
b120: 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e   assert( pOpen->
b130: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
b140: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f    if( pOpen->nLo
b150: 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e  ck==0 && pOpen->
b160: 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20  nPending>0 ){.  
b170: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b180: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b190: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b  pOpen->nPending;
b1a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b1b0: 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50   close(pOpen->aP
b1c0: 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  ending[i]);.    
b1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 72      }.        fr
b1e0: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
b1f0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ng);.        pOp
b200: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
b210: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
b220: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
b230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b240: 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
b250: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b260: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
b270: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
b280: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
b290: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b2a0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b2b0: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
b2c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
b2d0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
b2e0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
b2f0: 2a 29 69 64 3b 0a 20 20 69 66 28 20 21 70 46 69  *)id;.  if( !pFi
b300: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
b310: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c  TE_OK;.  unixUnl
b320: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
b330: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
b340: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
b350: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
b360: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
b370: 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  -1;.  enterMutex
b380: 28 29 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65  ();..  if( pFile
b390: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
b3a0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
b3b0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
b3c0: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
b3d0: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
b3e0: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
b3f0: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
b400: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
b410: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
b420: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
b430: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
b440: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
b450: 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
b460: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
b470: 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
b480: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  .    ** the last
b490: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
b4a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
b4b0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75   *aNew;.    stru
b4c0: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
b4d0: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
b4e0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61  ;.    aNew = rea
b4f0: 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65  lloc( pOpen->aPe
b500: 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e  nding, (pOpen->n
b510: 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f  Pending+1)*sizeo
b520: 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66  f(int) );.    if
b530: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
b540: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
b550: 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
b560: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
b570: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65  riptor */.    }e
b580: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
b590: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
b5a0: 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  w;.      pOpen->
b5b0: 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
b5c0: 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c  nPending] = pFil
b5d0: 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 4f 70 65  e->h;.      pOpe
b5e0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20  n->nPending++;. 
b5f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
b600: 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
b610: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  o outstanding lo
b620: 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c  cks so we can cl
b630: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d  ose the file imm
b640: 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20  ediately */.    
b650: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
b660: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f  .  }.  releaseLo
b670: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
b680: 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f  ock);.  releaseO
b690: 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f  penCnt(pFile->pO
b6a0: 70 65 6e 29 3b 0a 0a 20 20 6c 65 61 76 65 4d 75  pen);..  leaveMu
b6b0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
b6c0: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
b6d0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
b6e0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
b6f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
b700: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
b710: 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
b720: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
b730: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b740: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
b750: 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  LE.#pragma mark 
b760: 41 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a  AFP Support../*.
b770: 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69   ** The afpLocki
b780: 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
b790: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
b7a0: 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
b7b0: 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70  ic state. */.typ
b7c0: 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c  edef struct afpL
b7d0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66  ockingContext af
b7e0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  pLockingContext;
b7f0: 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69  .struct afpLocki
b800: 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
b810: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
b820: 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b   sharedLockByte;
b830: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
b840: 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72  ilePath;.};..str
b850: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
b860: 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
b870: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
b880: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
b890: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
b8a0: 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
b8b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
b8c0: 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
b8d0: 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
b8e0: 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
b8f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
b900: 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
b910: 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
b920: 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
b930: 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
b940: 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
b950: 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
b960: 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
b970: 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
b980: 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
b990: 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
b9a0: 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
b9b0: 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
b9c0: 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
b9d0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9f0: 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
ba00: 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
ba10: 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
ba20: 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
ba30: 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
ba40: 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
ba50: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
ba60: 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a 2a  eLockPB2)../* .*
ba70: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
ba80: 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c  ccess, 1 on fail
ba90: 75 72 65 2e 20 20 54 6f 20 6d 61 74 63 68 20 74  ure.  To match t
baa0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
bab0: 68 65 20 0a 2a 2a 20 6e 6f 72 6d 61 6c 20 70 6f  he .** normal po
bac0: 73 69 78 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  six file locking
bad0: 20 28 75 73 65 64 20 69 6e 20 75 6e 69 78 4c 6f   (used in unixLo
bae0: 63 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 2c  ck for example),
baf0: 20 77 65 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 70   we should .** p
bb00: 72 6f 76 69 64 65 20 27 72 69 63 68 65 72 27 20  rovide 'richer' 
bb10: 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2d 20 73  return codes - s
bb20: 70 65 63 69 66 69 63 61 6c 6c 79 20 74 6f 20 64  pecifically to d
bb30: 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
bb40: 77 65 65 6e 0a 2a 2a 20 27 66 69 6c 65 20 62 75  ween.** 'file bu
bb50: 73 79 27 20 61 6e 64 20 27 66 69 6c 65 20 73 79  sy' and 'file sy
bb60: 73 74 65 6d 20 65 72 72 6f 72 27 20 72 65 73 75  stem error' resu
bb70: 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lts..*/.static i
bb80: 6e 74 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  nt _AFPFSSetLock
bb90: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
bba0: 70 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 2c  path, .  int fd,
bbb0: 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   .  unsigned lon
bbc0: 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a  g long offset, .
bbd0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
bbe0: 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20  long length, .  
bbf0: 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a  int setLockFlag.
bc00: 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
bc10: 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 20 20 20  RangeLockPB2    
bc20: 20 20 20 70 62 3b 0a 20 20 69 6e 74 20 20 20 20     pb;.  int    
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
bc50: 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
bc60: 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
bc70: 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
bc80: 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
bc90: 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
bca0: 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
bcb0: 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 66 64  h; .  pb.fd = fd
bcc0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 41 46  ;.  OSTRACE5("AF
bcd0: 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67 20 6c 6f  PLOCK setting lo
bce0: 63 6b 20 25 73 20 66 6f 72 20 25 64 20 69 6e 20  ck %s for %d in 
bcf0: 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
bd00: 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
bd10: 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
bd20: 29 2c 20 66 64 2c 20 6f 66 66 73 65 74 2c 20 6c  ), fd, offset, l
bd30: 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20  ength);.  err = 
bd40: 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
bd50: 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
bd60: 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
bd70: 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
bd80: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22  {.    OSTRACE4("
bd90: 41 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  AFPLOCK failed t
bda0: 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
bdb0: 64 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20 65  d %s\n", path, e
bdc0: 72 72 6e 6f 2c 20 0a 20 20 20 20 20 20 73 74 72  rrno, .      str
bdd0: 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20  error(errno));. 
bde0: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20     return 1; /* 
bdf0: 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 20 65 6c 73  error */.  } els
be00: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e {.    return 0
be10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  ;.  }.}../*. ** 
be20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
be30: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
be40: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
be50: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
be60: 69 66 69 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62  ified. ** file b
be70: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
be80: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
be90: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
bea0: 65 6c 64 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20  eld, return. ** 
beb0: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68  non-zero.  If th
bec0: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
bed0: 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79  ed or holds only
bee0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74   SHARED locks, t
bef0: 68 65 6e 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a  hen. ** return z
bf00: 65 72 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ero.. */.static 
bf10: 69 6e 74 20 61 66 70 55 6e 69 78 43 68 65 63 6b  int afpUnixCheck
bf20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
bf30: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
bf40: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
bf50: 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69  int r = 0;.  uni
bf60: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
bf70: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
bf80: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
bf90: 20 29 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e   ); .  afpLockin
bfa0: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
bfb0: 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
bfc0: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
bfd0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
bfe0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
bff0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
c000: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
c010: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
c020: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
c030: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
c040: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
c050: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
c060: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
c070: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
c080: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
c090: 20 20 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20    if ( !r ) {.  
c0a0: 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 62 79    /* lock the by
c0b0: 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61  te */.    int fa
c0c0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
c0d0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
c0e0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
c0f0: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
c100: 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20   1,1);  .    if 
c110: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
c120: 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
c130: 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
c140: 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
c150: 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
c160: 2a 2f 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a  */.      r = 1;.
c170: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
c180: 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
c190: 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
c1a0: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
c1b0: 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
c1c0: 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
c1d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
c1e0: 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46  ate */.      _AF
c1f0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
c200: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
c210: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
c220: 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
c230: 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
c240: 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E3("TEST WR-LOCK
c250: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
c260: 2d 3e 68 2c 20 72 29 3b 0a 20 20 0a 20 20 2a 70  ->h, r);.  .  *p
c270: 52 65 73 4f 75 74 20 3d 20 72 3b 0a 20 20 72 65  ResOut = r;.  re
c280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c290: 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20  }../* AFP-style 
c2a0: 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  locking followin
c2b0: 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  g the behavior o
c2c0: 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20  f unixLock, see 
c2d0: 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a  the unixLock .**
c2e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e   function commen
c2f0: 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f  ts for details o
c300: 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e  f lock managemen
c310: 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t. */.static int
c320: 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 73 71 6c   afpUnixLock(sql
c330: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c340: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
c350: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c360: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
c370: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c380: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
c390: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
c3a0: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
c3b0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
c3c0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
c3d0: 74 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  t;.  int gotPend
c3e0: 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a  ingLock = 0;.  .
c3f0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
c400: 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c  );.  OSTRACE5("L
c410: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
c420: 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
c430: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
c440: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
c450: 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
c460: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
c470: 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64 28  cktype), getpid(
c480: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
c490: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
c4a0: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
c4b0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
c4c0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
c4d0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
c4e0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
c4f0: 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
c500: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
c510: 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74 65  s.  ** enterMute
c520: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
c530: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
c540: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
c550: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
c560: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33   ){.    OSTRACE3
c570: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
c580: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
c590: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
c5a0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
c5b0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
c5c0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
c5d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
c5e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
c5f0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
c600: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
c610: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
c620: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
c630: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
c640: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
c650: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
c660: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
c670: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c680: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
c690: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
c6a0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
c6b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
c6c0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
c6d0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
c6e0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
c6f0: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
c700: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e 74  reads.  */.  ent
c710: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
c720: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
c730: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
c740: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
c750: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
c760: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
c770: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
c780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c  LITE_OK ){.    l
c790: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
c7a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
c7b0: 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
c7c0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
c7d0: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
c7e0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
c7f0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
c800: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
c810: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
c820: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
c830: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
c840: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
c850: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
c860: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
c870: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
c880: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
c890: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
c8a0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
c8b0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
c8c0: 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
c8d0: 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
c8e0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
c8f0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
c900: 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49   pFile->h, PENDI
c910: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
c920: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
c930: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
c940: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
c950: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
c960: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
c970: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c980: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c990: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c9a0: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c9b0: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c9c0: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c9d0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c9e0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c9f0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
ca00: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ca10: 69 6e 74 20 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a  int lk, failed;.
ca20: 20 20 20 20 69 6e 74 20 74 72 69 65 73 20 3d 20      int tries = 
ca30: 30 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e  0;.    .    /* N
ca40: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
ca50: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  lock */.    /* n
ca60: 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
ca70: 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
ca80: 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
ca90: 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
caa0: 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
cab0: 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65  om(); .    conte
cac0: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
cad0: 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66  te = (lk & 0x7ff
cae0: 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
caf0: 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 66 61  IZE - 1);.    fa
cb00: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
cb10: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
cb20: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
cb30: 2c 20 0a 20 20 20 20 20 20 53 48 41 52 45 44 5f  , .      SHARED_
cb40: 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
cb50: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
cb60: 2c 20 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f  , 1);.    .    /
cb70: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
cb80: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
cb90: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 5f 41 46  k */.    if (_AF
cba0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
cbb0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
cbc0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
cbd0: 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20  BYTE, 1, 0)) {. 
cbe0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cbf0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
cc00: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
cc10: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
cc20: 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
cc30: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
cc40: 20 20 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65    .    if( faile
cc50: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
cc60: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
cc70: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
cc80: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
cc90: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
cca0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ccb0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
ccc0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
ccd0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
cce0: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
ccf0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
cd00: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
cd10: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
cd20: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
cd30: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
cd40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
cd50: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
cd60: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
cd70: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
cd80: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
cd90: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
cda0: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
cdb0: 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
cdc0: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
cdd0: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
cde0: 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
cdf0: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
ce00: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
ce10: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
ce20: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
ce30: 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
ce40: 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
ce50: 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d  d && locktype ==
ce60: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
ce70: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
ce80: 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
ce90: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
cea0: 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
ceb0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
cec0: 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
ced0: 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
cee0: 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
cef0: 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
cf00: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
cf10: 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
cf20: 74 68 65 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  the  afpUnixUnlo
cf30: 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
cf40: 20 20 69 66 20 28 21 5f 41 46 50 46 53 53 65 74    if (!_AFPFSSet
cf50: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
cf60: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
cf70: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
cf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
cfa0: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
cfb0: 65 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  e, 1, 0)) {.    
cfc0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
cfd0: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
cfe0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
cff0: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
d000: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
d010: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d020: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d030: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
d040: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
d070: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 61  ;.        if (fa
d080: 69 6c 65 64 20 26 26 20 5f 41 46 50 46 53 53 65  iled && _AFPFSSe
d090: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d0a0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d0b0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
d0c0: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
d0f0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
d100: 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 1)) {.        
d110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
d120: 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74  ERR_RDLOCK; /* t
d130: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
d140: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
d150: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
d160: 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 2a  e {.        /* *
d170: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
d180: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d190: 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75  CK; /* this shou
d1a0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
d1b0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
d1c0: 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
d1d0: 26 26 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  && rc == SQLITE_
d1e0: 4f 4b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  OK){.      rc = 
d1f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d200: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
d210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d220: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
d230: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
d240: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
d250: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
d260: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d270: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
d280: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
d290: 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
d2a0: 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  :.  leaveMutex()
d2b0: 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  ;.  OSTRACE4("LO
d2c0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
d2d0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
d2e0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
d2f0: 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  pe), .         r
d300: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
d310: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
d320: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d330: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
d340: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
d350: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
d360: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
d370: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
d380: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
d390: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
d3a0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
d3b0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
d3c0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
d3d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
d3e0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
d3f0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
d400: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
d410: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
d420: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d430: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
d440: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d450: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
d460: 6b 74 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63  ktype) {.  struc
d470: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d480: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d490: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d4a0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d4b0: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
d4c0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
d4d0: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
d4e0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
d4f0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
d500: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
d510: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
d520: 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
d530: 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
d540: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
d550: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
d560: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
d570: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20   getpid());.  . 
d580: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
d590: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
d5a0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
d5b0: 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
d5c0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
d5d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d5e0: 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
d5f0: 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
d600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d610: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e  MISUSE;.  }.  en
d620: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
d630: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
d640: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
d650: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
d660: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
d670: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c  {.      int fail
d680: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ed = 0;..      /
d690: 2a 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63  * unlock the exc
d6a0: 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74  lusive range - t
d6b0: 68 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  hen re-establish
d6c0: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
d6d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46   */.      if (pF
d6e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45  ile->locktype==E
d6f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
d700: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
d710: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
d720: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d730: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
d740: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
d770: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
d780: 20 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65        if (!faile
d790: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d) {.          /
d7a0: 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  * successfully r
d7b0: 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75  emoved the exclu
d7c0: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  sive lock */.   
d7d0: 20 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46         if (_AFPF
d7e0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
d7f0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
d800: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
d810: 53 54 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ST+.            
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
d840: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20  ockByte, 1, 1)) 
d850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
d860: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73   failed to re-es
d870: 74 61 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72  tablish our shar
d880: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
d890: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d8a0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
d8b0: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
d8c0: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
d8d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d8e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d8f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
d900: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
d910: 65 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75  en - failed to u
d920: 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73  nlock the exclus
d930: 69 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ive range */.   
d940: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d950: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
d960: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
d970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d980: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
d990: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
d9a0: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
d9b0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
d9c0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
d9d0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
d9e0: 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49   pFile->h, PENDI
d9f0: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b  NG_BYTE, 1, 0)){
da00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  .        /* fail
da10: 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ed to release th
da20: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  e pending lock *
da30: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
da40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
da50: 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  CK; /* This shou
da60: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
da70: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
da80: 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20   .    if (rc == 
da90: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
daa0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
dab0: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
dac0: 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53       if (_AFPFSS
dad0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
dae0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
daf0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
db00: 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  E, 1, 0)) {.    
db10: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
db20: 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73   release the res
db30: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
db40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
db50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
db60: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
db70: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
db80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
db90: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
dba0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
dbb0: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
dbc0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
dbd0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
dbe0: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
dc10: 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74  _FIRST + context
dc20: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
dc30: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  , 1, 0);.    if 
dc40: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
dc50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
dc60: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
dc70: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
dc80: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d   happen */.    }
dc90: 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d  .  }.  if (rc ==
dca0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
dcb0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
dcc0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 6c 65  = locktype;.  le
dcd0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
dce0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dcf0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
dd00: 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
dd10: 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
dd20: 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
dd30: 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73   int afpUnixClos
dd40: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
dd50: 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
dd60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
dd70: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 66 28 20  ile*)id;..  if( 
dd80: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
dd90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 66 70  SQLITE_OK;.  afp
dda0: 55 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  UnixUnlock(id, N
ddb0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  O_LOCK);.  sqlit
ddc0: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
ddd0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
dde0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
ddf0: 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46  fd>=0 ) close(pF
de00: 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70  ile->dirfd);.  p
de10: 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31  File->dirfd = -1
de20: 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ;.  enterMutex()
de30: 3b 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  ;.  close(pFile-
de40: 3e 68 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65  >h);.  leaveMute
de50: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  x();.  OSTRACE2(
de60: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
de70: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f  , pFile->h);.  O
de80: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
de90: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
dea0: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
deb0: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
dec0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70  QLITE_OK;.}...#p
ded0: 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b  ragma mark flock
dee0: 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67  () style locking
def0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c 6f 63  ../*.** The floc
df00: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
df10: 69 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f 0a 74  is not used.*/.t
df20: 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63  ypedef void floc
df30: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
df40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  ..static int flo
df50: 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72  ckUnixCheckReser
df60: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
df70: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
df80: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
df90: 20 3d 20 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 1;.  unixFile
dfa0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
dfb0: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66  ile*)id;.  .  if
dfc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
dfd0: 65 20 21 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e != RESERVED_LO
dfe0: 43 4b 29 20 7b 0a 20 20 20 20 2f 2a 20 61 74 74  CK) {.    /* att
dff0: 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
e000: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
e010: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
e020: 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
e030: 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 20  OCK_NB);.    if 
e040: 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20 2f 2a  (!rc) {.      /*
e050: 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
e060: 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
e070: 20 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68    flock(pFile->h
e080: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
e090: 20 20 72 20 3d 20 30 3b 20 20 2f 2a 20 6e 6f 20    r = 0;  /* no 
e0a0: 6f 6e 65 20 68 61 73 20 69 74 20 72 65 73 65 72  one has it reser
e0b0: 76 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ved */.    }.  }
e0c0: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
e0d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e0e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
e0f0: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63  int flockUnixLoc
e100: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
e110: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
e120: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
e130: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e140: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2a 20 69  e*)id;.  .  /* i
e150: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
e160: 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
e170: 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
e180: 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
e190: 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
e1a0: 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
e1b0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
e1c0: 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
e1d0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
e1e0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
e1f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e200: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
e210: 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
e220: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
e230: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
e240: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
e250: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 69   | LOCK_NB);.  i
e260: 66 20 28 72 63 29 20 7b 0a 20 20 20 20 2f 2a 20  f (rc) {.    /* 
e270: 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
e280: 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
e290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e2a0: 53 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  SY;.  } else {. 
e2b0: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
e2c0: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
e2d0: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
e2e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e2f0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
e300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e310: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
e320: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c  int flockUnixUnl
e330: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e340: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e350: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
e360: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e370: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
e380: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
e390: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e3a0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
e3b0: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
e3c0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
e3d0: 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
e3e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e3f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e400: 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
e410: 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
e420: 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
e430: 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
e440: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
e450: 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
e460: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
e470: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
e480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e490: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
e4a0: 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
e4b0: 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ck. */.  int rc 
e4c0: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
e4d0: 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66  , LOCK_UN);.  if
e4e0: 20 28 72 63 29 0a 20 20 20 20 72 65 74 75 72 6e   (rc).    return
e4f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e500: 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20  LOCK;.  else {. 
e510: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
e520: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
e530: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e540: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
e550: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
e560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
e570: 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  ckUnixClose(sqli
e580: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
e590: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e5a0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e5b0: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 70 46 69  d;.  .  if( !pFi
e5c0: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
e5d0: 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e  TE_OK;.  flockUn
e5e0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
e5f0: 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20  LOCK);.  .  if( 
e600: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
e610: 29 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ) close(pFile->d
e620: 69 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  irfd);.  pFile->
e630: 64 69 72 66 64 20 3d 20 2d 31 3b 0a 0a 20 20 65  dirfd = -1;..  e
e640: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 63  nterMutex();.  c
e650: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20  lose(pFile->h); 
e660: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
e670: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
e680: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
e690: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
e6a0: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d  Counter(-1);.  m
e6b0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
e6c0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
e6d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e6e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70 72 61 67 6d  TE_OK;.}..#pragm
e6f0: 61 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f  a mark Old-Schoo
e700: 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73  l .lock file bas
e710: 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a  ed locking../*.*
e720: 2a 20 54 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * The dotlockLoc
e730: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
e740: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
e750: 6c 6c 20 64 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63  ll dotlock (.loc
e760: 6b 29 20 6c 6f 63 6b 0a 2a 2a 20 73 70 65 63 69  k) lock.** speci
e770: 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70  fic state.*/.typ
e780: 65 64 65 66 20 73 74 72 75 63 74 20 64 6f 74 6c  edef struct dotl
e790: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
e7a0: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  t dotlockLocking
e7b0: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
e7c0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
e7d0: 6e 74 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a  ntext {.  char *
e7e0: 6c 6f 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73  lockPath;.};...s
e7f0: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
e800: 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  kUnixCheckReserv
e810: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
e820: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
e830: 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
e840: 20 3d 20 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 1;.  unixFile
e850: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e860: 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f  ile*)id;.  dotlo
e870: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
e880: 20 2a 63 6f 6e 74 65 78 74 3b 0a 0a 20 20 63 6f   *context;..  co
e890: 6e 74 65 78 74 20 3d 20 28 64 6f 74 6c 6f 63 6b  ntext = (dotlock
e8a0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
e8b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
e8c0: 6e 74 65 78 74 3b 0a 20 20 69 66 20 28 70 46 69  ntext;.  if (pFi
e8d0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 21 3d 20  le->locktype != 
e8e0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
e8f0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
e900: 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20 69 66   statBuf;.    if
e910: 20 28 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d   (lstat(context-
e920: 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42  >lockPath,&statB
e930: 75 66 29 20 21 3d 20 30 29 7b 0a 20 20 20 20 20  uf) != 0){.     
e940: 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f   /* file does no
e950: 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c  t exist, we coul
e960: 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
e970: 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
e980: 20 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   r = 0;.    }.  
e990: 7d 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  }..  *pResOut = 
e9a0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
e9b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
e9c0: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
e9d0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e9e0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
e9f0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
ea00: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ea10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c  File*)id;.  dotl
ea20: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
ea30: 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  t *context;.  in
ea40: 74 20 66 64 3b 0a 0a 20 20 63 6f 6e 74 65 78 74  t fd;..  context
ea50: 20 3d 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69   = (dotlockLocki
ea60: 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
ea70: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
ea80: 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77 65 20  ;.  .  /* if we 
ea90: 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
eaa0: 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
eab0: 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
eac0: 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
ead0: 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
eae0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
eaf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
eb00: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
eb10: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eb20: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
eb30: 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20   .    /* Always 
eb40: 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
eb50: 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
eb60: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d  file */.    utim
eb70: 65 73 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  es(context->lock
eb80: 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20  Path,NULL);.    
eb90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eba0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 63 68  ;.  }.  .  /* ch
ebb0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6c 6f  eck to see if lo
ebc0: 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20  ck file already 
ebd0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 73 74 72 75  exists */.  stru
ebe0: 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
ebf0: 0a 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e  .  if (lstat(con
ec00: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26  text->lockPath,&
ec10: 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a  statBuf) == 0){.
ec20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec30: 45 5f 42 55 53 59 3b 20 2f 2a 20 69 74 20 64 6f  E_BUSY; /* it do
ec40: 65 73 2c 20 62 75 73 79 20 2a 2f 0a 20 20 7d 0a  es, busy */.  }.
ec50: 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
ec60: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
ec70: 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f  /.  fd = open(co
ec80: 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
ec90: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
eca0: 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
ecb0: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
ecc0: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
ecd0: 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
ece0: 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
ecf0: 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
ed00: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
ed10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
ed20: 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c 6f 73  USY; .  }.  clos
ed30: 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 67  e(fd);.  .  /* g
ed40: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
ed50: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
ed60: 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
ed70: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
ed80: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
ed90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
eda0: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
edb0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
edc0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
edd0: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
ede0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
edf0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f  ixFile*)id;.  do
ee00: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
ee10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 0a 20  ext *context;.. 
ee20: 20 63 6f 6e 74 65 78 74 20 3d 20 28 64 6f 74 6c   context = (dotl
ee30: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
ee40: 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
ee50: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
ee60: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
ee70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
ee80: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
ee90: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
eea0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
eeb0: 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
eec0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eed0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
eee0: 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
eef0: 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
ef00: 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
ef10: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
ef20: 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
ef30: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
ef40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
ef50: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
ef60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ef70: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
ef80: 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
ef90: 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  ock. */.  unlink
efa0: 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
efb0: 74 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  th);.  pFile->lo
efc0: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
efd0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
efe0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
eff0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
f000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
f010: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73 71  lockUnixClose(sq
f020: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
f030: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f040: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f050: 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 70  )id;.  .  if( !p
f060: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
f070: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64 6f 74 6c 6f  LITE_OK;.  dotlo
f080: 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c  ckUnixUnlock(id,
f090: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c   NO_LOCK);.  sql
f0a0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
f0b0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f0c0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
f0d0: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
f0e0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
f0f0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
f100: 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  -1;.  enterMutex
f110: 28 29 3b 20 20 0a 20 20 63 6c 6f 73 65 28 70 46  ();  .  close(pF
f120: 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c 65 61 76 65  ile->h);.  leave
f130: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
f140: 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE2("CLOSE   %-3
f150: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
f160: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
f170: 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  1);.  memset(pFi
f180: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
f190: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
f1a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f1b0: 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e  ..#pragma mark N
f1c0: 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a  o locking../*.**
f1d0: 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69   The nolockLocki
f1e0: 6e 67 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69  ngContext is voi
f1f0: 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69  d.*/.typedef voi
f200: 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  d nolockLockingC
f210: 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20  ontext;..static 
f220: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68  int nolockUnixCh
f230: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
f240: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f250: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
f260: 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  {.  *pResOut = 0
f270: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f280: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
f290: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f  int nolockUnixLo
f2a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f2b0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f2c0: 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  e) {.  return SQ
f2d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
f2e0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
f2f0: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
f300: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
f310: 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75  cktype) {.  retu
f320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f330: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
f340: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
f350: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f  nt nolockUnixClo
f360: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f370: 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  *id) {.  unixFil
f380: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f390: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69  File*)id;.  .  i
f3a0: 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75  f( !pFile ) retu
f3b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f3c0: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
f3d0: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c  >=0 ) close(pFil
f3e0: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69  e->dirfd);.  pFi
f3f0: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
f400: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
f410: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68    close(pFile->h
f420: 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  );.  leaveMutex(
f430: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  );.  OSTRACE2("C
f440: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
f450: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65  pFile->h);.  Ope
f460: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
f470: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
f480: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
f490: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
f4a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
f4b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
f4c0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
f4d0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f   */.../*.** Info
f4e0: 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
f4f0: 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
f500: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
f510: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
f520: 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
f530: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f540: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
f550: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f560: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f570: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
f580: 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
f590: 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
f5a0: 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
f5b0: 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
f5c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
f5d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f5e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
f5f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f600: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
f610: 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
f620: 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
f630: 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
f640: 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
f650: 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
f660: 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
f670: 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
f680: 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
f690: 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
f6a0: 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
f6b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
f6c0: 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
f6d0: 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
f6e0: 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
f6f0: 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
f700: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
f710: 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
f720: 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
f730: 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
f740: 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
f750: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
f760: 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
f770: 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
f780: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
f790: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
f7a0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  _file *id){.  re
f7b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
f7c0: 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
f7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f7e0: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
f7f0: 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
f800: 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
f810: 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2f 0a 73  s always 0..*/.s
f820: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
f830: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
f840: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
f850: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
f860: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
f870: 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
f880: 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
f890: 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
f8a0: 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66   on an sqlite3_f
f8b0: 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e  ile.** for unix.
f8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
f8d0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
f8e0: 6f 64 73 20 73 71 6c 69 74 65 33 55 6e 69 78 49  ods sqlite3UnixI
f8f0: 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c  oMethod = {.  1,
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
f920: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ion */.  unixClo
f930: 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  se,.  unixRead,.
f940: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
f950: 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75  nixTruncate,.  u
f960: 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46  nixSync,.  unixF
f970: 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c  ileSize,.  unixL
f980: 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  ock,.  unixUnloc
f990: 6b 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  k,.  unixCheckRe
f9a0: 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e  servedLock,.  un
f9b0: 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20  ixFileControl,. 
f9c0: 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
f9d0: 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  .  unixDeviceCha
f9e0: 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a  racteristics.};.
f9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fa00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
fa10: 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  YLE./*.** This v
fa20: 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
fa30: 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
fa40: 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
fa50: 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  n an sqlite3_fil
fa60: 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69  e.** for unix wi
fa70: 74 68 20 41 46 50 20 73 74 79 6c 65 20 66 69 6c  th AFP style fil
fa80: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
fa90: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
faa0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
fab0: 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55  lite3AFPLockingU
fac0: 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
fad0: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
faf0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 61 66 70  Version */.  afp
fb00: 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  UnixClose,.  uni
fb10: 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
fb20: 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61  te,.  unixTrunca
fb30: 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a  te,.  unixSync,.
fb40: 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
fb50: 20 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20    afpUnixLock,. 
fb60: 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a   afpUnixUnlock,.
fb70: 20 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65    afpUnixCheckRe
fb80: 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e  servedLock,.  un
fb90: 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20  ixFileControl,. 
fba0: 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
fbb0: 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  .  unixDeviceCha
fbc0: 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a  racteristics.};.
fbd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
fbe0: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
fbf0: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
fc00: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
fc10: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a  n sqlite3_file.*
fc20: 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20  * for unix with 
fc30: 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 66 69  flock() style fi
fc40: 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  le locking..*/.s
fc50: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
fc60: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73  te3_io_methods s
fc70: 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69  qlite3FlockLocki
fc80: 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
fc90: 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcb0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
fcc0: 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a  flockUnixClose,.
fcd0: 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
fce0: 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54  ixWrite,.  unixT
fcf0: 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
fd00: 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53  ync,.  unixFileS
fd10: 69 7a 65 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78  ize,.  flockUnix
fd20: 4c 6f 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69  Lock,.  flockUni
fd30: 78 55 6e 6c 6f 63 6b 2c 0a 20 20 66 6c 6f 63 6b  xUnlock,.  flock
fd40: 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
fd50: 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c  dLock,.  unixFil
fd60: 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78  eControl,.  unix
fd70: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
fd80: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
fd90: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a  ristics.};../*.*
fda0: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
fdb0: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
fdc0: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
fdd0: 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c  perate on an sql
fde0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72  ite3_file.** for
fdf0: 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f   unix with dotlo
fe00: 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  ck style file lo
fe10: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
fe20: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
fe30: 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  o_methods sqlite
fe40: 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  3DotlockLockingU
fe50: 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
fe60: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
fe80: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 64 6f 74  Version */.  dot
fe90: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20  lockUnixClose,. 
fea0: 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69   unixRead,.  uni
feb0: 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72  xWrite,.  unixTr
fec0: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
fed0: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  nc,.  unixFileSi
fee0: 7a 65 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ze,.  dotlockUni
fef0: 78 4c 6f 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b  xLock,.  dotlock
ff00: 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 64 6f  UnixUnlock,.  do
ff10: 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  tlockUnixCheckRe
ff20: 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e  servedLock,.  un
ff30: 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20  ixFileControl,. 
ff40: 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
ff50: 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  .  unixDeviceCha
ff60: 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a  racteristics.};.
ff70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
ff80: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
ff90: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
ffa0: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
ffb0: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a  n sqlite3_file.*
ffc0: 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20  * for unix with 
ffd0: 6e 6f 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  nolock style fil
ffe0: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
fff0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
10000 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
10010 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
10020 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
10030 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10050 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
10060 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c  nolockUnixClose,
10070 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
10080 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
10090 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78  Truncate,.  unix
100a0 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Sync,.  unixFile
100b0 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  Size,.  nolockUn
100c0 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b  ixLock,.  nolock
100d0 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 6e 6f  UnixUnlock,.  no
100e0 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
100f0 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
10100 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
10110 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
10120 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
10130 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
10140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10150 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10160 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
10170 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
10180 66 6f 72 20 61 20 6e 65 77 20 75 6e 69 78 46 69  for a new unixFi
10190 6c 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  le and initializ
101a0 65 20 74 68 61 74 20 75 6e 69 78 46 69 6c 65 2e  e that unixFile.
101b0 0a 2a 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e  .** Write a poin
101c0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 75  ter to the new u
101d0 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70 49  nixFile into *pI
101e0 64 2e 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e 20  d..** If we run 
101f0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63  out of memory, c
10200 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
10210 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
10220 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
10230 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10240 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
10250 57 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74  When locking ext
10260 65 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62  ensions are enab
10270 6c 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74  led, the filepat
10280 68 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74  h and locking st
10290 79 6c 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64  yle .** are need
102a0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
102b0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65  the unixFile pMe
102c0 74 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20  thod to use for 
102d0 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
102e0 6e 73 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ns..** The locki
102f0 6e 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng-style specifi
10300 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  c lockingContext
10310 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
10320 69 73 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61  is created .** a
10330 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65  nd assigned here
10340 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
10350 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
10360 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20  ile(.  int h,   
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10380 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
10390 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
103a0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
103b0 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
103c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
103d0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
103e0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
103f0 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
10400 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
10410 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
10420 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
10430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
10440 65 6e 61 6d 65 20 20 20 2f 2a 20 4e 61 6d 65 20  ename   /* Name 
10450 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
10460 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20  g opened */.){. 
10470 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
10480 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79 6c  tyle lockingStyl
10490 65 20 3d 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79  e = noLockingSty
104a0 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
104b0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
104c0 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
104d0 3b 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ;..#ifdef FD_CLO
104e0 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20  EXEC.  fcntl(h, 
104f0 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 68  F_SETFD, fcntl(h
10500 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
10510 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
10520 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
10530 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c  New->pLock==NULL
10540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
10550 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20  ew->pOpen==NULL 
10560 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
10570 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
10580 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
10590 4c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  L then this is a
105a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
105b0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
105c0 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e 65 76 65  .    ** are neve
105d0 72 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  r locked or unlo
105e0 63 6b 65 64 2c 20 73 6f 20 6e 6f 4c 6f 63 6b 69  cked, so noLocki
105f0 6e 67 53 74 79 6c 65 20 69 73 20 75 73 65 64 20  ngStyle is used 
10600 66 6f 72 20 74 68 65 73 65 2e 0a 20 20 20 20 2a  for these..    *
10610 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74  * The locking st
10620 79 6c 65 20 75 73 65 64 20 62 79 20 6f 74 68 65  yle used by othe
10630 72 20 66 69 6c 65 73 20 69 73 20 64 65 74 65 72  r files is deter
10640 6d 69 6e 65 64 20 62 79 20 0a 20 20 20 20 2a 2a  mined by .    **
10650 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f   sqlite3DetectLo
10660 63 6b 69 6e 67 53 74 79 6c 65 28 29 2e 0a 20 20  ckingStyle()..  
10670 20 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 69 6e 67    */.    locking
10680 53 74 79 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Style = sqlite3D
10690 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  etectLockingStyl
106a0 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b  e(zFilename, h);
106b0 0a 20 20 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e  .    if ( lockin
106c0 67 53 74 79 6c 65 3d 3d 70 6f 73 69 78 4c 6f 63  gStyle==posixLoc
106d0 6b 69 6e 67 53 74 79 6c 65 20 29 7b 0a 20 20 20  kingStyle ){.   
106e0 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b     enterMutex();
106f0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
10700 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65  LockInfo(h, &pNe
10710 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
10720 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6c  >pOpen);.      l
10730 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
10740 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10750 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
10760 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
10770 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  ;.        close(
10780 68 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  h);.        retu
10790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
107a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
107b0 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE3("OPEN    %-
107c0 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
107d0 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70  lename);    .  p
107e0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
107f0 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
10800 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  d;.  SET_THREADI
10810 44 28 70 4e 65 77 29 3b 0a 20 20 20 20 0a 20 20  D(pNew);.    .  
10820 73 77 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74  switch(lockingSt
10830 79 6c 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20  yle) {.    case 
10840 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  afpLockingStyle:
10850 20 7b 0a 20 20 20 20 20 20 2f 2a 20 61 66 70 20   {.      /* afp 
10860 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
10870 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
10880 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
10890 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  luded in.      *
108a0 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
108b0 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20  Context */.     
108c0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
108d0 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 20  xt *context;.   
108e0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
108f0 20 3d 20 26 73 71 6c 69 74 65 33 41 46 50 4c 6f   = &sqlite3AFPLo
10900 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
10910 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  d;.      pNew->l
10920 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
10930 63 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69 74 65  context = sqlite
10940 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
10950 28 2a 63 6f 6e 74 65 78 74 29 20 29 3b 0a 20 20  (*context) );.  
10960 20 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74 3d      if( context=
10970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
10980 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20  ose(h);.        
10990 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
109a0 6c 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20  lose(dirfd);.   
109b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
109c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
109d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  }..      /* NB: 
109e0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
109f0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
10a00 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
10a10 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
10a20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
10a30 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
10a40 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
10a50 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
10a60 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
10a70 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
10a80 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 65  . */.      conte
10a90 78 74 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20 7a  xt->filePath = z
10aa0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
10ab0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
10ac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10ad0 0a 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c  .    case flockL
10ae0 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20  ockingStyle:.   
10af0 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b     /* flock lock
10b00 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
10b10 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10b20 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
10b30 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
10b40 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
10b50 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63  &sqlite3FlockLoc
10b60 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
10b70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10b80 20 20 20 63 61 73 65 20 64 6f 74 6c 6f 63 6b 4c     case dotlockL
10b90 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 20 7b 0a 20  ockingStyle: {. 
10ba0 20 20 20 20 20 2f 2a 20 64 6f 74 6c 6f 63 6b 20       /* dotlock 
10bb0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
10bc0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
10bd0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
10be0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  luded in.      *
10bf0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
10c00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
10c10 20 20 20 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b       dotlockLock
10c20 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
10c30 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ext;.      int n
10c40 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
10c50 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c  nFilename = strl
10c60 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  en(zFilename);. 
10c70 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
10c80 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 44 6f 74  od = &sqlite3Dot
10c90 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
10ca0 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 70  oMethod;.      p
10cb0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
10cc0 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 20 3d 20  ext = context = 
10cd0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
10ce0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
10cf0 28 2a 63 6f 6e 74 65 78 74 29 20 2b 20 6e 46 69  (*context) + nFi
10d00 6c 65 6e 61 6d 65 20 2b 20 36 20 29 3b 0a 20 20  lename + 6 );.  
10d10 20 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74 3d      if( context=
10d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
10d30 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20  ose(h);.        
10d40 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
10d50 6c 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20  lose(dirfd);.   
10d60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10d70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10d80 7d 0a 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d  }.      context-
10d90 3e 6c 6f 63 6b 50 61 74 68 20 3d 20 28 63 68 61  >lockPath = (cha
10da0 72 2a 29 26 63 6f 6e 74 65 78 74 5b 31 5d 3b 0a  r*)&context[1];.
10db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10dc0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
10dd0 2c 20 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  , context->lockP
10de0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
10df0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2e              "%s.
10e00 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lock", zFilename
10e10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10e20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 70      }.    case p
10e30 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  osixLockingStyle
10e40 3a 0a 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78  :.      /* posix
10e50 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74   locking doesn't
10e60 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c   need additional
10e70 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
10e80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
10e90 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
10ea0 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69  od = &sqlite3Uni
10eb0 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20  xIoMethod;.     
10ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10ed0 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a   noLockingStyle:
10ee0 0a 20 20 20 20 63 61 73 65 20 75 6e 73 75 70 70  .    case unsupp
10ef0 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c  ortedLockingStyl
10f00 65 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  e:.    default: 
10f10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  .      pNew->pMe
10f20 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 4e  thod = &sqlite3N
10f30 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  olockLockingUnix
10f40 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 7d 0a 20 20  IoMethod;.  }.  
10f50 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
10f60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10f70 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  _OK;.}.#else /* 
10f80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
10f90 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73  CKING_STYLE */.s
10fa0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
10fb0 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20  UnixFile(.  int 
10fc0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
10fd0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
10fe0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 66 69  descriptor on fi
10ff0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
11000 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 0a  */.  int dirfd,.
11010 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
11020 70 49 64 2c 20 20 20 20 20 2f 2a 20 57 72 69 74  pId,     /* Writ
11030 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
11040 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
11050 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11060 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 2f 2a 20   *zFilename  /* 
11070 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
11080 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
11090 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
110a0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
110b0 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
110c0 3b 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ;..#ifdef FD_CLO
110d0 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20  EXEC.  fcntl(h, 
110e0 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 68  F_SETFD, fcntl(h
110f0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
11100 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
11110 64 69 66 0a 0a 20 20 65 6e 74 65 72 4d 75 74 65  dif..  enterMute
11120 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64  x();.  rc = find
11130 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65  LockInfo(h, &pNe
11140 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d  w->pLock, &pNew-
11150 3e 70 4f 70 65 6e 29 3b 0a 20 20 6c 65 61 76 65  >pOpen);.  leave
11160 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
11170 63 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  c ){.    if( dir
11180 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
11190 72 66 64 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28  rfd);.    close(
111a0 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  h);.    return r
111b0 63 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  c;.  }..  OSTRAC
111c0 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
111d0 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
111e0 6e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 64  name);.  pNew->d
111f0 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  irfd = -1;.  pNe
11200 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
11210 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
11220 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
11230 70 4e 65 77 29 3b 0a 0a 20 20 70 4e 65 77 2d 3e  pNew);..  pNew->
11240 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
11250 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
11260 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
11270 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11280 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
11290 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
112a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
112b0 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  /../*.** Open a 
112c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
112d0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
112e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
112f0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
11300 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
11310 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
11320 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
11330 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
11340 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11350 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
11360 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
11370 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
11380 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
11390 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
113a0 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
113b0 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
113c0 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
113d0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
113e0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
113f0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
11400 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
11410 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
11420 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
11430 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
11440 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
11450 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
11460 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
11470 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
11480 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
11490 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
114a0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
114b0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
114c0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
114d0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
114e0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
114f0 0a 20 20 66 6f 72 28 69 69 3d 73 74 72 6c 65 6e  .  for(ii=strlen
11500 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 3d  (zDirname); ii>=
11510 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  0 && zDirname[ii
11520 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
11530 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
11540 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
11550 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f  '\0';.    fd = o
11560 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
11570 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
11580 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
11590 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
115a0 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63  CLOEXEC.      fc
115b0 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
115c0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
115d0 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
115e0 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
115f0 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45     OSTRACE3("OPE
11600 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
11610 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a   fd, zDirname);.
11620 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
11630 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
11640 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
11650 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  :SQLITE_CANTOPEN
11660 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
11670 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
11680 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
11690 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
116a0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
116b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
116c0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
116d0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
116e0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
116f0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
11700 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
11710 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
11720 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
11730 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
11740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
11750 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
11760 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
11770 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
11780 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
11790 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
117a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
117b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
117c0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
117d0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
117e0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
117f0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
11800 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
11810 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
11820 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
11830 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
11840 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
11850 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  ".";..  /* It's 
11860 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
11870 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
11880 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
11890 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
118a0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
118b0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
118c0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
118d0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
118e0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
118f0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
11900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11910 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11920 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69  IOERR );..  azDi
11930 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
11940 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
11950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
11960 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
11970 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69  of(azDirs[0]); i
11980 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44  ++){.    if( azD
11990 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  irs[i]==0 ) cont
119a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
119b0 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62  at(azDirs[i], &b
119c0 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
119d0 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
119e0 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
119f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
11a00 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b  ( access(azDirs[
11a10 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  i], 07) ) contin
11a20 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ue;.    zDir = a
11a30 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72  zDirs[i];.    br
11a40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  eak;.  }..  /* C
11a50 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
11a60 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
11a70 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
11a80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
11a90 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
11aa0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
11ab0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
11ac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74  ..  */.  if( (st
11ad0 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72  rlen(zDir) + str
11ae0 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  len(SQLITE_TEMP_
11af0 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31  FILE_PREFIX) + 1
11b00 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20  7) >= nBuf ){.  
11b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
11b30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11b40 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20  printf(nBuf-17, 
11b50 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
11b60 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
11b70 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
11b80 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
11b90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
11ba0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
11bb0 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
11bc0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
11bd0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
11be0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
11bf0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
11c00 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
11c10 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
11c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
11c30 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
11c40 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
11c50 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
11c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
11c70 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
11c80 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
11c90 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
11ca0 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
11cb0 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
11cc0 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
11cd0 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
11ce0 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
11cf0 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
11d00 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
11d10 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
11d20 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
11d30 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
11d40 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
11d50 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
11d60 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
11d70 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
11d80 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
11d90 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
11da0 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
11db0 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
11dc0 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
11dd0 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
11de0 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
11df0 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
11e00 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
11e10 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
11e20 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
11e30 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
11e40 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
11e50 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
11e60 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
11e70 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
11e80 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
11e90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11ea0 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
11eb0 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
11ec0 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
11ed0 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
11ee0 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
11ef0 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
11f00 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
11f10 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
11f20 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
11f30 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
11f40 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
11f50 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
11f60 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
11f70 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
11f80 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
11f90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
11fa0 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ile,.  int flags
11fb0 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  ,.  int *pOutFla
11fc0 67 73 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d  gs.){.  int fd =
11fd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11fe0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
11ff0 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
12000 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
12010 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
12020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12030 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69   /* Directory fi
12040 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
12050 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20  .  int oflags = 
12060 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12070 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
12080 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
12090 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
120a0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
120b0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
120c0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 0a 20 20 69   to open */..  i
120d0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
120e0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
120f0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
12100 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
12110 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
12120 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
12130 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
12140 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
12150 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
12160 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
12170 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
12180 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
12190 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
121a0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
121b0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
121c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
121d0 45 41 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a  EADWRITE);..  /*
121e0 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
121f0 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
12200 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
12210 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
12220 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
12230 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
12240 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
12250 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
12260 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
12270 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
12280 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
12290 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
122a0 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
122b0 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
122c0 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  nt isOpenDirecto
122d0 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ry = (isCreate &
122e0 26 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d  & .      (eType=
122f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
12300 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  TER_JOURNAL || e
12310 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
12320 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
12330 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72    );..  /* If ar
12340 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
12350 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
12360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12370 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
12380 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
12390 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
123a0 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
123b0 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
123c0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
123d0 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
123e0 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73  HNAME+1];.  cons
123f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
12400 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
12410 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
12420 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
12430 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
12440 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
12450 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
12460 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
12470 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
12480 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
12490 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
124a0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
124b0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
124c0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
124d0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
124e0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
124f0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
12500 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
12510 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
12520 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
12530 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
12540 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
12550 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
12560 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
12570 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
12580 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
12590 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
125a0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
125b0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
125c0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
125d0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
125e0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
125f0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
12600 69 73 43 72 65 61 74 65 29 3b 0a 0a 0a 20 20 2f  isCreate);...  /
12610 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
12620 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64  ain journal, and
12630 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12640 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61  are never automa
12650 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c  tically.  ** del
12660 65 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73 73 65  eted.  */.  asse
12670 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
12680 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
12690 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20  | !isDelete );. 
126a0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
126b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
126c0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
126d0 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65 72  elete );.  asser
126e0 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
126f0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
12700 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74  RNAL || !isDelet
12710 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  e );..  /* Asser
12720 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
12730 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
12740 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
12750 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
12760 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
12770 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
12780 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
12790 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
127a0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
127b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
127c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
127d0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
127f0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
12800 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
12810 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
12820 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
12830 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
12840 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
12850 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
12860 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
12870 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e  .  );..  if( !zN
12880 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ame ){.    int r
12890 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  c;.    assert(is
128a0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
128b0 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  nDirectory);.   
128c0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
128d0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
128e0 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
128f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
12910 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12920 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
12930 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  e;.  }..  if( is
12940 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 66 6c 61  Readonly )  ofla
12950 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
12960 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
12970 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f  e ) oflags |= O_
12980 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
12990 65 61 74 65 20 29 20 20 20 20 6f 66 6c 61 67 73  eate )    oflags
129a0 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
129b0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
129c0 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58   oflags |= (O_EX
129d0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
129e0 20 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c    oflags |= (O_L
129f0 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
12a00 59 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46  Y);..  memset(pF
12a10 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
12a20 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 66 64 20  nixFile));.  fd 
12a30 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 66  = open(zName, of
12a40 6c 61 67 73 2c 20 69 73 44 65 6c 65 74 65 3f 30  lags, isDelete?0
12a50 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55  600:SQLITE_DEFAU
12a60 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
12a70 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ONS);.  if( fd<0
12a80 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
12a90 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
12aa0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
12ab0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65   ){.    /* Faile
12ac0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
12ad0 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
12ae0 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
12af0 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
12b00 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
12b10 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12b20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
12b30 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20  ATE);.    flags 
12b40 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
12b50 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74  EADONLY;.    ret
12b60 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66  urn unixOpen(pVf
12b70 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c  s, zPath, pFile,
12b80 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
12b90 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  s);.  }.  if( fd
12ba0 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
12bb0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
12bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65  ;.  }.  if( isDe
12bd0 6c 65 74 65 20 29 7b 0a 20 20 20 20 75 6e 6c 69  lete ){.    unli
12be0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  nk(zName);.  }. 
12bf0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
12c00 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
12c10 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
12c20 20 61 73 73 65 72 74 28 66 64 21 3d 30 29 3b 0a   assert(fd!=0);.
12c30 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
12c40 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74  ctory ){.    int
12c50 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
12c60 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
12c70 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
12c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12c90 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
12ca0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12cb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12cc0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
12cd0 28 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c  (fd, dirfd, pFil
12ce0 65 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  e, zPath);.}../*
12cf0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
12d00 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
12d10 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
12d20 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
12d30 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
12d40 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
12d50 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
12d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
12d70 6e 69 78 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nixDelete(sqlite
12d80 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
12d90 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
12da0 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20  int dirSync){.  
12db0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12dc0 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  OK;.  SimulateIO
12dd0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
12de0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
12df0 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74  );.  unlink(zPat
12e00 68 29 3b 0a 20 20 69 66 28 20 64 69 72 53 79 6e  h);.  if( dirSyn
12e10 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
12e20 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
12e30 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
12e40 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
12e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e60 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
12e70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
12e80 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
12e90 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
12ea0 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  }.      close(fd
12eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
12ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12ed0 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
12ee0 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tance of or acce
12ef0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
12f00 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
12f10 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
12f20 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
12f30 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
12f40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
12f50 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
12f60 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
12f70 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
12f80 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
12f90 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
12fa0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
12fb0 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
12fc0 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
12fd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
12fe0 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
12ff0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
13000 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
13010 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
13020 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
13030 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
13040 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
13050 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
13060 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
13070 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
13080 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 69 6e 74  pResOut.){.  int
13090 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 53 69   amode = 0;.  Si
130a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
130b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
130c0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
130d0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
130e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
130f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
13100 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
13110 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
13120 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
13130 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
13140 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
13150 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
13160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13170 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
13180 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
13190 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
131a0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
131b0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
131c0 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
131d0 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
131e0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
131f0 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  access(zPath, am
13200 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75  ode)==0);.  retu
13210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13220 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
13230 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
13240 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
13250 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
13260 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
13270 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
13280 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
13290 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
132a0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
132b0 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
132c0 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
132d0 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
132e0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
132f0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
13300 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
13310 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
13320 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
13330 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
13340 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
13350 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
13360 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13370 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
13380 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
13390 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
133a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
133b0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
133c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
133d0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
133e0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
133f0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
13400 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
13430 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
13440 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
13450 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
13460 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
13470 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
13480 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
13490 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
134a0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
134b0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
134c0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
134d0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
134e0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
134f0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
13500 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
13510 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
13520 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
13530 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
13540 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
13550 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
13560 72 6b 69 6e 67 20 64 69 72 65 63 74 6c 79 20 68  rking directly h
13570 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
13580 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
13590 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
135a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
135b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
135c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
135d0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
135e0 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
135f0 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
13600 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
13610 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13620 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
13630 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
13640 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
13650 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77 64  ;.    if( getcwd
13660 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
13670 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13680 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
13690 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  N;.    }.    nCw
136a0 64 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29  d = strlen(zOut)
136b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
136c0 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
136d0 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
136e0 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
136f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13700 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f  E_OK;..#if 0.  /
13710 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f  *.  ** Remove "/
13720 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74  ./" path element
13730 73 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f  s and convert "/
13740 41 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65  A/./" path eleme
13750 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74  nts.  ** to just
13760 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   "/"..  */.  if(
13770 20 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e   zFull ){.    in
13780 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28  t i, j;.    for(
13790 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b  i=j=0; zFull[i];
137a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
137b0 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29   zFull[i]=='/' )
137c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
137d0 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20  ull[i+1]=='/' ) 
137e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
137f0 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d    if( zFull[i+1]
13800 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
13810 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
13820 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
13830 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
13840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13850 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
13860 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  1]=='.' && zFull
13870 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46  [i+2]=='.' && zF
13880 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  ull[i+3]=='/' ){
13890 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
138a0 28 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a  ( j>0 && zFull[j
138b0 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
138c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b   }.          i +
138d0 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 3;.          c
138e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
138f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13900 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46   zFull[j++] = zF
13910 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ull[i];.    }.  
13920 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a    zFull[j] = 0;.
13930 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23    }.#endif.}...#
13940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13950 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
13960 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
13970 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
13980 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
13990 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
139a0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
139b0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
139c0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
139d0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
139e0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
139f0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
13a00 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
13a10 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
13a20 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
13a30 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72  *zFilename){.  r
13a40 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
13a50 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
13a60 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
13a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
13a80 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
13a90 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
13aa0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
13ab0 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
13ac0 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
13ad0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
13ae0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
13af0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
13b00 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
13b10 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
13b20 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
13b30 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
13b40 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
13b50 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
13b60 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
13b70 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
13b80 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
13b90 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
13ba0 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
13bb0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
13bc0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
13bd0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
13be0 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
13bf0 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
13c00 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
13c10 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
13c20 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
13c30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13c40 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
13c50 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
13c60 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d 75 74 65  .  }.  leaveMute
13c70 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
13c80 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  id *unixDlSym(sq
13c90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
13ca0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20   void *pHandle, 
13cb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
13cc0 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  bol){.  return d
13cd0 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20 7a 53  lsym(pHandle, zS
13ce0 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  ymbol);.}.static
13cf0 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
13d00 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
13d10 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
13d20 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  le){.  dlclose(p
13d30 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
13d40 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
13d50 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
13d60 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
13d70 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
13d80 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
13d90 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
13da0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
13db0 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
13dc0 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
13dd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
13de0 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
13df0 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
13e00 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
13e10 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
13e20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
13e30 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
13e40 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
13e50 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
13e60 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 6e 42 75  ){..  assert(nBu
13e70 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
13e80 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
13e90 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
13ea0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
13eb0 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
13ec0 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
13ed0 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
13ee0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
13ef0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
13f00 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
13f10 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
13f20 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
13f30 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
13f40 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
13f50 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
13f60 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
13f70 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
13f80 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
13f90 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
13fa0 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
13fb0 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
13fc0 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
13fd0 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
13fe0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
13ff0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
14000 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
14010 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
14020 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
14030 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
14040 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
14050 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
14060 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
14070 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
14080 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
14090 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
140a0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
140b0 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
140c0 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
140d0 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
140e0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
140f0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
14100 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
14110 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
14120 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14130 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
14140 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
14150 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
14160 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
14170 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
14180 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
14190 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
141a0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
141b0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
141c0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
141d0 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
141e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
141f0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
14200 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
14210 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14220 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66     read(fd, zBuf
14230 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63  , nBuf);.      c
14240 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
14250 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
14260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14270 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
14280 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
14290 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
142a0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
142b0 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
142c0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
142d0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
142e0 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
142f0 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
14300 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
14310 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
14320 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
14330 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
14340 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
14350 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
14360 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
14370 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
14380 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
14390 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
143a0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
143b0 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
143c0 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
143d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
143e0 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
143f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
14400 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
14410 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
14420 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
14430 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
14440 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
14450 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
14460 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
14470 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
14480 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
14490 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
144a0 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72  ep(seconds);.  r
144b0 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
144c0 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
144d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
144e0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
144f0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
14500 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
14510 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
14520 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
14530 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
14540 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
14550 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
14560 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14570 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
14580 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
14590 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
145a0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
145b0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
145c0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
145d0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
145e0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
145f0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
14600 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
14610 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
14620 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
14630 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
14640 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
14650 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
14660 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14670 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
14680 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
14690 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
146a0 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45  w){.#ifdef NO_GE
146b0 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TTOD.  time_t t;
146c0 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
146d0 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
146e0 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
146f0 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
14700 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65  meval sNow;.  ge
14710 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
14720 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  , 0);.  *prNow =
14730 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
14740 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
14750 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
14760 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23  86400000000.0;.#
14770 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
14780 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
14790 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
147a0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
147b0 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
147c0 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
147d0 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
147e0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
147f0 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
14800 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
14810 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
14820 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
14830 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
14840 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
14850 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
14860 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
14870 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
14880 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
14890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
148a0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20  _init(void){ .  
148b0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
148c0 66 73 20 75 6e 69 78 56 66 73 20 3d 20 7b 0a 20  fs unixVfs = {. 
148d0 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
148e0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
148f0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
14900 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 2f 2a  (unixFile),   /*
14910 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
14920 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20   MAX_PATHNAME,  
14930 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
14940 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14960 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 75   pNext */.    "u
14970 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  nix",           
14980 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
14990 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
149a0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
149b0 61 20 2a 2f 0a 20 20 0a 20 20 20 20 75 6e 69 78  a */.  .    unix
149c0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
149d0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
149e0 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
149f0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
14a00 2f 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73  /.    unixAccess
14a10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63  ,         /* xAc
14a20 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  cess */.    unix
14a30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
14a40 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
14a50 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70   */.    unixDlOp
14a60 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  en,         /* x
14a70 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 75 6e  DlOpen */.    un
14a80 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  ixDlError,      
14a90 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
14aa0 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
14ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
14ac0 79 6d 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c  ym */.    unixDl
14ad0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Close,        /*
14ae0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
14af0 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
14b00 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
14b10 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53  ess */.    unixS
14b20 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 2f  leep,          /
14b30 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
14b40 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c  unixCurrentTime,
14b50 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
14b60 69 6d 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 47  ime */.    unixG
14b70 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 2f  etLastError    /
14b80 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
14b90 2a 2f 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65  */.  };.  sqlite
14ba0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
14bb0 75 6e 69 78 56 66 73 2c 20 31 29 3b 0a 20 20 72  unixVfs, 1);.  r
14bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14bd0 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   .}.int sqlite3_
14be0 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
14bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14c00 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f  K; .}. .#endif /
14c10 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a           * OS_UNIX */.