/ Hex Artifact Content
Login

Artifact 47936aee8265e482faa626141d97d896aa981ef4:


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 36 20 32 30 30 38 2f 30 36 2f 30 36 20 31 35  86 2008/06/06 15
01e0: 3a 34 39 3a 33 30 20 64 61 6e 69 65 6c 6b 31 39  :49:30 danielk19
01f0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0200: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0210: 68 22 0a 23 69 66 20 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 5f 6d 75 74 65  ter(sqlite3_mute
3910: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
3920: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
3930: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
3940: 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28 29  oid leaveMutex()
3950: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
3960: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
3970: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
3980: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
3990: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66  MASTER));.}..#if
39a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
39b0: 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  FE./*.** This va
39c0: 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77  riable records w
39d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
39e0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
39f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
3a00: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
3a10: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
3a20: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
3a30: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
3a40: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20  ocks..**    1:  
3a50: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
3a60: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3a70: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
3a80: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
3a90: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a   know yet..**.**
3aa0: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
3ab0: 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  , we know at com
3ac0: 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72  pile-time if thr
3ad0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
3ae0: 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73  e each.** others
3af0: 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73   locks.  On thos
3b00: 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53  e systems, the S
3b10: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3b20: 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f  RRIDE_LOCK macro
3b30: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
3b40: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20  appropriately.  
3b50: 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  On other systems
3b60: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65  , we have to che
3b70: 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ck at.** runtime
3b80: 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74  .  On these latt
3b90: 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54  er systems, SQLT
3ba0: 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  IE_THREAD_OVERRI
3bb0: 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e  DE_LOCK is.** un
3bc0: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
3bd0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72  his variable nor
3be0: 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73  mally has file s
3bf0: 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20  cope only.  But 
3c00: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  during testing, 
3c10: 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20  we make.** it a 
3c20: 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74  global so that t
3c30: 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e  he test code can
3c40: 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75   change its valu
3c50: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  e in order to ve
3c60: 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65  rify.** that the
3c70: 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70   right stuff hap
3c80: 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63  pens in either c
3c90: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ase..*/.#ifndef 
3ca0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3cb0: 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65  ERRIDE_LOCK.# de
3cc0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
3cd0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3ce0: 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   -1.#endif.#ifde
3cf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
3d00: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3d10: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3d20: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3d30: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3d40: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
3d50: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
3d60: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3d70: 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  = SQLITE_THREAD_
3d80: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23  OVERRIDE_LOCK;.#
3d90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3da0: 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  s structure hold
3db0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  s information pa
3dc0: 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69  ssed into indivi
3dd0: 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72  dual test.** thr
3de0: 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74  eads by the test
3df0: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
3e00: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e  avior() routine.
3e10: 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61  .*/.struct threa
3e20: 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e  dTestData {.  in
3e30: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
3e40: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
3e50: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73  be locked */.  s
3e60: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
3e70: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  ;     /* The loc
3e80: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
3e90: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20  /.  int result; 
3ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3eb0: 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b  sult of the lock
3ec0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
3ed0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
3ee0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
3ef0: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
3f00: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3f10: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
3f20: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
3f30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3f40: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
3f50: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
3f60: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
3f70: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
3f80: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
3f90: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
3fa0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
3fb0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
3fc0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
3fd0: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
3fe0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
3ff0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
4000: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
4010: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
4020: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
4030: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
4040: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
4050: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
4060: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
4070: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
4080: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
4090: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
40a0: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
40b0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
40c0: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
40d0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  .    s = fcntl(f
40e0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73  d, op, p);.    s
40f0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4100: 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e  f("fcntl unknown
4110: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64   %d %d %d\n", fd
4120: 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65  , op, s);.    re
4130: 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66  turn s;.  }.  if
4140: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( p->l_type==F_R
4150: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  DLCK ){.    zTyp
4160: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d  e = "RDLCK";.  }
4170: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
4180: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
4190: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
41a0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
41b0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  p->l_type==F_UNL
41c0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
41d0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "UNLCK";.  }el
41e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
41f0: 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0 );.  }.  asser
4200: 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d  t( p->l_whence==
4210: 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20  SEEK_SET );.  s 
4220: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
4230: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
4240: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
4250: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4260: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
4270: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
4280: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
4290: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
42a0: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
42b0: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
42c0: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
42d0: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
42e0: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
42f0: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
4300: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
4310: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
4320: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
4330: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
4340: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
4350: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
4360: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
4370: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
4380: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
4390: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
43a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
43b0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
43c0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
43d0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
43e0: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
43f0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
4400: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
4410: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
4420: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
4430: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4440: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4450: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
4460: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
4470: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
4480: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
4490: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
44a0: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
44b0: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
44c0: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
44d0: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65   return s;.}.#de
44e0: 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54  fine fcntl lockT
44f0: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
4500: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4510: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74   */../*.** The t
4520: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4530: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
4540: 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f 20  ne launches two 
4550: 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72 65  separate.** thre
4560: 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ads on this rout
4570: 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ine.  This routi
4580: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c  ne attempts to l
4590: 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ock a file.** de
45a0: 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72 65  scriptor then re
45b0: 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63 63  turns.  The succ
45c0: 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20 6f  ess or failure o
45d0: 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  f that attempt.*
45e0: 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65 73  * allows the tes
45f0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
4600: 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64 75  havior() procedu
4610: 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  re to determine.
4620: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
4630: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
4640: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4650: 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  rs locks..*/.sta
4660: 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64  tic void *thread
4670: 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64  LockingTest(void
4680: 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63   *pArg){.  struc
4690: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
46a0: 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75 63   *pData = (struc
46b0: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
46c0: 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d  *)pArg;.  pData-
46d0: 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28  >result = fcntl(
46e0: 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54  pData->fd, F_SET
46f0: 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b  LK, &pData->lock
4700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67  );.  return pArg
4710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4720: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
4730: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
4740: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
4750: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
4760: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4770: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
4780: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
4790: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
47a0: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
47b0: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
47c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
47d0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
47e0: 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66  ngBehavior(int f
47f0: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
4800: 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  d;.  struct thre
4810: 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d 3b  adTestData d[2];
4820: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b 32  .  pthread_t t[2
4830: 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66  ];..  fd = dup(f
4840: 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66  d_orig);.  if( f
4850: 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d<0 ) return;.  
4860: 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69 7a  memset(d, 0, siz
4870: 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e  eof(d));.  d[0].
4880: 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e  fd = fd;.  d[0].
4890: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
48a0: 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  RDLCK;.  d[0].lo
48b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
48c0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72  d[0].lock.l_star
48d0: 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  t = 0;.  d[0].lo
48e0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
48f0: 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d  EK_SET;.  d[1] =
4900: 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f   d[0];.  d[1].lo
4910: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
4920: 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63  LCK;.  pthread_c
4930: 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20  reate(&t[0], 0, 
4940: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
4950: 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68  t, &d[0]);.  pth
4960: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 31  read_create(&t[1
4970: 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  ], 0, threadLock
4980: 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b  ingTest, &d[1]);
4990: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
49a0: 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72  t[0], 0);.  pthr
49b0: 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30  ead_join(t[1], 0
49c0: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
49d0: 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64    threadsOverrid
49e0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
49f0: 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d   =  d[0].result=
4a00: 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c  =0 && d[1].resul
4a10: 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  t==0;.}.#endif /
4a20: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
4a30: 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AFE */../*.** Re
4a40: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f  lease a lockInfo
4a50: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
4a60: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
4a70: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
4a80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
4a90: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
4aa0: 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  o(struct lockInf
4ab0: 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 20  o *pLock){.  if 
4ac0: 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a  (pLock == NULL).
4ad0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c      return;.  pL
4ae0: 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ock->nRef--;.  i
4af0: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
4b00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4b10: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
4b20: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
4b30: 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d  y, sizeof(pLock-
4b40: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73  >key), 0);.    s
4b50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
4b60: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
4b70: 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43   Release a openC
4b80: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
4b90: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
4ba0: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
4bb0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
4bc0: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
4bd0: 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  nt(struct openCn
4be0: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66 20  t *pOpen){.  if 
4bf0: 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a  (pOpen == NULL).
4c00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f      return;.  pO
4c10: 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pen->nRef--;.  i
4c20: 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d  f( pOpen->nRef==
4c30: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4c40: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
4c50: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
4c60: 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d  y, sizeof(pOpen-
4c70: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 66  >key), 0);.    f
4c80: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
4c90: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
4ca0: 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20  3_free(pOpen);. 
4cb0: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
4cc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
4cd0: 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
4ce0: 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67  ests a byte-rang
4cf0: 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20  e locking query 
4d00: 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20 72  to see if byte r
4d10: 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a  ange locks are .
4d20: 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66  ** supported, if
4d30: 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63   not we fall bac
4d40: 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  k to dotlockLock
4d50: 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61  ingStyle..*/.sta
4d60: 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69  tic sqlite3Locki
4d70: 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54  ngStyle sqlite3T
4d80: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
4d90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
4da0: 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20  ilePath, .  int 
4db0: 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65 73 74 20  fd.){.  /* test 
4dc0: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
4dd0: 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a 20  using fcntl */. 
4de0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
4df0: 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63  ckInfo;.  .  loc
4e00: 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
4e10: 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
4e20: 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
4e30: 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
4e40: 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
4e50: 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
4e60: 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66 28 20 66  DLCK;.  .  if( f
4e70: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4e80: 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
4e90: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
4ea0: 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
4eb0: 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  e;.  } .  .  /* 
4ec0: 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63  testing for floc
4ed0: 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73 65  k can give false
4ee0: 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f 20   positives.  So 
4ef0: 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65 20  if if the above 
4f00: 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c 73 2c  test.  ** fails,
4f10: 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62 61   then we fall ba
4f20: 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74 2d  ck to using dot-
4f30: 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63 6b 69  lock style locki
4f40: 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65 74  ng..  */  .  ret
4f50: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
4f60: 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a  ngStyle;.}../* .
4f70: 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20  ** Examines the 
4f80: 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e 74  f_fstypename ent
4f90: 72 79 20 69 6e 20 74 68 65 20 73 74 61 74 66 73  ry in the statfs
4fa0: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 72 65   structure as re
4fb0: 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73 74  turned by .** st
4fc0: 61 74 28 29 20 66 6f 72 20 74 68 65 20 66 69 6c  at() for the fil
4fd0: 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e 67  e system hosting
4fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4ff0: 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68 65 20  le, assigns the 
5000: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
5010: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
5020: 73 65 64 20 6f 6e 20 69 74 73 20 76 61 6c 75 65  sed on its value
5030: 2e 20 20 54 68 65 73 65 20 76 61 6c 75 65 73 20  .  These values 
5040: 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67 6e 6d 65  and .** assignme
5050: 6e 74 73 20 61 72 65 20 62 61 73 65 64 20 6f 6e  nts are based on
5060: 20 44 61 72 77 69 6e 2f 4f 53 58 20 62 65 68 61   Darwin/OSX beha
5070: 76 69 6f 72 20 61 6e 64 20 68 61 76 65 20 6e 6f  vior and have no
5080: 74 20 62 65 65 6e 20 74 65 73 74 65 64 20 6f 6e  t been tested on
5090: 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65   .** other syste
50a0: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ms..*/.static sq
50b0: 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c  lite3LockingStyl
50c0: 65 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c  e sqlite3DetectL
50d0: 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20 63  ockingStyle(.  c
50e0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
50f0: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a 29  ath, .  int fd.)
5100: 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  {..#ifdef SQLITE
5110: 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53  _FIXED_LOCKING_S
5120: 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28 73  TYLE.  return (s
5130: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
5140: 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  le)SQLITE_FIXED_
5150: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23  LOCKING_STYLE;.#
5160: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
5170: 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20  atfs fsInfo;..  
5180: 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
5190: 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
51a0: 20 2d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72   -1 ){.    retur
51b0: 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  n sqlite3TestLoc
51c0: 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61  kingStyle(filePa
51d0: 74 68 2c 20 66 64 29 3b 0a 20 20 7d 0a 20 20 69  th, fd);.  }.  i
51e0: 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
51f0: 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
5200: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 6f 4c  {.    return noL
5210: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d  ockingStyle;.  }
5220: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73  .  if( strcmp(fs
5230: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
5240: 65 2c 20 22 68 66 73 22 29 3d 3d 30 20 7c 7c 0a  e, "hfs")==0 ||.
5250: 20 20 20 20 20 20 73 74 72 63 6d 70 28 66 73 49        strcmp(fsI
5260: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5270: 2c 20 22 75 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "ufs")==0 ){. 
5280: 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 4c     return posixL
5290: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d  ockingStyle;.  }
52a0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73  .  if( strcmp(fs
52b0: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
52c0: 65 2c 20 22 61 66 70 66 73 22 29 3d 3d 30 20 29  e, "afpfs")==0 )
52d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66 70  {.    return afp
52e0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
52f0: 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 66  }.  if( strcmp(f
5300: 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
5310: 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
5320: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5330: 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74  te3TestLockingSt
5340: 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64  yle(filePath, fd
5350: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  );.  }.  if( str
5360: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
5370: 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62 66 73 22  ypename, "smbfs"
5380: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
5390: 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  rn flockLockingS
53a0: 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tyle;.  }.  if( 
53b0: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
53c0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6d 73 64  fstypename, "msd
53d0: 6f 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  os")==0 ){.    r
53e0: 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63  eturn dotlockLoc
53f0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20  kingStyle;.  }. 
5400: 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
5410: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5420: 20 22 77 65 62 64 61 76 22 29 3d 3d 30 20 29 7b   "webdav")==0 ){
5430: 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 73 75  .    return unsu
5440: 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74  pportedLockingSt
5450: 79 6c 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yle;.  }.  retur
5460: 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  n sqlite3TestLoc
5470: 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61  kingStyle(filePa
5480: 74 68 2c 20 66 64 29 3b 20 20 0a 23 65 6e 64 69  th, fd);  .#endi
5490: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 46 49 58 45  f /* SQLITE_FIXE
54a0: 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  D_LOCKING_STYLE 
54b0: 2a 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  */.}..#endif /* 
54c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
54d0: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
54e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
54f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
5500: 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  ocate lockInfo a
5510: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
5520: 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65  tures that.** de
5530: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
5540: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
5550: 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69  reate new ones i
5560: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
5570: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
5580: 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  es might be unin
5590: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
55a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
55b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
55c0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
55d0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
55e0: 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  int findLockInfo
55f0: 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20  (.  int fd,     
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
5620: 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20  criptor used in 
5630: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  the key */.  str
5640: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70  uct lockInfo **p
5650: 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74  pLock,    /* Ret
5660: 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f  urn the lockInfo
5670: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
5680: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e  */.  struct open
5690: 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20  Cnt **ppOpen    
56a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
56b0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
56c0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
56d0: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
56e0: 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20  lockKey key1;.  
56f0: 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b  struct openKey k
5700: 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74  ey2;.  struct st
5710: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74  at statbuf;.  st
5720: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
5730: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f  Lock;.  struct o
5740: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20  penCnt *pOpen;. 
5750: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
5760: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
5770: 20 72 63 21 3d 30 20 29 7b 0a 23 69 66 64 65 66   rc!=0 ){.#ifdef
5780: 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69   EOVERFLOW.    i
5790: 66 28 20 65 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  f( errno==EOVERF
57a0: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
57b0: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
57c0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
57d0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
57e0: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20    memset(&key1, 
57f0: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  0, sizeof(key1))
5800: 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73  ;.  key1.dev = s
5810: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
5820: 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74   key1.ino = stat
5830: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 20  buf.st_ino;.#if 
5840: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
5850: 45 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f  E.  if( threadsO
5860: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
5870: 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20  sLocks<0 ){.    
5880: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
5890: 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a 20  gBehavior(fd);. 
58a0: 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20 3d 20   }.  key1.tid = 
58b0: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
58c0: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f  achOthersLocks ?
58d0: 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c   0 : pthread_sel
58e0: 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65  f();.#endif.  me
58f0: 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73  mset(&key2, 0, s
5900: 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20  izeof(key2));.  
5910: 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62  key2.dev = statb
5920: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
5930: 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  2.ino = statbuf.
5940: 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20  st_ino;.  pLock 
5950: 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  = (struct lockIn
5960: 66 6f 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  fo*)sqlite3HashF
5970: 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26  ind(&lockHash, &
5980: 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79  key1, sizeof(key
5990: 31 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b  1));.  if( pLock
59a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
59b0: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64  t lockInfo *pOld
59c0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71  ;.    pLock = sq
59d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
59e0: 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a  zeof(*pLock) );.
59f0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30      if( pLock==0
5a00: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
5a10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5a20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
5a30: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d  dlockinfo;.    }
5a40: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20  .    pLock->key 
5a50: 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f 63  = key1;.    pLoc
5a60: 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  k->nRef = 1;.   
5a70: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b   pLock->cnt = 0;
5a80: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
5a90: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
5aa0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
5ab0: 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68  Insert(&lockHash
5ac0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73  , &pLock->key, s
5ad0: 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c 6f  izeof(key1), pLo
5ae0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ck);.    if( pOl
5af0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  d!=0 ){.      as
5b00: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63  sert( pOld==pLoc
5b10: 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  k );.      sqlit
5b20: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
5b30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5b40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
5b50: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
5b60: 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  kinfo;.    }.  }
5b70: 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  else{.    pLock-
5b80: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
5b90: 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  ppLock = pLock;.
5ba0: 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20    if( ppOpen!=0 
5bb0: 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28  ){.    pOpen = (
5bc0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29  struct openCnt*)
5bd0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
5be0: 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32  &openHash, &key2
5bf0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
5c00: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d  .    if( pOpen==
5c10: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
5c20: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b  t openCnt *pOld;
5c30: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73  .      pOpen = s
5c40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
5c50: 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b  izeof(*pOpen) );
5c60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
5c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
5c80: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
5c90: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  Lock);.        r
5ca0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5cb0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
5cc0: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ce0: 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79  pOpen->key = key
5cf0: 32 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  2;.      pOpen->
5d00: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
5d10: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30  pOpen->nLock = 0
5d20: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
5d30: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
5d40: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
5d50: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  ng = 0;.      pO
5d60: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
5d70: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68  Insert(&openHash
5d80: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73  , &pOpen->key, s
5d90: 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70  izeof(key2), pOp
5da0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
5db0: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
5dc0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
5dd0: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
5de0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f   sqlite3_free(pO
5df0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pen);.        re
5e00: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
5e10: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
5e20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5e30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
5e40: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
5e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5e60: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
5e70: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
5e80: 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70     *ppOpen = pOp
5e90: 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69  en;.  }..exit_fi
5ea0: 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65  ndlockinfo:.  re
5eb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5ec0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5ed0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5ee0: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
5ef0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
5f00: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
5f10: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
5f20: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
5f30: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
5f40: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
5f50: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5f60: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5f80: 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e   char *locktypeN
5f90: 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65  ame(int locktype
5fa0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63  ){.  switch( loc
5fb0: 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20  ktype ){.  case 
5fc0: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
5fd0: 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53  "NONE";.  case S
5fe0: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5ff0: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63  rn "SHARED";.  c
6000: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
6010: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
6020: 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e  VED";.  case PEN
6030: 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  DING_LOCK: retur
6040: 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63  n "PENDING";.  c
6050: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
6060: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
6070: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
6080: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
6090: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
60a0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
60b0: 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  y in a different
60c0: 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65   thread than the
60d0: 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65   thread that the
60e0: 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67  .** unixFile arg
60f0: 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f  ument belongs to
6100: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6110: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
6120: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65   unixFile.** ove
6130: 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  r to the current
6140: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
6150: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c   unixFile is onl
6160: 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72  y owned by a thr
6170: 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77  ead on systems w
6180: 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20  here one thread 
6190: 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20  is.** unable to 
61a0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63  override locks c
61b0: 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66 66  reated by a diff
61c0: 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52  erent thread.  R
61d0: 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20  edHat9 is.** an 
61e0: 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20  example of such 
61f0: 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  a system..**.** 
6200: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
6210: 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  er is only allow
6220: 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69  ed if the unixFi
6230: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
6240: 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20  unlocked..** If 
6250: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20  the unixFile is 
6260: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77  locked and an ow
6270: 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67  nership is wrong
6280: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
6290: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20   SQLITE_MISUSE. 
62a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
62b0: 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
62c0: 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23  hing works..*/.#
62d0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
62e0: 53 41 46 45 0a 73 74 61 74 69 63 20 69 6e 74 20  SAFE.static int 
62f0: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
6300: 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  p(unixFile *pFil
6310: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
6320: 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b  pthread_t hSelf;
6330: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
6340: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
6350: 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Locks ){.    /* 
6360: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
6370: 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  ers not needed o
6380: 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f  n this system */
6390: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
63a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65  TE_OK;.  }.  hSe
63b0: 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  lf = pthread_sel
63c0: 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65  f();.  if( pthre
63d0: 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e  ad_equal(pFile->
63e0: 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20  tid, hSelf) ){. 
63f0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69     /* We are sti
6400: 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  ll in the same t
6410: 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54  hread */.    OST
6420: 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66  RACE1("No-transf
6430: 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c  er, same thread\
6440: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
6450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6460: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
6470: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
6480: 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f  .    /* We canno
6490: 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68  t change ownersh
64a0: 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20  ip while we are 
64b0: 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20  holding a lock! 
64c0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
64d0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
64e0: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61  .  OSTRACE4("Tra
64f0: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
6500: 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f  of %d from %d to
6510: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
6520: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
6530: 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29  ile->tid, hSelf)
6540: 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d  ;.  pFile->tid =
6550: 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46   hSelf;.  if (pF
6560: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55  ile->pLock != NU
6570: 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73  LL) {.    releas
6580: 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  eLockInfo(pFile-
6590: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  >pLock);.    rc 
65a0: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
65b0: 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d  File->h, &pFile-
65c0: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  >pLock, 0);.    
65d0: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
65e0: 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25    %d is now %s(%
65f0: 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  s,%d)\n", pFile-
6600: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
6610: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
6620: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
6630: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
6640: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
6650: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
6660: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
6670: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
6680: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
6690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
66a0: 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  K;.  }.}.#else. 
66b0: 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68   /* On single-th
66c0: 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f  readed builds, o
66d0: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
66e0: 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  r is a no-op */.
66f0: 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65  # define transfe
6700: 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51  rOwnership(X) SQ
6710: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
6720: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
6730: 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
6740: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6750: 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
6760: 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
6770: 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
6780: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6790: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
67a0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
67b0: 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
67c0: 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
67d0: 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
67e0: 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
67f0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
6800: 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
6810: 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
6820: 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
6830: 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
6840: 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
6850: 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
6860: 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
6870: 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72  D.** any any for
6880: 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
6890: 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
68a0: 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
68b0: 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
68c0: 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
68d0: 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2f 0a 73 74  and #2681..*/.st
68e0: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
68f0: 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
6900: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
6910: 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
6920: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
6930: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
6940: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
6950: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
6960: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
6970: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
6980: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
6990: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
69a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
69b0: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
69c0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
69d0: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
69e0: 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
69f0: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
6a00: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6a10: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
6a20: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
6a30: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
6a40: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
6a50: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6a60: 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
6a70: 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
6a80: 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
6a90: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6aa0: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
6ab0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
6ac0: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
6ad0: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
6ae0: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
6af0: 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
6b00: 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
6b10: 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
6b20: 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  SED);.  return g
6b30: 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ot;.}../*.** Rea
6b40: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
6b50: 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
6b60: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6b70: 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
6b80: 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
6b90: 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
6ba0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
6bb0: 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
6bc0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
6bd0: 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
6be0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
6bf0: 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
6c00: 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
6c10: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
6c20: 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f  fset.){.  int go
6c30: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
6c40: 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  );.  got = seekA
6c50: 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
6c60: 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42  *)id, offset, pB
6c70: 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
6c80: 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
6c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ca0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
6cb0: 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t<0 ){.    retur
6cc0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
6cd0: 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
6ce0: 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
6cf0: 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
6d00: 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
6d10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6d20: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
6d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b   }.}../*.** Seek
6d40: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
6d50: 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
6d60: 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
6d70: 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
6d80: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6d90: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
6da0: 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
6db0: 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a   the offset..*/.
6dc0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
6dd0: 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
6de0: 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
6df0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
6e00: 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
6e10: 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e  int got;.  i64 n
6e20: 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45  ewOffset;.  TIME
6e30: 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
6e40: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
6e50: 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69    got = pwrite(i
6e60: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
6e70: 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20   offset);.#elif 
6e80: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
6e90: 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72  D64).  got = pwr
6ea0: 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
6eb0: 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
6ec0: 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
6ed0: 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
6ee0: 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
6ef0: 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  ET);.  if( newOf
6f00: 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
6f10: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6f20: 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
6f30: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
6f40: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
6f50: 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
6f60: 45 35 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E5("WRITE   %-3d
6f70: 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
6f80: 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
6f90: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
6fa0: 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
6fb0: 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
6fc0: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
6fd0: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
6fe0: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
6ff0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
7000: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
7010: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
7020: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
7030: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
7040: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
7050: 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
7060: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
7070: 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
7080: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
7090: 0a 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  .){.  int wrote 
70a0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
70b0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
70c0: 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  mt>0 );.  while(
70d0: 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
70e0: 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
70f0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f  (unixFile*)id, o
7100: 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
7110: 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
7120: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
7130: 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
7140: 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
7150: 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
7160: 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
7170: 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
7180: 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
7190: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
71a0: 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
71b0: 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
71c0: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
71d0: 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
71e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
71f0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
7200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
7220: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
7230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7240: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
7250: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
7260: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
7270: 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
7280: 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
7290: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
72a0: 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
72b0: 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
72c0: 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
72d0: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
72e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
72f0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
7300: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
7310: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
7320: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
7330: 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28  e the fdatasync(
7340: 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68  ) API only if th
7350: 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  e HAVE_FDATASYNC
7360: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
7370: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  d..** Otherwise 
7380: 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69  use fsync() in i
7390: 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66  ts place..*/.#if
73a0: 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53  ndef HAVE_FDATAS
73b0: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
73c0: 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
73d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
73e0: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
73f0: 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
7400: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
7410: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
7420: 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
7430: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
7440: 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
7450: 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
7460: 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
7470: 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
7480: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
7490: 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
74a0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
74b0: 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
74c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
74d0: 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
74e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
74f0: 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
7500: 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
7510: 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
7520: 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
7530: 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
7540: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
7550: 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
7560: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
7570: 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
7580: 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
7590: 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
75a0: 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
75b0: 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
75c0: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
75d0: 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
75e0: 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
75f0: 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
7600: 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
7610: 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
7620: 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
7630: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
7640: 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
7650: 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
7660: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
7670: 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
7680: 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
7690: 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
76a0: 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
76b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
76c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
76d0: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
76e0: 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
76f0: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
7700: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
7710: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
7720: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
7730: 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
7740: 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
7750: 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
7760: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
7770: 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
7780: 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
7790: 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
77a0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
77b0: 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
77c0: 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
77d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
77e0: 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
77f0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
7800: 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
7810: 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
7820: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
7830: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
7840: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
7850: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
7860: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
7870: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
7880: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
7890: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
78a0: 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41  K;.#else..#if HA
78b0: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
78c0: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
78d0: 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64     rc = fcntl(fd
78e0: 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
78f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7900: 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
7910: 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
7920: 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
7930: 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
7940: 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
7950: 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20   * It shouldn't 
7960: 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
7970: 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
7980: 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
7990: 20 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d     * file system
79a0: 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
79b0: 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
79c0: 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
79d0: 20 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72    * isn't suppor
79e0: 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
79f0: 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
7a00: 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
7a10: 20 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f     * and (for no
7a20: 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
7a30: 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
7a40: 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
7a50: 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20  ll.  .   * It'd 
7a60: 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
7a70: 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
7a80: 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
7a90: 76 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66  void .   * the f
7aa0: 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
7ab0: 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
7ac0: 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  led..   */.  if(
7ad0: 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
7ae0: 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20  (fd);..#else .  
7af0: 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a  if( dataOnly ){.
7b00: 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79      rc = fdatasy
7b10: 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  nc(fd);.  }else{
7b20: 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
7b30: 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
7b40: 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  /* HAVE_FULLFSYN
7b50: 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  C */.#endif /* d
7b60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
7b70: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
7b80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7b90: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
7ba0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
7bb0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
7bc0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
7bd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
7be0: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
7bf0: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
7c00: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
7c10: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
7c20: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
7c30: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
7c40: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
7c50: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
7c60: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
7c70: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
7c80: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
7c90: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
7ca0: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
7cb0: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
7cc0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
7cd0: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
7ce0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
7cf0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
7d00: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
7d10: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
7d20: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
7d30: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
7d40: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
7d50: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
7d60: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
7d70: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
7d80: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
7d90: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
7da0: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
7db0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
7dd0: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
7de0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7df0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
7e00: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
7e10: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
7e20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
7e30: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
7e40: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
7e50: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
7e60: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
7e70: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
7e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
7e90: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
7ea0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
7eb0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
7ec0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
7ed0: 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
7ee0: 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
7ef0: 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
7f00: 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
7f10: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
7f20: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
7f30: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
7f40: 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
7f50: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
7f60: 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
7f70: 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
7f80: 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
7f90: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
7fa0: 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
7fb0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
7fc0: 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  ULL.  );..  asse
7fd0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
7fe0: 53 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20  STRACE2("SYNC   
7ff0: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
8000: 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  >h);.  rc = full
8010: 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
8020: 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
8030: 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
8040: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
8050: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
8060: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8070: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a  TE_IOERR_FSYNC;.
8080: 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
8090: 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20  >dirfd>=0 ){.   
80a0: 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59   OSTRACE4("DIRSY
80b0: 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
80c0: 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
80d0: 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
80e0: 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
80f0: 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
8100: 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
8110: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8120: 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
8130: 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
8140: 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
8150: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
8160: 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
8170: 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
8180: 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
8190: 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
81a0: 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
81b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
81c0: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
81d0: 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
81e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
81f0: 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
8200: 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
8210: 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
8220: 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
8230: 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
8240: 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
8250: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
8260: 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
8270: 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
8280: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
8290: 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
82a0: 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
82b0: 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
82c0: 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
82d0: 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
82e0: 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
82f0: 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
8300: 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
8310: 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
8320: 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
8330: 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
8340: 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72    */.       /* r
8350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8360: 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  RR; */.    }.#en
8370: 64 69 66 0a 20 20 20 20 63 6c 6f 73 65 28 70 46  dif.    close(pF
8380: 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 20 2f 2a  ile->dirfd);  /*
8390: 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79   Only need to sy
83a0: 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73  nc once, so clos
83b0: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
83c0: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  */.    pFile->di
83d0: 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  rfd = -1;    /* 
83e0: 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65  when we are done
83f0: 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  . */.  }.  retur
8400: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8410: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
8420: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
8430: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
8440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
8450: 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
8460: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
8470: 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
8480: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  c;.  assert( id 
8490: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
84a0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
84b0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
84c0: 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72  TE );.  rc = ftr
84d0: 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c  uncate(((unixFil
84e0: 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f  e*)id)->h, (off_
84f0: 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
8500: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8510: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
8520: 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
8530: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8540: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
8550: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
8560: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
8570: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
8580: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8590: 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
85a0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
85b0: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
85c0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
85d0: 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
85e0: 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
85f0: 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
8600: 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
8610: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
8620: 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
8630: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
8640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8650: 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
8660: 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
8670: 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  size;.  return S
8680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8690: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
86a0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
86b0: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
86c0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
86d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
86e0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
86f0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
8700: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
8710: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
8720: 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74   non-zero.  If t
8730: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
8740: 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c  ked or holds onl
8750: 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20  y SHARED locks, 
8760: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 7a  then.** return z
8770: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
8780: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
8790: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
87a0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
87b0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
87c0: 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  r = 0;.  unixFil
87d0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
87e0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
87f0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
8800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8810: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8820: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
8830: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 65 6e  t( pFile );.  en
8840: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
8850: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
8860: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
8870: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
8880: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
8890: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
88a0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
88b0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
88c0: 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  f( pFile->pLock-
88d0: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
88e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d  _LOCK ){.    r =
88f0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
8900: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
8910: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
8920: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
8930: 0a 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20 20  .  if( !r ){.   
8940: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
8950: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
8960: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
8970: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
8980: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
8990: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
89a0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
89b0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
89c0: 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46 69  K;.    fcntl(pFi
89d0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
89e0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
89f0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
8a00: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20  NLCK ){.      r 
8a10: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
8a20: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
8a30: 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 45  ;.  OSTRACE3("TE
8a40: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
8a50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
8a60: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
8a70: 20 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   r;.  return SQL
8a80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8a90: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
8aa0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
8ab0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
8ac0: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
8ad0: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
8ae0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
8af0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
8b00: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
8b10: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
8b20: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
8b30: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
8b40: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
8b50: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
8b60: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
8b70: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
8b80: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
8b90: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
8ba0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
8bb0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
8bc0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
8bd0: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
8be0: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
8bf0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
8c00: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
8c10: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
8c20: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
8c30: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
8c40: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8c50: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
8c60: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
8c70: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
8c80: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
8c90: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
8ca0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
8cb0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
8cc0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
8cd0: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
8ce0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
8cf0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
8d00: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
8d10: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
8d20: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
8d30: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
8d40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8d50: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
8d60: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
8d70: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
8d80: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
8d90: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
8da0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
8db0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
8dc0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
8dd0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
8de0: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
8df0: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
8e00: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
8e10: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
8e20: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
8e30: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
8e40: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
8e50: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
8e60: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
8e70: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
8e80: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
8e90: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
8ea0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
8eb0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
8ec0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
8ed0: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
8ee0: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
8ef0: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
8f00: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
8f10: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
8f20: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
8f30: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
8f40: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
8f50: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
8f60: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
8f70: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
8f80: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
8f90: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
8fa0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
8fb0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
8fc0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
8fd0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
8fe0: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
8ff0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
9000: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
9010: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
9020: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9030: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
9040: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
9050: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
9060: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
9070: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
9080: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
9090: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
90a0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
90b0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
90c0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
90d0: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
90e0: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
90f0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
9100: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
9110: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
9120: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
9130: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
9140: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
9150: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
9160: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
9170: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
9180: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
9190: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
91a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
91b0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
91c0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
91d0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
91e0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
91f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
9200: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
9210: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
9220: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
9230: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
9240: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
9250: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9260: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
9270: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
9280: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
9290: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
92a0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
92b0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
92c0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
92d0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
92e0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
92f0: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
9300: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
9310: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
9320: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
9330: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
9340: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
9350: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
9360: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
9370: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
9380: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
9390: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
93a0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
93b0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
93c0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
93d0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
93e0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
93f0: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
9400: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
9410: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
9420: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
9430: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
9440: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
9450: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
9460: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
9470: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
9480: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
9490: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
94a0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
94b0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
94c0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
94d0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
94e0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
94f0: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
9500: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
9510: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
9520: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
9530: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
9540: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
9550: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
9560: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
9570: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
9580: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
9590: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
95a0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
95b0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
95c0: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
95d0: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
95e0: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
95f0: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
9600: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
9610: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
9620: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9630: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
9640: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
9650: 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63  ile*)id;.  struc
9660: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
9670: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
9680: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
9690: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a   lock;.  int s;.
96a0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
96b0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
96c0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
96d0: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
96e0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
96f0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
9700: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
9710: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
9720: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
9730: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9740: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
9750: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
9760: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
9770: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
9780: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
9790: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
97a0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
97b0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
97c0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
97d0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
97e0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
97f0: 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d  , as.  ** enterM
9800: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
9810: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
9820: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
9830: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
9840: 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
9850: 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
9860: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
9870: 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
9880: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  h,.            l
9890: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
98a0: 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75  type));.    retu
98b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
98c0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
98d0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
98e0: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
98f0: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
9900: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
9910: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
9920: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
9930: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9940: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
9950: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
9960: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
9970: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
9980: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
9990: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
99a0: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
99b0: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
99c0: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
99d0: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
99e0: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65  threads.  */.  e
99f0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
9a00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9a10: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
9a20: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
9a30: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
9a40: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
9a50: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
9a60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9a70: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
9a80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9a90: 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  }.  pLock = pFil
9aa0: 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  e->pLock;..  /* 
9ab0: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
9ac0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
9ad0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
9ae0: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
9af0: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
9b00: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
9b10: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
9b20: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
9b30: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
9b40: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63  ->locktype!=pLoc
9b50: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a  k->locktype && .
9b60: 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b            (pLock
9b70: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44  ->locktype>=PEND
9b80: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  ING_LOCK || lock
9b90: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
9ba0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
9bb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
9bc0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9bd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
9be0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
9bf0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
9c00: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
9c10: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
9c20: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
9c30: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
9c40: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
9c50: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
9c60: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
9c70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
9c80: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
9c90: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9ca0: 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63   && .      (pLoc
9cb0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  k->locktype==SHA
9cc0: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
9cd0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  k->locktype==RES
9ce0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
9cf0: 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74     assert( lockt
9d00: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9d10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9d20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
9d30: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
9d40: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29  ( pLock->cnt>0 )
9d50: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
9d60: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
9d70: 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
9d80: 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65  cnt++;.    pFile
9d90: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
9da0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
9db0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b  ock;.  }..  lock
9dc0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20  .l_len = 1L;..  
9dd0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9de0: 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20  SEEK_SET;..  /* 
9df0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
9e00: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
9e10: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
9e20: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
9e30: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
9e40: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
9e50: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
9e60: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
9e70: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
9e80: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
9e90: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
9ea0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
9eb0: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
9ec0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
9ed0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
9ee0: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
9ef0: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
9f00: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b  k.l_type = (lock
9f10: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9f20: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
9f30: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
9f40: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
9f50: 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  YTE;.    s = fcn
9f60: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
9f70: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
9f80: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
9f90: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
9fa0: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
9fb0: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
9fc0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
9fd0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
9fe0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
9ff0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
a000: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
a010: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
a020: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
a030: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
a040: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
a050: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
a060: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
a070: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
a080: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
a090: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  t( pLock->cnt==0
a0a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a0b0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
a0c0: 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  =0 );..    /* No
a0d0: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
a0e0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
a0f0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
a100: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
a110: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
a120: 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  SIZE;.    s = fc
a130: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a140: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a  SETLK, &lock);..
a150: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
a160: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
a170: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
a180: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
a190: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
a1a0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
a1b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a1c0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
a1d0: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
a1e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
a1f0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)!=0 ){.      r
a200: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
a210: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
a220: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
a230: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67  appen */.      g
a240: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a250: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28    }.    if( s==(
a260: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
a270: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
a280: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
a290: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
a2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a2b0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a2c0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
a2d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70        pFile->pOp
a2e0: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
a2f0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
a300: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
a310: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
a320: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
a330: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b   pLock->cnt>1 ){
a340: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
a350: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
a360: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
a370: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
a380: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
a390: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
a3a0: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
a3b0: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
a3c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
a3d0: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
a3e0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
a3f0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
a400: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
a410: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
a420: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
a430: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
a440: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
a450: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
a460: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
a470: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
a480: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ( 0!=pFile->lock
a490: 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  type );.    lock
a4a0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
a4b0: 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c  K;.    switch( l
a4c0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20  ocktype ){.     
a4d0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
a4e0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a4f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a500: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
a510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a520: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
a530: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a540: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a550: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
a560: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
a570: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
a580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a590: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a5a0: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
a5b0: 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c   }.    s = fcntl
a5c0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a5d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a5e0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
a5f0: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
a600: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
a610: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
a620: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
a630: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
a640: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a650: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
a660: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
a670: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
a680: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
a690: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
a6a0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a6b0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a6c0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a6d0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
a6e0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
a6f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
a700: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61  .end_lock:.  lea
a710: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
a720: 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
a730: 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
a740: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
a750: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
a760: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
a770: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
a780: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
a790: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
a7a0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
a7b0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
a7c0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
a7d0: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
a7e0: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
a7f0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
a800: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
a810: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
a820: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
a830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a840: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
a850: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
a860: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
a870: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
a880: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
a890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a8a0: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
a8b0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
a8c0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
a8d0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
a8e0: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
a8f0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
a900: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a910: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a920: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
a930: 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  d;.  int h;..  a
a940: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
a950: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
a960: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
a970: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
a980: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
a990: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
a9a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
a9b0: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
a9c0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
a9d0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
a9e0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
a9f0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
aa00: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
aa10: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
aa20: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
aa30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
aa40: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
aa50: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
aa60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aa70: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
aa80: 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  }.  enterMutex()
aa90: 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  ;.  h = pFile->h
aaa0: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  ;.  pLock = pFil
aab0: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65  e->pLock;.  asse
aac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d  rt( pLock->cnt!=
aad0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
aae0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
aaf0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
ab00: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
ab10: 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f  ktype==pFile->lo
ab20: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53 69  cktype );.    Si
ab30: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
ab40: 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
ab50: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
ab60: 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
ab70: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
ab80: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
ab90: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
aba0: 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  K ){.      lock.
abb0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
abc0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
abd0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
abe0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
abf0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ac00: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
ac10: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ac20: 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66  IZE;.      if( f
ac30: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
ac40: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
ac50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ac60: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
ac70: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
ac80: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ac90: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
aca0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
acb0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
acc0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
acd0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
ace0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
acf0: 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
ad00: 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
ad10: 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
ad20: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
ad30: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
ad40: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   ){.      pLock-
ad50: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
ad60: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
ad70: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
ad80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
ad90: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
ada0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
adb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72  _LOCK ){.    str
adc0: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
add0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
ade0: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
adf0: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
ae00: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
ae10: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
ae20: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
ae30: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
ae40: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
ae50: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
ae60: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
ae70: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
ae80: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
ae90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
aea0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
aeb0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
aec0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
aed0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
aee0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
aef0: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
af00: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69  n = 0L;.      Si
af10: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
af20: 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
af30: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
af40: 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
af50: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
af60: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
af70: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
af80: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
af90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
afa0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
afb0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
afc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
afd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
afe0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 4c  LOCK;.        pL
aff0: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
b000: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b010: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
b020: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
b030: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
b040: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
b050: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
b060: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
b070: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
b080: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
b090: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
b0a0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
b0b0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
b0c0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
b0d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
b0e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b0f0: 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65     pOpen = pFile
b100: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 70  ->pOpen;.      p
b110: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
b120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
b130: 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  en->nLock>=0 );.
b140: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d        if( pOpen-
b150: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
b160: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
b170: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
b180: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b190: 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ; i<pOpen->nPend
b1a0: 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ing; i++){.     
b1b0: 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e       close(pOpen
b1c0: 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a  ->aPending[i]);.
b1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1e0: 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50    free(pOpen->aP
b1f0: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  ending);.       
b200: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
b210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
b220: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
b230: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
b240: 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d 75 74 65  .  }.  leaveMute
b250: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
b260: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
b270: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
b280: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
b290: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
b2a0: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
b2b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
b2c0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
b2d0: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
b2e0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
b2f0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 66 28 20  ile *)id;.  if( 
b300: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
b310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
b320: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
b330: 4f 43 4b 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  OCK);.  if( pFil
b340: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  e->dirfd>=0 ) cl
b350: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
b360: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  );.  pFile->dirf
b370: 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d  d = -1;.  enterM
b380: 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 70  utex();..  if( p
b390: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
b3a0: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
b3b0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
b3c0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
b3d0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
b3e0: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
b3f0: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
b400: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
b410: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
b420: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
b430: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
b440: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
b450: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
b460: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
b470: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
b480: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
b490: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
b4a0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
b4b0: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
b4c0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
b4d0: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
b4e0: 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d  Open;.    aNew =
b4f0: 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d   realloc( pOpen-
b500: 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65  >aPending, (pOpe
b510: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73  n->nPending+1)*s
b520: 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20  izeof(int) );.  
b530: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
b540: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  .      /* If a m
b550: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73  alloc fails, jus
b560: 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  t leak the file 
b570: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
b580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b590: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
b5a0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70   aNew;.      pOp
b5b0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
b5c0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
b5d0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
b5e0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
b5f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
b600: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
b610: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
b620: 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61  g locks so we ca
b630: 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  n close the file
b640: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
b650: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
b660: 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  >h);.  }.  relea
b670: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
b680: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65  ->pLock);.  rele
b690: 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65  aseOpenCnt(pFile
b6a0: 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 6c 65 61  ->pOpen);..  lea
b6b0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
b6c0: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
b6d0: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
b6e0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
b6f0: 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  (-1);.  memset(p
b700: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
b710: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
b720: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b730: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
b740: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
b750: 5f 53 54 59 4c 45 0a 23 70 72 61 67 6d 61 20 6d  _STYLE.#pragma m
b760: 61 72 6b 20 41 46 50 20 53 75 70 70 6f 72 74 0a  ark AFP Support.
b770: 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c  ./*. ** The afpL
b780: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
b790: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b7a0: 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
b7b0: 65 63 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f  ecific state. */
b7c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
b7d0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
b7e0: 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
b7f0: 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
b800: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
b810: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
b820: 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42  long sharedLockB
b830: 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  yte;.  const cha
b840: 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a  r *filePath;.};.
b850: 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
b860: 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
b870: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
b880: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
b890: 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
b8a0: 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
b8b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
b8c0: 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
b8d0: 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
b8e0: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
b8f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
b900: 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
b910: 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
b920: 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
b930: 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
b940: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b950: 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
b960: 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
b970: 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
b980: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
b990: 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
b9a0: 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
b9b0: 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
b9c0: 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
b9d0: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
ba00: 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
ba10: 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
ba20: 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
ba30: 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
ba40: 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
ba50: 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
ba60: 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
ba70: 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  * .** Return 0 o
ba80: 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20  n success, 1 on 
ba90: 66 61 69 6c 75 72 65 2e 20 20 54 6f 20 6d 61 74  failure.  To mat
baa0: 63 68 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ch the behavior 
bab0: 6f 66 20 74 68 65 20 0a 2a 2a 20 6e 6f 72 6d 61  of the .** norma
bac0: 6c 20 70 6f 73 69 78 20 66 69 6c 65 20 6c 6f 63  l posix file loc
bad0: 6b 69 6e 67 20 28 75 73 65 64 20 69 6e 20 75 6e  king (used in un
bae0: 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78 61 6d 70  ixLock for examp
baf0: 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c 64 20 0a  le), we should .
bb00: 2a 2a 20 70 72 6f 76 69 64 65 20 27 72 69 63 68  ** provide 'rich
bb10: 65 72 27 20 72 65 74 75 72 6e 20 63 6f 64 65 73  er' return codes
bb20: 20 2d 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20   - specifically 
bb30: 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65  to differentiate
bb40: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 27 66 69 6c   between.** 'fil
bb50: 65 20 62 75 73 79 27 20 61 6e 64 20 27 66 69 6c  e busy' and 'fil
bb60: 65 20 73 79 73 74 65 6d 20 65 72 72 6f 72 27 20  e system error' 
bb70: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
bb80: 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74  ic int _AFPFSSet
bb90: 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
bba0: 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 69 6e 74  ar *path, .  int
bbb0: 20 66 64 2c 20 0a 20 20 75 6e 73 69 67 6e 65 64   fd, .  unsigned
bbc0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
bbd0: 74 2c 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  t, .  unsigned l
bbe0: 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
bbf0: 20 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46   .  int setLockF
bc00: 6c 61 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  lag.){.  struct 
bc10: 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
bc20: 20 20 20 20 20 20 20 70 62 3b 0a 20 20 69 6e 74         pb;.  int
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 65 72 72 3b 0a 20 20 0a 20 20 70       err;.  .  p
bc50: 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
bc60: 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
bc70: 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
bc80: 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
bc90: 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
bca0: 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
bcb0: 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
bcc0: 3d 20 66 64 3b 0a 20 20 4f 53 54 52 41 43 45 35  = fd;.  OSTRACE5
bcd0: 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e  ("AFPLOCK settin
bce0: 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64  g lock %s for %d
bcf0: 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
bd00: 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
bd10: 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
bd20: 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66 66 73 65  OFF"), fd, offse
bd30: 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72  t, length);.  er
bd40: 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
bd50: 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
bd60: 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
bd70: 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
bd80: 31 20 29 20 7b 0a 20 20 20 20 4f 53 54 52 41 43  1 ) {.    OSTRAC
bd90: 45 34 28 22 41 46 50 4c 4f 43 4b 20 66 61 69 6c  E4("AFPLOCK fail
bda0: 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25  ed to fsctl() '%
bdb0: 73 27 20 25 64 20 25 73 5c 6e 22 2c 20 70 61 74  s' %d %s\n", pat
bdc0: 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20 20  h, errno, .     
bdd0: 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
bde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
bdf0: 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 0a 20 20 7d   /* error */.  }
be00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
be10: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
be20: 20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   ** This routine
be30: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
be40: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
be50: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
be60: 73 70 65 63 69 66 69 65 64 0a 20 2a 2a 20 66 69  specified. ** fi
be70: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
be80: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
be90: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
bea0: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
beb0: 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49   ** non-zero.  I
bec0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
bed0: 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20  locked or holds 
bee0: 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b  only SHARED lock
bef0: 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74 75  s, then. ** retu
bf00: 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74 61  rn zero.. */.sta
bf10: 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43  tic int afpUnixC
bf20: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
bf30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
bf40: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
bf50: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  {.  int r = 0;. 
bf60: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
bf70: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
bf80: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
bf90: 46 69 6c 65 20 29 3b 20 0a 20 20 61 66 70 4c 6f  File ); .  afpLo
bfa0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
bfb0: 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
bfc0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
bfd0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
bfe0: 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ext;.  .  /* Che
bff0: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
c000: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
c010: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
c020: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
c030: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
c040: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d  _LOCK ){.    r =
c050: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
c060: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
c070: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
c080: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
c090: 20 2a 2f 0a 20 20 69 66 20 28 20 21 72 20 29 20   */.  if ( !r ) 
c0a0: 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
c0b0: 65 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  e byte */.    in
c0c0: 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46  t failed = _AFPF
c0d0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
c0e0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
c0f0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
c100: 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
c110: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
c120: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
c130: 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
c140: 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
c150: 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
c160: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 20 3d   it */.      r =
c170: 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   1;.    } else {
c180: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
c190: 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
c1a0: 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
c1b0: 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
c1c0: 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
c1d0: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
c1e0: 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
c1f0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
c200: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
c210: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  , pFile->h, RESE
c220: 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
c230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
c240: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
c250: 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70  LOCK %d %d\n", p
c260: 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 20 20 0a  File->h, r);.  .
c270: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 3b 0a    *pResOut = r;.
c280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c290: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74  OK;.}../* AFP-st
c2a0: 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c  yle locking foll
c2b0: 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69  owing the behavi
c2c0: 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20  or of unixLock, 
c2d0: 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  see the unixLock
c2e0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f   .** function co
c2f0: 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69  mments for detai
c300: 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67  ls of lock manag
c310: 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63  ement. */.static
c320: 20 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b   int afpUnixLock
c330: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
c340: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
c350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c360: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
c370: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c380: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
c390: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
c3a0: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
c3b0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
c3c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
c3d0: 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 67 6f 74  ntext;.  int got
c3e0: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
c3f0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
c400: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
c410: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  5("LOCK    %d %s
c420: 20 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e   was %s pid=%d\n
c430: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
c440: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
c450: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f  me(locktype), lo
c460: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
c470: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74  ->locktype), get
c480: 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
c490: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
c4a0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
c4b0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
c4c0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
c4d0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
c4e0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
c4f0: 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
c500: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
c510: 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72  h, as.  ** enter
c520: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
c530: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
c540: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
c550: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
c560: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
c570: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
c580: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
c590: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
c5a0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
c5b0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
c5c0: 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75  type));.    retu
c5d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c5e0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
c5f0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
c600: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
c610: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
c620: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c630: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
c640: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
c650: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c660: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
c670: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
c680: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
c690: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
c6a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
c6b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
c6c0: 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
c6d0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
c6e0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
c6f0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
c700: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
c710: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a   enterMutex();..
c720: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
c730: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
c740: 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
c750: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
c760: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
c770: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
c780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c790: 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
c7a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
c7b0: 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
c7c0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
c7d0: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
c7e0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
c7f0: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
c800: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
c810: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
c820: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
c830: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
c840: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
c850: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
c860: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
c870: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
c880: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
c890: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c8a0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
c8b0: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
c8c0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
c8d0: 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
c8e0: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
c8f0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
c900: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
c910: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
c920: 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
c930: 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
c940: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
c950: 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
c960: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
c970: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
c980: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
c990: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
c9a0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
c9b0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
c9c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
c9d0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
c9e0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
c9f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ca00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ca10: 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66 61 69 6c      int lk, fail
ca20: 65 64 3b 0a 20 20 20 20 69 6e 74 20 74 72 69 65  ed;.    int trie
ca30: 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  s = 0;.    .    
ca40: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
ca50: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
ca60: 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
ca70: 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
ca80: 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
ca90: 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
caa0: 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
cab0: 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63  random(); .    c
cac0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
cad0: 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30  ckByte = (lk & 0
cae0: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
caf0: 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
cb00: 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
cb10: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
cb20: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
cb30: 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 53 48 41  e->h, .      SHA
cb40: 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78  RED_FIRST+contex
cb50: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
cb60: 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 0a 20  e, 1, 1);.    . 
cb70: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
cb80: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
cb90: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20   lock */.    if 
cba0: 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  (_AFPFSSetLock(c
cbb0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
cbc0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  , pFile->h, PEND
cbd0: 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29  ING_BYTE, 1, 0))
cbe0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
cbf0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
cc00: 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  K;  /* This shou
cc10: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
cc20: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  */.      goto af
cc30: 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
cc40: 7d 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 66  }.    .    if( f
cc50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
cc60: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
cc70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
cc80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
cc90: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
cca0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  K;.    }.  }else
ccb0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
ccc0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
ccd0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
cce0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
ccf0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
cd00: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
cd10: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
cd20: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
cd30: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
cd40: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
cd50: 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
cd60: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
cd70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
cd80: 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
cd90: 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
cda0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
cdb0: 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
cdc0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
cdd0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
cde0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
cdf0: 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
ce00: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
ce10: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
ce20: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
ce30: 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
ce40: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
ce50: 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79 70  ailed && locktyp
ce60: 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  e == EXCLUSIVE_L
ce70: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
ce80: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
ce90: 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
cea0: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
ceb0: 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
cec0: 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
ced0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
cee0: 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
cef0: 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
cf00: 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
cf10: 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
cf20: 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 69 78  get the  afpUnix
cf30: 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
cf40: 20 20 20 20 20 20 69 66 20 28 21 5f 41 46 50 46        if (!_AFPF
cf50: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
cf60: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
cf70: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
cf80: 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
cfa0: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
cfb0: 6b 42 79 74 65 2c 20 31 2c 20 30 29 29 20 7b 0a  kByte, 1, 0)) {.
cfc0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
cfd0: 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
cfe0: 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
cff0: 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
d000: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
d010: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
d020: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
d030: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
d040: 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
d070: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
d080: 20 28 66 61 69 6c 65 64 20 26 26 20 5f 41 46 50   (failed && _AFP
d090: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
d0a0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
d0b0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
d0c0: 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
d0f0: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
d100: 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20 20 20  e, 1, 1)) {.    
d110: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d120: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20  E_IOERR_RDLOCK; 
d130: 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* this should n
d140: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
d150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d160: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
d170: 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  /* */.        rc
d180: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d190: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20  UNLOCK; /* this 
d1a0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
d1b0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
d1c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
d1d0: 6c 65 64 20 26 26 20 72 63 20 3d 3d 20 53 51 4c  led && rc == SQL
d1e0: 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 20 20 72  ITE_OK){.      r
d1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
d200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
d210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d220: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
d230: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
d240: 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
d250: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
d260: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
d270: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
d280: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
d290: 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
d2a0: 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74  lock:.  leaveMut
d2b0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
d2c0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
d2d0: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
d2e0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
d2f0: 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
d300: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
d310: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
d320: 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
d330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
d340: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
d350: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
d360: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
d370: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
d380: 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
d390: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
d3a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
d3b0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
d3c0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
d3d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d3e0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
d3f0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
d400: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
d410: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
d420: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
d440: 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  UnixUnlock(sqlit
d450: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d460: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 73   locktype) {.  s
d470: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
d480: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d490: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
d4a0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d4b0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
d4c0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
d4d0: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
d4e0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
d4f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d500: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
d510: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d520: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
d530: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
d540: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
d550: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
d560: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
d570: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
d580: 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63    .  assert( loc
d590: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
d5a0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
d5b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63  e->locktype<=loc
d5c0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
d5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d5e0: 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54   }.  if( CHECK_T
d5f0: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29  HREADID(pFile) )
d600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d610: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
d620: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
d630: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
d640: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
d650: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
d660: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
d670: 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
d680: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20 20 20  failed = 0;..   
d690: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65     /* unlock the
d6a0: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
d6b0: 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62   - then re-estab
d6c0: 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
d6d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66  lock */.      if
d6e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
d6f0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
d700: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69  K) {.        fai
d710: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
d720: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
d730: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
d740: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_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 20 20 20                  
d770: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
d780: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66  ;.        if (!f
d790: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ailed) {.       
d7a0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c     /* successful
d7b0: 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65  ly removed the e
d7c0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d7d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f  .          if (_
d7e0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d7f0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d800: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
d810: 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20 20 20  _FIRST+.        
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
d840: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
d850: 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1)) {.          
d860: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
d870: 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75 72 20  e-establish our 
d880: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
d890: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
d8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
d8b0: 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f  OCK; /* This sho
d8c0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
d8d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
d8e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
d900: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
d910: 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65 64 20  happen - failed 
d920: 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78  to unlock the ex
d930: 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2a 2f  clusive range */
d940: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d950: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d960: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  OCK;.        } .
d970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d980: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49    if (rc == SQLI
d990: 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
d9a0: 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
d9b0: 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  G_LOCK) {.      
d9c0: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
d9d0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
d9e0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
d9f0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
da00: 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0)){.        /* 
da10: 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73  failed to releas
da20: 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  e the pending lo
da30: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ck */.        rc
da40: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
da50: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  UNLOCK; /* This 
da60: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
da70: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
da80: 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63     } .    if (rc
da90: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26   == SQLITE_OK &&
daa0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
dab0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  >=RESERVED_LOCK)
dac0: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
dad0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
dae0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
daf0: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
db00: 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a  _BYTE, 1, 0)) {.
db10: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
db20: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
db30: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
db40: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
db50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
db60: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
db70: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
db80: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
db90: 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  } .  }.  if( loc
dba0: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
dbb0: 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
dbc0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
dbd0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
dbe0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, 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 20 20 20 20 53 48                SH
dc10: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
dc20: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
dc30: 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
dc40: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
dc50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
dc60: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
dc70: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
dc80: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
dc90: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72     }.  }.  if (r
dca0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  c == SQLITE_OK).
dcb0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
dcc0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
dcd0: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
dce0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dcf0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
dd00: 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
dd10: 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
dd20: 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
dd30: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
dd40: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
dd50: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78  le *id) {.  unix
dd60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
dd70: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
dd80: 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74  if( !pFile ) ret
dd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dda0: 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 69   afpUnixUnlock(i
ddb0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73  d, NO_LOCK);.  s
ddc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
ddd0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
dde0: 74 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  t);.  if( pFile-
ddf0: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
de00: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
de10: 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20  .  pFile->dirfd 
de20: 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74  = -1;.  enterMut
de30: 65 78 28 29 3b 0a 20 20 63 6c 6f 73 65 28 70 46  ex();.  close(pF
de40: 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c 65 61 76 65  ile->h);.  leave
de50: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
de60: 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE2("CLOSE   %-3
de70: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
de80: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
de90: 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  1);.  memset(pFi
dea0: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
deb0: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
dec0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ded0: 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66  ..#pragma mark f
dee0: 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63  lock() style loc
def0: 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  king../*.** The 
df00: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  flockLockingCont
df10: 65 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  ext is not used.
df20: 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20  */.typedef void 
df30: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  flockLockingCont
df40: 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ext;..static int
df50: 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52   flockUnixCheckR
df60: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
df70: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
df80: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
df90: 6e 74 20 72 20 3d 20 31 3b 0a 20 20 75 6e 69 78  nt r = 1;.  unix
dfa0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
dfb0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
dfc0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
dfd0: 6b 74 79 70 65 20 21 3d 20 52 45 53 45 52 56 45  ktype != RESERVE
dfe0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 2f 2a  D_LOCK) {.    /*
dff0: 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
e000: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
e010: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
e020: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
e030: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
e040: 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20   if (!rc) {.    
e050: 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
e060: 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
e070: 20 20 20 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c        flock(pFil
e080: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
e090: 20 20 20 20 20 20 72 20 3d 20 30 3b 20 20 2f 2a        r = 0;  /*
e0a0: 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69 74 20 72   no one has it r
e0b0: 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 7d  eserved */.    }
e0c0: 0a 20 20 7d 0a 0a 20 20 2a 70 52 65 73 4f 75 74  .  }..  *pResOut
e0d0: 20 3d 20 72 3b 0a 20 20 72 65 74 75 72 6e 20 53   = r;.  return S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
e0f0: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
e100: 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  xLock(sqlite3_fi
e110: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
e120: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
e130: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e140: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
e150: 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
e160: 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
e170: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
e180: 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
e190: 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
e1a0: 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
e1b0: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
e1c0: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
e1d0: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
e1e0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
e1f0: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
e200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e210: 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
e220: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
e230: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f  /.  int rc = flo
e240: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
e250: 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
e260: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
e270: 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
e280: 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
e290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e2a0: 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65 6c 73 65  E_BUSY;.  } else
e2b0: 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
e2c0: 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
e2d0: 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
e2e0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e2f0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
e300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e310: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  E_OK;.  }.}..sta
e320: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
e330: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
e340: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
e350: 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
e360: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e370: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
e380: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
e390: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
e3a0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
e3b0: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
e3c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
e3d0: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
e3e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e3f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
e400: 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
e410: 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
e420: 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
e430: 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
e440: 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
e450: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
e460: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
e470: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
e480: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e490: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
e4a0: 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
e4b0: 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74  unlock. */.  int
e4c0: 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c   rc = flock(pFil
e4d0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
e4e0: 20 20 69 66 20 28 72 63 29 0a 20 20 20 20 72 65    if (rc).    re
e4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e500: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65  R_UNLOCK;.  else
e510: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
e520: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
e530: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e540: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
e550: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
e560: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e570: 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28   flockUnixClose(
e580: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e590: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
e5a0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e5b0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20  e*)id;.  .  if( 
e5c0: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
e5d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f  SQLITE_OK;.  flo
e5e0: 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c  ckUnixUnlock(id,
e5f0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20   NO_LOCK);.  .  
e600: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
e610: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c  >=0 ) close(pFil
e620: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69  e->dirfd);.  pFi
e630: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
e640: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
e650: 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  .  close(pFile->
e660: 68 29 3b 20 20 0a 20 20 6c 65 61 76 65 4d 75 74  h);  .  leaveMut
e670: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  ex();.  OSTRACE2
e680: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
e690: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
e6a0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
e6b0: 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
e6c0: 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
e6d0: 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
e6e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70  SQLITE_OK;.}..#p
e6f0: 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53  ragma mark Old-S
e700: 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65  chool .lock file
e710: 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a   based locking..
e720: 2f 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 6c 6f 63  /*.** The dotloc
e730: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
e740: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
e750: 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f 63 6b 20 28  ns all dotlock (
e760: 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a 2a 2a 20 73  .lock) lock.** s
e770: 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
e780: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
e790: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
e7a0: 6e 74 65 78 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  ntext dotlockLoc
e7b0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
e7c0: 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  uct dotlockLocki
e7d0: 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 63 68  ngContext {.  ch
e7e0: 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3b 0a 7d 3b  ar *lockPath;.};
e7f0: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  ...static int do
e800: 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  tlockUnixCheckRe
e810: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
e820: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
e830: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
e840: 6e 74 20 72 20 3d 20 31 3b 0a 20 20 75 6e 69 78  nt r = 1;.  unix
e850: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e860: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64  nixFile*)id;.  d
e870: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
e880: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 0a  text *context;..
e890: 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 64 6f 74    context = (dot
e8a0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e8b0: 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
e8c0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 20  ngContext;.  if 
e8d0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
e8e0: 20 21 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   != RESERVED_LOC
e8f0: 4b 29 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  K) {.    struct 
e900: 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20  stat statBuf;.  
e910: 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74    if (lstat(cont
e920: 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73  ext->lockPath,&s
e930: 74 61 74 42 75 66 29 20 21 3d 20 30 29 7b 0a 20  tatBuf) != 0){. 
e940: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65       /* file doe
e950: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20  s not exist, we 
e960: 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
e970: 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
e980: 20 20 20 20 20 72 20 3d 20 30 3b 0a 20 20 20 20       r = 0;.    
e990: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 52 65 73 4f 75  }.  }..  *pResOu
e9a0: 74 20 3d 20 72 3b 0a 20 20 72 65 74 75 72 6e 20  t = r;.  return 
e9b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
e9c0: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
e9d0: 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  UnixLock(sqlite3
e9e0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
e9f0: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
ea00: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ea10: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
ea20: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
ea30: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
ea40: 20 20 69 6e 74 20 66 64 3b 0a 0a 20 20 63 6f 6e    int fd;..  con
ea50: 74 65 78 74 20 3d 20 28 64 6f 74 6c 6f 63 6b 4c  text = (dotlockL
ea60: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
ea70: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
ea80: 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 69 66  text;.  .  /* if
ea90: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
eaa0: 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
eab0: 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
eac0: 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
ead0: 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
eae0: 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
eaf0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
eb00: 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
eb10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
eb20: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
eb30: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77  .    .    /* Alw
eb40: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
eb50: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
eb60: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
eb70: 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d 3e  utimes(context->
eb80: 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a  lockPath,NULL);.
eb90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eba0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
ebb0: 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * check to see i
ebc0: 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  f lock file alre
ebd0: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
ebe0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
ebf0: 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74  Buf;.  if (lstat
ec00: 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
ec10: 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20  th,&statBuf) == 
ec20: 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0){.    return S
ec30: 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a 20 69  QLITE_BUSY; /* i
ec40: 74 20 64 6f 65 73 2c 20 62 75 73 79 20 2a 2f 0a  t does, busy */.
ec50: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
ec60: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
ec70: 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  ck */.  fd = ope
ec80: 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  n(context->lockP
ec90: 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43  ath,O_RDONLY|O_C
eca0: 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30  REAT|O_EXCL,0600
ecb0: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
ecc0: 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
ecd0: 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
ece0: 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20  e file, someone 
ecf0: 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73 74  else may have st
ed00: 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  olen the lock */
ed10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ed20: 54 45 5f 42 55 53 59 3b 20 0a 20 20 7d 0a 20 20  TE_BUSY; .  }.  
ed30: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20  close(fd);.  .  
ed40: 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
ed50: 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
ed60: 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
ed70: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
ed80: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
ed90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
eda0: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
edb0: 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  UnixUnlock(sqlit
edc0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
edd0: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
ede0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
edf0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
ee00: 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67    dotlockLocking
ee10: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
ee20: 3b 0a 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  ;..  context = (
ee30: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
ee40: 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
ee50: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
ee60: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
ee70: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
ee80: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
ee90: 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
eea0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
eeb0: 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
eec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
eed0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
eee0: 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
eef0: 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
ef00: 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
ef10: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
ef20: 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79   */.  if (lockty
ef30: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
ef40: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
ef50: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
ef60: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
ef70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
ef80: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
ef90: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e   unlock. */.  un
efa0: 6c 69 6e 6b 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  link(context->lo
efb0: 63 6b 50 61 74 68 29 3b 0a 20 20 70 46 69 6c 65  ckPath);.  pFile
efc0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
efd0: 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
efe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
eff0: 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
f000: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
f010: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73   dotlockUnixClos
f020: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f030: 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
f040: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f050: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66  ile*)id;.  .  if
f060: 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75 72  ( !pFile ) retur
f070: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64  n SQLITE_OK;.  d
f080: 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  otlockUnixUnlock
f090: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
f0a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
f0b0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
f0c0: 65 78 74 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ext);.  if( pFil
f0d0: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  e->dirfd>=0 ) cl
f0e0: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
f0f0: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  );.  pFile->dirf
f100: 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d  d = -1;.  enterM
f110: 75 74 65 78 28 29 3b 20 20 0a 20 20 63 6c 6f 73  utex();  .  clos
f120: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c  e(pFile->h);.  l
f130: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
f140: 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20  STRACE2("CLOSE  
f150: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
f160: 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
f170: 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74  er(-1);.  memset
f180: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
f190: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
f1a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f1b0: 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61  ;.}...#pragma ma
f1c0: 72 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f  rk No locking../
f1d0: 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c  *.** The nolockL
f1e0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
f1f0: 20 76 6f 69 64 0a 2a 2f 0a 74 79 70 65 64 65 66   void.*/.typedef
f200: 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   void nolockLock
f210: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61  ingContext;..sta
f220: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
f230: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
f240: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f250: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
f260: 75 74 29 20 7b 0a 20 20 2a 70 52 65 73 4f 75 74  ut) {.  *pResOut
f270: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
f280: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
f290: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
f2a0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
f2b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
f2c0: 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72  ktype) {.  retur
f2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f2e0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f2f0: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  kUnixUnlock(sqli
f300: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f310: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f340: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f350: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
f360: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
f370: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69  ile *id) {.  uni
f380: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f390: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
f3a0: 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20  .  if( !pFile ) 
f3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f3c0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
f3d0: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
f3e0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
f3f0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
f400: 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  -1;.  enterMutex
f410: 28 29 3b 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c  ();.  close(pFil
f420: 65 2d 3e 68 29 3b 0a 20 20 6c 65 61 76 65 4d 75  e->h);.  leaveMu
f430: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
f440: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
f450: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
f460: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
f470: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
f480: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
f490: 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
f4a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
f4b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f4c0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f4d0: 54 59 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TYLE */.../*.** 
f4e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
f4f0: 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
f500: 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
f510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f520: 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
f530: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f540: 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
f550: 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
f560: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
f570: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
f580: 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
f590: 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
f5a0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
f5b0: 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
f5c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f5d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f5e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
f5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f600: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
f610: 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
f620: 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
f630: 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
f640: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
f650: 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
f660: 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
f670: 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
f680: 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
f690: 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
f6a0: 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
f6b0: 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
f6c0: 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
f6d0: 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
f6e0: 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
f6f0: 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
f700: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
f710: 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
f720: 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
f730: 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
f740: 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
f750: 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
f760: 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
f770: 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
f780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f790: 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
f7a0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
f7b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7c0: 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
f7d0: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
f7e0: 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
f7f0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
f800: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68  for the file. Th
f810: 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a  is is always 0..
f820: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f830: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
f840: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
f850: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74  file *id){.  ret
f860: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f870: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
f880: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
f890: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
f8a0: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
f8b0: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
f8c0: 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nix..*/.static c
f8d0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
f8e0: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 55  methods sqlite3U
f8f0: 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
f900: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
f910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
f920: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  Version */.  uni
f930: 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65  xClose,.  unixRe
f940: 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c  ad,.  unixWrite,
f950: 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c  .  unixTruncate,
f960: 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75  .  unixSync,.  u
f970: 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75  nixFileSize,.  u
f980: 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55  nixLock,.  unixU
f990: 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 43 68 65  nlock,.  unixChe
f9a0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
f9b0: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
f9c0: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
f9d0: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
f9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
f9f0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
fa00: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
fa10: 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
fa20: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
fa30: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
fa40: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
fa50: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
fa60: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
fa70: 78 20 77 69 74 68 20 41 46 50 20 73 74 79 6c 65  x with AFP style
fa80: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
fa90: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
faa0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
fab0: 73 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b  s sqlite3AFPLock
fac0: 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
fad0: 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
fb00: 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c 0a 20   afpUnixClose,. 
fb10: 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69   unixRead,.  uni
fb20: 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72  xWrite,.  unixTr
fb30: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
fb40: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  nc,.  unixFileSi
fb50: 7a 65 2c 0a 20 20 61 66 70 55 6e 69 78 4c 6f 63  ze,.  afpUnixLoc
fb60: 6b 2c 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  k,.  afpUnixUnlo
fb70: 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78 43 68 65  ck,.  afpUnixChe
fb80: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
fb90: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
fba0: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
fbb0: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
fbc0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
fbd0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
fbe0: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
fbf0: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
fc00: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
fc10: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
fc20: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
fc30: 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c  ith flock() styl
fc40: 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
fc50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
fc60: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
fc70: 64 73 20 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c  ds sqlite3FlockL
fc80: 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
fc90: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
fcc0: 2f 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f  /.  flockUnixClo
fcd0: 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  se,.  unixRead,.
fce0: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
fcf0: 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75  nixTruncate,.  u
fd00: 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46  nixSync,.  unixF
fd10: 69 6c 65 53 69 7a 65 2c 0a 20 20 66 6c 6f 63 6b  ileSize,.  flock
fd20: 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 66 6c 6f 63  UnixLock,.  floc
fd30: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 66  kUnixUnlock,.  f
fd40: 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
fd50: 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
fd60: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
fd70: 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
fd80: 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
fd90: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
fda0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
fdb0: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
fdc0: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
fdd0: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
fde0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
fdf0: 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
fe00: 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
fe10: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
fe20: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
fe30: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
fe40: 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b  lite3DotlockLock
fe50: 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
fe60: 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
fe90: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73   dotlockUnixClos
fea0: 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  e,.  unixRead,. 
feb0: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
fec0: 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e  ixTruncate,.  un
fed0: 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  ixSync,.  unixFi
fee0: 6c 65 53 69 7a 65 2c 0a 20 20 64 6f 74 6c 6f 63  leSize,.  dotloc
fef0: 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 64 6f 74  kUnixLock,.  dot
ff00: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
ff10: 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65    dotlockUnixChe
ff20: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
ff30: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
ff40: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
ff50: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
ff60: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ff70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
ff80: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
ff90: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
ffa0: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
ffb0: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
ffc0: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
ffd0: 69 74 68 20 6e 6f 6c 6f 63 6b 20 73 74 79 6c 65  ith nolock style
ffe0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
fff0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
10000 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
10010 73 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c  s sqlite3NolockL
10020 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
10030 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
10060 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c  /.  nolockUnixCl
10070 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c  ose,.  unixRead,
10080 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20  .  unixWrite,.  
10090 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20  unixTruncate,.  
100a0 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78  unixSync,.  unix
100b0 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f  FileSize,.  nolo
100c0 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f  ckUnixLock,.  no
100d0 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
100e0 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63    nolockUnixChec
100f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
10100 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
10110 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  ,.  unixSectorSi
10120 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65  ze,.  unixDevice
10130 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a  Characteristics.
10140 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  };..#endif /* SQ
10150 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
10160 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
10170 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
10180 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 75 6e  ory for a new un
10190 69 78 46 69 6c 65 20 61 6e 64 20 69 6e 69 74 69  ixFile and initi
101a0 61 6c 69 7a 65 20 74 68 61 74 20 75 6e 69 78 46  alize that unixF
101b0 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65 20 61 20  ile..** Write a 
101c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
101d0 65 77 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f  ew unixFile into
101e0 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20 77 65 20   *pId..** If we 
101f0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
10200 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  y, close the fil
10210 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
10220 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  error..*/.#ifdef
10230 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10240 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
10250 0a 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b 69 6e 67  .** When locking
10260 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 72 65 20   extensions are 
10270 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 66 69 6c  enabled, the fil
10280 65 70 61 74 68 20 61 6e 64 20 6c 6f 63 6b 69 6e  epath and lockin
10290 67 20 73 74 79 6c 65 20 0a 2a 2a 20 61 72 65 20  g style .** are 
102a0 6e 65 65 64 65 64 20 74 6f 20 64 65 74 65 72 6d  needed to determ
102b0 69 6e 65 20 74 68 65 20 75 6e 69 78 46 69 6c 65  ine the unixFile
102c0 20 70 4d 65 74 68 6f 64 20 74 6f 20 75 73 65 20   pMethod to use 
102d0 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  for locking oper
102e0 61 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 6c  ations..** The l
102f0 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 73 70 65  ocking-style spe
10300 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e  cific lockingCon
10310 74 65 78 74 20 64 61 74 61 20 73 74 72 75 63 74  text data struct
10320 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 0a  ure is created .
10330 2a 2a 20 61 6e 64 20 61 73 73 69 67 6e 65 64 20  ** and assigned 
10340 68 65 72 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74  here also..*/.st
10350 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
10360 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68  nixFile(.  int h
10370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10380 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
10390 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
103a0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
103b0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20  */.  int dirfd, 
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103d0 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
103e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
103f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
10400 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
10410 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
10420 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
10430 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10440 7a 46 69 6c 65 6e 61 6d 65 20 20 20 2f 2a 20 4e  zFilename   /* N
10450 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
10460 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
10470 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c 6f 63 6b  ){.  sqlite3Lock
10480 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b 69 6e 67  ingStyle locking
10490 53 74 79 6c 65 20 3d 20 6e 6f 4c 6f 63 6b 69 6e  Style = noLockin
104a0 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
104b0 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
104c0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
104d0 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 46 44  t rc;..#ifdef FD
104e0 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
104f0 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e  (h, F_SETFD, fcn
10500 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30  tl(h, F_GETFD, 0
10510 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
10520 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
10530 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d  t( pNew->pLock==
10540 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
10550 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e  ( pNew->pOpen==N
10560 55 4c 4c 20 29 3b 0a 20 20 69 66 28 20 7a 46 69  ULL );.  if( zFi
10570 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  lename ){.    /*
10580 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
10590 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 69 73 20   NULL then this 
105a0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
105b0 69 6c 65 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  ile. Temporary f
105c0 69 6c 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  iles.    ** are 
105d0 6e 65 76 65 72 20 6c 6f 63 6b 65 64 20 6f 72 20  never locked or 
105e0 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 20 6e 6f 4c  unlocked, so noL
105f0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 69 73 20 75  ockingStyle is u
10600 73 65 64 20 66 6f 72 20 74 68 65 73 65 2e 0a 20  sed for these.. 
10610 20 20 20 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e     ** The lockin
10620 67 20 73 74 79 6c 65 20 75 73 65 64 20 62 79 20  g style used by 
10630 6f 74 68 65 72 20 66 69 6c 65 73 20 69 73 20 64  other files is d
10640 65 74 65 72 6d 69 6e 65 64 20 62 79 20 0a 20 20  etermined by .  
10650 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 65 74 65    ** sqlite3Dete
10660 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 29  ctLockingStyle()
10670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 6f 63  ..    */.    loc
10680 6b 69 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c 69  kingStyle = sqli
10690 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67  te3DetectLocking
106a0 53 74 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  Style(zFilename,
106b0 20 68 29 3b 0a 20 20 20 20 69 66 20 28 20 6c 6f   h);.    if ( lo
106c0 63 6b 69 6e 67 53 74 79 6c 65 3d 3d 70 6f 73 69  ckingStyle==posi
106d0 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29 7b  xLockingStyle ){
106e0 0a 20 20 20 20 20 20 65 6e 74 65 72 4d 75 74 65  .      enterMute
106f0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
10700 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20  findLockInfo(h, 
10710 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
10720 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
10730 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
10740 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10750 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69 72  .        if( dir
10760 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
10770 72 66 64 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  rfd);.        cl
10780 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20  ose(h);.        
10790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
107a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
107b0 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20  OSTRACE3("OPEN  
107c0 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
107d0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20   zFilename);    
107e0 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
107f0 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
10800 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52  dirfd;.  SET_THR
10810 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 20 20 20  EADID(pNew);.   
10820 20 0a 20 20 73 77 69 74 63 68 28 6c 6f 63 6b 69   .  switch(locki
10830 6e 67 53 74 79 6c 65 29 20 7b 0a 20 20 20 20 63  ngStyle) {.    c
10840 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74  ase afpLockingSt
10850 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  yle: {.      /* 
10860 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  afp locking uses
10870 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
10880 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
10890 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
108a0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
108b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
108c0 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43       afpLockingC
108d0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
108e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  .      pNew->pMe
108f0 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 41  thod = &sqlite3A
10900 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  FPLockingUnixIoM
10910 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 70 4e 65  ethod;.      pNe
10920 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
10930 74 20 3d 20 63 6f 6e 74 65 78 74 20 3d 20 73 71  t = context = sq
10940 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
10950 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74 29 20 29  zeof(*context) )
10960 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 74  ;.      if( cont
10970 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
10980 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
10990 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
109a0 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b   ) close(dirfd);
109b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
109c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
109d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
109e0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
109f0 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
10a00 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
10a10 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
10a20 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
10a30 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
10a40 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
10a50 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
10a60 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
10a70 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
10a80 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63  name. */.      c
10a90 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
10aa0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
10ab0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
10ac0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10ad0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 66 6c     }.    case fl
10ae0 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  ockLockingStyle:
10af0 0a 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20  .      /* flock 
10b00 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20  locking doesn't 
10b10 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20  need additional 
10b20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  lockingContext i
10b30 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
10b40 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
10b50 64 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63  d = &sqlite3Floc
10b60 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
10b70 74 68 6f 64 3b 0a 20 20 20 20 20 20 62 72 65 61  thod;.      brea
10b80 6b 3b 0a 20 20 20 20 63 61 73 65 20 64 6f 74 6c  k;.    case dotl
10b90 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  ockLockingStyle:
10ba0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 64 6f 74 6c   {.      /* dotl
10bb0 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ock locking uses
10bc0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
10bd0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
10be0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
10bf0 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
10c00 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10c10 2a 2f 0a 20 20 20 20 20 20 64 6f 74 6c 6f 63 6b  */.      dotlock
10c20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10c30 63 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 69  context;.      i
10c40 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
10c50 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
10c60 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
10c70 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
10c80 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
10c90 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  3DotlockLockingU
10ca0 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
10cb0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
10cc0 43 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78  Context = contex
10cd0 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
10ce0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
10cf0 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74 29 20 2b  zeof(*context) +
10d00 20 6e 46 69 6c 65 6e 61 6d 65 20 2b 20 36 20 29   nFilename + 6 )
10d10 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 74  ;.      if( cont
10d20 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
10d30 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
10d40 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
10d50 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b   ) close(dirfd);
10d60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10d70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10d80 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
10d90 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 20 3d 20  ext->lockPath = 
10da0 28 63 68 61 72 2a 29 26 63 6f 6e 74 65 78 74 5b  (char*)&context[
10db0 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1];.      sqlite
10dc0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
10dd0 6e 61 6d 65 2c 20 63 6f 6e 74 65 78 74 2d 3e 6c  name, context->l
10de0 6f 63 6b 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ockPath,.       
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65  "%s.lock", zFile
10e10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
10e20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10e30 73 65 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53  se posixLockingS
10e40 74 79 6c 65 3a 0a 20 20 20 20 20 20 2f 2a 20 70  tyle:.      /* p
10e50 6f 73 69 78 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  osix locking doe
10e60 73 6e 27 74 20 6e 65 65 64 20 61 64 64 69 74 69  sn't need additi
10e70 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74  onal lockingCont
10e80 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ext information 
10e90 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  */.      pNew->p
10ea0 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
10eb0 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  3UnixIoMethod;. 
10ec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10ed0 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74  case noLockingSt
10ee0 79 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 75 6e  yle:.    case un
10ef0 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67  supportedLocking
10f00 53 74 79 6c 65 3a 0a 20 20 20 20 64 65 66 61 75  Style:.    defau
10f10 6c 74 3a 20 0a 20 20 20 20 20 20 70 4e 65 77 2d  lt: .      pNew-
10f20 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
10f30 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  te3NolockLocking
10f40 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
10f50 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
10f60 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
10f70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65  LITE_OK;.}.#else
10f80 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
10f90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
10fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
10fb0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
10fc0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
10fd0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
10fe0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
10ff0 6e 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  n file being ope
11000 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ned */.  int dir
11010 66 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  fd,.  sqlite3_fi
11020 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 2f 2a 20  le *pId,     /* 
11030 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
11040 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
11050 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
11060 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20  char *zFilename 
11070 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11080 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
11090 64 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  d */.){.  unixFi
110a0 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
110b0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
110c0 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 46 44  t rc;..#ifdef FD
110d0 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
110e0 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e  (h, F_SETFD, fcn
110f0 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30  tl(h, F_GETFD, 0
11100 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
11110 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6e 74 65 72  .#endif..  enter
11120 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20  Mutex();.  rc = 
11130 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20  findLockInfo(h, 
11140 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
11150 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 6c  New->pOpen);.  l
11160 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
11170 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
11180 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
11190 65 28 64 69 72 66 64 29 3b 0a 20 20 20 20 63 6c  e(dirfd);.    cl
111a0 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65 74 75  ose(h);.    retu
111b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 4f 53  rn rc;.  }..  OS
111c0 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20  TRACE3("OPEN    
111d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
111e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 4e 65  Filename);.  pNe
111f0 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  w->dirfd = -1;. 
11200 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
11210 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69  pNew->dirfd = di
11220 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41  rfd;.  SET_THREA
11230 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20 20 70 4e  DID(pNew);..  pN
11240 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
11250 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68  qlite3UnixIoMeth
11260 6f 64 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  od;.  OpenCounte
11270 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
11280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
11290 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
112a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
112b0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  LE */../*.** Ope
112c0 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
112d0 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
112e0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
112f0 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
11300 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
11310 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
11320 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
11330 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
11340 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
11350 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
11360 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
11370 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
11380 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
11390 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
113a0 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
113b0 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
113c0 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
113d0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
113e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
113f0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
11400 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
11410 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
11420 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
11430 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
11440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
11450 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
11460 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
11470 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
11480 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
11490 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
114a0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
114b0 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
114c0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
114d0 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
114e0 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
114f0 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 73 74  me);.  for(ii=st
11500 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
11510 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61 6d  ii>=0 && zDirnam
11520 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
11530 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
11540 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
11550 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
11560 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
11570 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
11580 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
11590 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66   fd>=0 ){.#ifdef
115a0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
115b0 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
115c0 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
115d0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
115e0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
115f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28  .      OSTRACE3(
11600 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
11610 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
11620 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
11630 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
11640 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
11650 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54  E_OK:SQLITE_CANT
11660 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OPEN);.}../*.** 
11670 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
11680 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
11690 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
116a0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
116b0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
116c0 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
116d0 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
116e0 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
116f0 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
11700 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
11710 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
11720 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
11730 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
11740 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
11750 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
11760 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
11770 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
11780 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
11790 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
117a0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
117b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
117c0 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
117d0 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
117e0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
117f0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
11800 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
11810 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
11820 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
11830 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
11840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
11850 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49  r = ".";..  /* I
11860 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
11870 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
11880 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
11890 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
118a0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
118b0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
118c0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
118d0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
118e0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
118f0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
11900 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
11910 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
11920 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
11930 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
11940 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
11950 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ry;.  for(i=0; i
11960 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
11970 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
11980 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11990 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20   azDirs[i]==0 ) 
119a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
119b0 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d  ( stat(azDirs[i]
119c0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
119d0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
119e0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
119f0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
11a00 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44    if( access(azD
11a10 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f  irs[i], 07) ) co
11a20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72  ntinue;.    zDir
11a30 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20   = azDirs[i];.  
11a40 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11a50 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
11a60 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
11a70 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
11a80 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
11a90 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
11aa0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
11ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
11ac0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
11ad0 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
11ae0 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
11af0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
11b00 20 2b 20 31 37 29 20 3e 3d 20 6e 42 75 66 20 29   + 17) >= nBuf )
11b10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11b20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
11b30 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
11b40 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
11b50 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
11b60 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
11b70 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
11b80 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42     j = strlen(zB
11b90 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
11ba0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
11bb0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
11bc0 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
11bd0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
11be0 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
11bf0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
11c00 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
11c10 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
11c20 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
11c30 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
11c40 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42  while( access(zB
11c50 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
11c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11c70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  }.../*.** Open t
11c80 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
11c90 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
11ca0 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
11cb0 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
11cc0 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
11cd0 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
11ce0 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
11cf0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
11d00 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
11d10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
11d20 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
11d30 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
11d40 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
11d50 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
11d60 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
11d70 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
11d80 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
11d90 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
11da0 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
11db0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
11dc0 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
11dd0 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
11de0 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
11df0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
11e00 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
11e10 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
11e20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
11e30 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
11e40 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
11e50 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
11e60 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
11e70 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
11e80 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
11e90 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
11ea0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
11eb0 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
11ec0 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
11ed0 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
11ee0 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
11ef0 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
11f00 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
11f10 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
11f20 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
11f30 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
11f40 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
11f50 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
11f60 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
11f70 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
11f80 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
11f90 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
11fa0 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66   *pFile,.  int f
11fb0 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75  lags,.  int *pOu
11fc0 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20  tFlags.){.  int 
11fd0 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fd = 0;         
11fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11ff0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
12000 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
12010 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
12020 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
12030 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
12040 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
12050 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c 61 67  r */.  int oflag
12060 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
12070 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
12080 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
12090 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
120a0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
120b0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
120c0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
120d0 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
120e0 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
120f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
12100 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
12110 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
12120 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
12130 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
12140 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
12150 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
12160 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
12170 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
12180 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
12190 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
121a0 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
121b0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
121c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
121d0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a  EN_READWRITE);..
121e0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
121f0 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
12200 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
12210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
12220 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
12230 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
12240 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
12250 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
12260 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
12270 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
12280 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
12290 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
122a0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
122b0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
122c0 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
122d0 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
122e0 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54  te && .      (eT
122f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
12300 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
12310 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
12320 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
12330 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  AL).  );..  /* I
12340 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
12350 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
12360 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
12370 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
12380 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
12390 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
123a0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
123b0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
123c0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
123d0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
123e0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
123f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
12400 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
12410 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
12420 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
12430 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
12440 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
12450 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
12460 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
12470 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
12480 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
12490 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
124a0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
124b0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
124c0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
124d0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
124e0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
124f0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
12500 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
12510 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
12520 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
12530 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
12540 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
12550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
12560 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
12570 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
12580 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
12590 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
125a0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
125b0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
125c0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
125d0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
125e0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
125f0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
12600 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
12610 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
12620 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
12630 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
12640 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
12650 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
12660 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20   deleted.  */.  
12670 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
12680 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
12690 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  DB || !isDelete 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
126b0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
126c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
126d0 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
126e0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
126f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
12700 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
12710 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
12720 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
12730 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
12740 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
12750 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
12760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
12770 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
12780 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
12790 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
127a0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
127b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
127c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
127d0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
127e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
127f0 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
12800 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12810 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
12820 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
12830 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
12840 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
12850 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12860 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
12870 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 69 66 28  T_DB.  );..  if(
12880 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69   !zName ){.    i
12890 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
128a0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
128b0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b  sOpenDirectory);
128c0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d  .    rc = getTem
128d0 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
128e0 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+1, zTmpname);
128f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12920 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
12930 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  pname;.  }..  if
12940 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
12950 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  oflags |= O_RDON
12960 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
12970 57 72 69 74 65 20 29 20 6f 66 6c 61 67 73 20 7c  Write ) oflags |
12980 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
12990 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 66  isCreate )    of
129a0 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
129b0 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
129c0 76 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 28  ve ) oflags |= (
129d0 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
129e0 57 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c 3d 20  W);.  oflags |= 
129f0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
12a00 49 4e 41 52 59 29 3b 0a 0a 20 20 6d 65 6d 73 65  INARY);..  memse
12a10 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
12a20 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
12a30 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65   fd = open(zName
12a40 2c 20 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65  , oflags, isDele
12a50 74 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44  te?0600:SQLITE_D
12a60 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
12a70 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
12a80 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
12a90 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
12aa0 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
12ab0 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46  sive ){.    /* F
12ac0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
12ad0 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
12ae0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
12af0 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
12b00 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
12b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12b20 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
12b30 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c  _CREATE);.    fl
12b40 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12b50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
12b60 20 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e   return unixOpen
12b70 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46  (pVfs, zPath, pF
12b80 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74  ile, flags, pOut
12b90 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Flags);.  }.  if
12ba0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
12bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
12bc0 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OPEN;.  }.  if( 
12bd0 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
12be0 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 20  unlink(zName);. 
12bf0 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61   }.  if( pOutFla
12c00 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
12c10 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
12c20 7d 0a 0a 20 20 61 73 73 65 72 74 28 66 64 21 3d  }..  assert(fd!=
12c30 30 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  0);.  if( isOpen
12c40 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
12c50 20 69 6e 74 20 72 63 20 3d 20 6f 70 65 6e 44 69   int rc = openDi
12c60 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
12c70 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
12c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12c90 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
12ca0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12cb0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  c;.    }.  }.  r
12cc0 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  eturn fillInUnix
12cd0 46 69 6c 65 28 66 64 2c 20 64 69 72 66 64 2c 20  File(fd, dirfd, 
12ce0 70 46 69 6c 65 2c 20 7a 50 61 74 68 29 3b 0a 7d  pFile, zPath);.}
12cf0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
12d00 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
12d10 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
12d20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
12d30 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
12d40 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
12d50 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
12d60 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
12d70 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71  nt unixDelete(sq
12d80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12d90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
12da0 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
12db0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12dc0 49 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61  ITE_OK;.  Simula
12dd0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
12de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
12df0 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
12e00 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20 64 69  zPath);.  if( di
12e10 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74  rSync ){.    int
12e20 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70   fd;.    rc = op
12e30 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
12e40 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
12e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12e60 7b 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  {.      if( fsyn
12e70 63 28 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  c(fd) ){.       
12e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12e90 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20  RR_DIR_FSYNC;.  
12ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
12eb0 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
12ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12ed0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
12ee0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
12ef0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
12f00 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
12f10 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
12f20 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
12f30 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
12f40 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
12f50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12f60 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
12f70 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
12f80 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
12f90 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
12fa0 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
12fb0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
12fc0 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
12fd0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
12fe0 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
12ff0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
13000 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
13010 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
13020 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
13030 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
13040 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
13050 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
13060 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
13070 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
13080 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
13090 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a   int amode = 0;.
130a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
130b0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
130c0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
130d0 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
130e0 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
130f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
13100 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
13110 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
13120 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
13130 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
13140 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
13150 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
13160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13170 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
13180 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
13190 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
131a0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
131b0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
131c0 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
131d0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
131e0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
131f0 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74 68   = (access(zPath
13200 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
13210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13220 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
13230 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
13240 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
13250 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
13260 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
13270 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
13280 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
13290 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
132a0 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
132b0 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
132c0 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
132d0 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
132e0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
132f0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
13300 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
13310 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
13320 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
13330 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
13340 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
13350 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
13360 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
13370 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
13380 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
13390 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
133a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
133b0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
133c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
133d0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
133e0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
133f0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
13400 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
13410 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13420 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13430 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
13440 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
13450 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
13460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13470 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
13480 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
13490 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
134a0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
134b0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
134c0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
134d0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
134e0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
134f0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
13500 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
13510 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
13520 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
13530 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
13540 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
13550 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
13560 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
13570 6c 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ly has been unli
13580 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
13590 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
135a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
135b0 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
135c0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
135d0 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
135e0 3b 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ;.  zOut[nOut-1]
135f0 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
13600 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
13610 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13620 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
13630 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
13640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13650 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65  nCwd;.    if( ge
13660 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
13670 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
13680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
13690 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
136a0 20 6e 43 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a   nCwd = strlen(z
136b0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
136c0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
136d0 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
136e0 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
136f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13700 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30  QLITE_OK;..#if 0
13710 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76  .  /*.  ** Remov
13720 65 20 22 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65  e "/./" path ele
13730 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e 76 65 72  ments and conver
13740 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74 68 20 65  t "/A/./" path e
13750 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 6f 20  lements.  ** to 
13760 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20  just "/"..  */. 
13770 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b 0a 20 20   if( zFull ){.  
13780 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
13790 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c  for(i=j=0; zFull
137a0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
137b0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27   if( zFull[i]=='
137c0 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  /' ){.        if
137d0 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f  ( zFull[i+1]=='/
137e0 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
137f0 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
13800 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+1]=='.' && zFu
13810 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  ll[i+2]=='/' ){.
13820 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31            i += 1
13830 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
13840 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
13850 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c          if( zFul
13860 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a  l[i+1]=='.' && z
13870 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  Full[i+2]=='.' &
13880 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f  & zFull[i+3]=='/
13890 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  ' ){.          w
138a0 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 46 75  hile( j>0 && zFu
138b0 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20  ll[j-1]!='/' ){ 
138c0 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  j--; }.         
138d0 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20   i += 3;.       
138e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
138f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13900 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20       zFull[j++] 
13910 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = zFull[i];.    
13920 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d  }.    zFull[j] =
13930 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
13940 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
13950 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
13960 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
13970 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
13980 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
13990 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
139a0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
139b0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
139c0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
139d0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
139e0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
139f0 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
13a00 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
13a10 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
13a20 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
13a30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
13a40 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
13a50 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
13a60 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
13a70 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
13a80 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
13a90 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
13aa0 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
13ab0 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
13ac0 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
13ad0 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
13ae0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
13af0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
13b00 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
13b10 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
13b20 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
13b30 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
13b40 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
13b50 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
13b60 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
13b70 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
13b80 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
13b90 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
13ba0 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
13bb0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
13bc0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
13bd0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
13be0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
13bf0 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t){.  char *zErr
13c00 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ;.  enterMutex()
13c10 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
13c20 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
13c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13c40 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
13c50 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
13c60 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65  rr);.  }.  leave
13c70 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
13c80 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79  c void *unixDlSy
13c90 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
13ca0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
13cb0 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
13cc0 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75  zSymbol){.  retu
13cd0 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65  rn dlsym(pHandle
13ce0 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74  , zSymbol);.}.st
13cf0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
13d00 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
13d10 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
13d20 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f  Handle){.  dlclo
13d30 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
13d40 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
13d50 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
13d60 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
13d70 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
13d80 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
13d90 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
13da0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
13db0 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
13dc0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
13dd0 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
13de0 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
13df0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
13e00 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
13e10 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
13e20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
13e30 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
13e40 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
13e50 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
13e60 7a 42 75 66 29 7b 0a 0a 20 20 61 73 73 65 72 74  zBuf){..  assert
13e70 28 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  (nBuf>=(sizeof(t
13e80 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
13e90 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
13ea0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
13eb0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
13ec0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
13ed0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
13ee0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
13ef0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
13f00 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
13f10 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
13f20 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
13f30 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
13f40 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
13f50 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
13f60 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
13f70 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
13f80 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
13f90 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
13fa0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
13fb0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
13fc0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
13fd0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
13fe0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
13ff0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
14000 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
14010 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
14020 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
14030 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
14040 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
14050 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
14060 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
14070 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
14080 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
14090 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
140a0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
140b0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
140c0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
140d0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
140e0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
140f0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
14100 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
14110 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
14120 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
14130 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
14140 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
14150 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
14160 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
14170 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
14180 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
14190 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
141a0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
141b0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
141c0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
141d0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
141e0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
141f0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
14200 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
14210 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  id));.    }else{
14220 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c 20  .      read(fd, 
14230 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20  zBuf, nBuf);.   
14240 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
14250 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14270 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  K;.}.../*.** Sle
14280 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
14290 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
142a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
142b0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
142c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
142d0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
142e0 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
142f0 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
14300 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
14310 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
14320 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
14330 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
14340 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
14350 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
14360 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
14370 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
14380 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
14390 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
143a0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
143b0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
143c0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
143d0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
143e0 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
143f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14400 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
14410 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
14420 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
14430 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
14440 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
14450 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
14460 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
14470 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
14480 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
14490 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
144a0 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
144b0 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
144c0 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
144d0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
144e0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
144f0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
14500 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62  on-zero value, b
14510 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c  ecomes the resul
14520 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72  t.** returned fr
14530 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  om sqlite3OsCurr
14540 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73  entTime().  This
14550 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
14560 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
14570 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
14580 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14590 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  time = 0;.#endif
145a0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
145b0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
145c0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
145d0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
145e0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
145f0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
14600 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
14610 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
14620 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
14630 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
14640 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
14650 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
14660 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
14670 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
14680 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
14690 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
146a0 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e  prNow){.#ifdef N
146b0 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f  O_GETTOD.  time_
146c0 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
146d0 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36  .  *prNow = t/86
146e0 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
146f0 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  5;.#else.  struc
14700 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
14710 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
14720 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e  sNow, 0);.  *prN
14730 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b  ow = 2440587.5 +
14740 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34   sNow.tv_sec/864
14750 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  00.0 + sNow.tv_u
14760 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e  sec/86400000000.
14770 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
14780 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
14790 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
147a0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
147b0 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  prNow = sqlite3_
147c0 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34  current_time/864
147d0 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
147e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
147f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
14800 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
14810 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
14820 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
14830 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
14840 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
14850 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
14860 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
14870 71 6c 69 74 65 33 44 65 66 61 75 6c 74 56 66 73  qlite3DefaultVfs
14880 20 73 74 72 75 63 74 75 72 65 2e 20 20 20 57 65   structure.   We
14890 20 75 73 65 0a 2a 2a 20 61 20 66 75 6e 63 74 69   use.** a functi
148a0 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 67  on rather than g
148b0 69 76 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ive the structur
148c0 65 20 67 6c 6f 62 61 6c 20 73 63 6f 70 65 20 62  e global scope b
148d0 65 63 61 75 73 65 0a 2a 2a 20 73 6f 6d 65 20 63  ecause.** some c
148e0 6f 6d 70 69 6c 65 72 73 20 28 4d 53 56 43 29 20  ompilers (MSVC) 
148f0 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 66 6f 72  do not allow for
14900 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
14910 73 20 6f 66 0a 2a 2a 20 69 6e 69 74 69 61 6c 69  s of.** initiali
14920 7a 65 64 20 73 74 72 75 63 74 75 72 65 73 2e 0a  zed structures..
14930 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  */.sqlite3_vfs *
14940 73 71 6c 69 74 65 33 4f 73 44 65 66 61 75 6c 74  sqlite3OsDefault
14950 56 66 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Vfs(void){.  sta
14960 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
14970 75 6e 69 78 56 66 73 20 3d 20 7b 0a 20 20 20 20  unixVfs = {.    
14980 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
14990 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
149a0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e  */.    sizeof(un
149b0 69 78 46 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a  ixFile),   /* sz
149c0 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41  OsFile */.    MA
149d0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
149e0 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    /* mxPathname 
149f0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
14a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14a10 65 78 74 20 2a 2f 0a 20 20 20 20 22 75 6e 69 78  ext */.    "unix
14a20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
14a30 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
14a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a50 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
14a60 2f 0a 20 20 0a 20 20 20 20 75 6e 69 78 4f 70 65  /.  .    unixOpe
14a70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
14a80 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 75 6e 69  xOpen */.    uni
14a90 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  xDelete,        
14aa0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
14ab0 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20     unixAccess,  
14ac0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
14ad0 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 75 6c  s */.    unixFul
14ae0 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20  lPathname,   /* 
14af0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
14b00 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c  .    unixDlOpen,
14b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
14b20 70 65 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44  pen */.    unixD
14b30 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f  lError,        /
14b40 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
14b50 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
14b60 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
14b70 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f  */.    unixDlClo
14b80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  se,        /* xD
14b90 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 75 6e  lClose */.    un
14ba0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
14bb0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
14bc0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 6c 65 65   */.    unixSlee
14bd0 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  p,          /* x
14be0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 75 6e 69  Sleep */.    uni
14bf0 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  xCurrentTime,   
14c00 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
14c10 20 2a 2f 0a 20 20 20 20 75 6e 69 78 47 65 74 4c   */.    unixGetL
14c20 61 73 74 45 72 72 6f 72 20 20 20 20 2f 2a 20 78  astError    /* x
14c30 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
14c40 20 20 7d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e    };.  .  return
14c50 20 26 75 6e 69 78 56 66 73 3b 0a 7d 0a 20 0a 23   &unixVfs;.}. .#
14c60 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58  endif /* OS_UNIX
14c70 20 2a 2f 0a                                       */.