/ Hex Artifact Content
Login

Artifact badd226d71460f0be57f68843ef66a258b0a376c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  tems..**.** $Id:
01c0: 20 6f 73 5f 75 6e 69 78 2e 63 2c 76 20 31 2e 32   os_unix.c,v 1.2
01d0: 30 32 20 32 30 30 38 2f 30 39 2f 32 32 20 31 31  02 2008/09/22 11
01e0: 3a 34 36 3a 33 33 20 64 61 6e 69 65 6c 6b 31 39  :46:33 danielk19
01f0: 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  77 Exp $.*/.#inc
0200: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0210: 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  h".#if SQLITE_OS
0220: 5f 55 4e 49 58 20 20 20 20 20 20 20 20 20 20 20  _UNIX           
0230: 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20     /* This file 
0240: 69 73 20 75 73 65 64 20 6f 6e 20 75 6e 69 78 20  is used on unix 
0250: 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  only */../*.** I
0260: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0270: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
0280: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 73   defined, then s
0290: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
02a0: 20 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 69 6d 70   .** locking imp
02b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 72 65  lementations are
02c0: 20 70 72 6f 76 69 64 65 64 3a 0a 2a 2a 0a 2a 2a   provided:.**.**
02d0: 20 20 20 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 69     * POSIX locki
02e0: 6e 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29  ng (the default)
02f0: 2c 0a 2a 2a 20 20 20 2a 20 4e 6f 20 6c 6f 63 6b  ,.**   * No lock
0300: 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 44 6f 74 2d  ing,.**   * Dot-
0310: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  file locking,.**
0320: 20 20 20 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63     * flock() loc
0330: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 2a 20 41 46 50  king,.**   * AFP
0340: 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f 6e   locking (OSX on
0350: 6c 79 29 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ly)..*/./* #defi
0360: 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
0370: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30  _LOCKING_STYLE 0
0380: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65   */../*.** These
0390: 20 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64   #defines should
03a0: 20 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c   enable >2GB fil
03b0: 65 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73  e support on Pos
03c0: 69 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64  ix if the.** und
03d0: 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
03e0: 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  g system support
03f0: 73 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53  s it.  If the OS
0400: 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20   lacks.** large 
0410: 66 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68  file support, th
0420: 65 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ese should be no
0430: 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67  -ops..**.** Larg
0440: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63  e file support c
0450: 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75  an be disabled u
0460: 73 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54  sing the -DSQLIT
0470: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77  E_DISABLE_LFS sw
0480: 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  itch.** on the c
0490: 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20  ompiler command 
04a0: 6c 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e  line.  This is n
04b0: 65 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20  ecessary if you 
04c0: 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a  are compiling.**
04d0: 20 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63   on a recent mac
04e0: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
04f0: 20 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61   7.2) but you wa
0500: 6e 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20  nt your code to 
0510: 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c  work.** on an ol
0520: 64 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  der machine (ex:
0530: 20 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49   RedHat 6.0).  I
0540: 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e  f you compile on
0550: 20 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77   RedHat 7.2.** w
0560: 69 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69  ithout this opti
0570: 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c  on, LFS is enabl
0580: 65 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73  e.  But LFS does
0590: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
05a0: 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52  e kernel.** in R
05b0: 65 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68  edHat 6.0, so th
05c0: 65 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72  e code won't wor
05d0: 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d  k.  Hence, for m
05e0: 61 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a  aximum binary.**
05f0: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75   portability you
0600: 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53   should omit LFS
0610: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0620: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
0630: 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f  # define _LARGE_
0640: 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20 69  FILE       1.# i
0650: 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53  fndef _FILE_OFFS
0660: 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66 69  ET_BITS.#   defi
0670: 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ne _FILE_OFFSET_
0680: 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66 0a  BITS 64.# endif.
0690: 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45 46  # define _LARGEF
06a0: 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e  ILE_SOURCE 1.#en
06b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64  dif../*.** stand
06c0: 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65  ard include file
06d0: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  s..*/.#include <
06e0: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
06f0: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0700: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h>.#include <fcn
0710: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0720: 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75  unistd.h>.#inclu
0730: 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  de <time.h>.#inc
0740: 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68  lude <sys/time.h
0750: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  >.#include <errn
0760: 6f 2e 68 3e 0a 0a 23 69 66 64 65 66 20 53 51 4c  o.h>..#ifdef SQL
0770: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0780: 4e 47 5f 53 54 59 4c 45 0a 23 69 6e 63 6c 75 64  NG_STYLE.#includ
0790: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
07a0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61  #include <sys/pa
07b0: 72 61 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ram.h>.#include 
07c0: 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65  <sys/mount.h>.#e
07d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
07e0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
07f0: 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  YLE */../*.** If
0800: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
0810: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
0820: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
0830: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
0840: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
0850: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
0860: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
0870: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
0880: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
0890: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
08a0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
08b0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
08c0: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
08d0: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
08e0: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
08f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
0900: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
0910: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
0920: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0930: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
0940: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
0950: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
0960: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
0970: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
0980: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
0990: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46  ./*.** The unixF
09a0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
09b0: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
09c0: 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66  ite3_file specif
09d0: 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a  ic for the unix.
09e0: 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c  ** protability l
09f0: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
0a00: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
0a10: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
0a20: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
0a30: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
0a40: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
0a50: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
0a60: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
0a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0a80: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
0a90: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
0aa0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
0ab0: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
0ac0: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
0ad0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
0ae0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
0af0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
0b00: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
0b10: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
0b20: 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75  ];.#endif.  stru
0b30: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
0b40: 6e 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62  n;    /* Info ab
0b50: 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27  out all open fd'
0b60: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
0b70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  */.  struct lock
0b80: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f  Info *pLock;   /
0b90: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
0ba0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
0bb0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
0bc0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0bd0: 5f 53 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c  _STYLE.  void *l
0be0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
0bf0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
0c00: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
0c10: 74 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  te */.#endif.  i
0c20: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
0c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
0c50: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0c60: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f  ar locktype;   /
0c70: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
0c80: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
0c90: 66 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  fd */.  int dirf
0ca0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0cb0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
0cc0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
0cd0: 65 63 74 6f 72 79 20 2a 2f 0a 23 69 66 20 53 51  ectory */.#if SQ
0ce0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
0cf0: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d10: 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20 22  he thread that "
0d20: 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46  owns" this unixF
0d30: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
0d40: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0d60: 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d   unix errno from
0d70: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0d80: 72 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ror */.};../*.**
0d90: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
0da0: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
0db0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
0dc0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
0dd0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
0de0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
0df0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
0e00: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
0e10: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
0e20: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
0e30: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
0e40: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
0e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0e60: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
0e70: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
0e80: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
0e90: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
0ea0: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
0eb0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
0ec0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
0ed0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
0ee0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
0ef0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
0f00: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
0f10: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
0f20: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
0f30: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
0f40: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
0f50: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
0f60: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
0f70: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
0f80: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
0f90: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
0fa0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
0fb0: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
0fc0: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
0fd0: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
0fe0: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
0ff0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
1000: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
1010: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
1020: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
1030: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
1040: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
1050: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
1060: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
1070: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
1080: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
1090: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
10a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
10b0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
10c0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
10d0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
10e0: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
10f0: 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63  *.** Set or chec
1100: 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74  k the unixFile.t
1110: 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20  id field.  This 
1120: 66 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65  field is set whe
1130: 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  n an unixFile.**
1140: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
1150: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
1160: 74 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e  t uses of the un
1170: 69 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68  ixFile verify th
1180: 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74  at the.** same t
1190: 68 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69  hread is operati
11a0: 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69  ng on the unixFi
11b0: 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74  le.  Some operat
11c0: 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a  ing systems do.*
11d0: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b  * not allow lock
11e0: 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64  s to be overridd
11f0: 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65  en by other thre
1200: 61 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73  ads and that res
1210: 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e  triction.** mean
1220: 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20  s that sqlite3* 
1230: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
1240: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64   cannot be moved
1250: 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64   from one thread
1260: 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  .** to another. 
1270: 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65   This logic make
1280: 73 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f  s sure a user do
1290: 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f  es not try to do
12a0: 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74   that.** by mist
12b0: 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69  ake..**.** Versi
12c0: 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30  on 3.3.1 (2006-0
12d0: 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65  1-15):  unixFile
12e0: 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72   can be moved fr
12f0: 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f  om one thread to
1300: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c  .** another as l
1310: 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75  ong as we are ru
1320: 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65  nning on a syste
1330: 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20  m that supports 
1340: 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72  threads.** overr
1350: 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72  iding each other
1360: 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e  s locks (which n
1370: 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d  ow the most comm
1380: 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20  on behavior).** 
1390: 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61  or if no locks a
13a0: 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68  re held.  But th
13b0: 65 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b  e unixFile.pLock
13c0: 20 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20   field needs to 
13d0: 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64  be.** recomputed
13e0: 20 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79   because its key
13f0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68   includes the th
1400: 72 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68  read-id.  See th
1410: 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77  e .** transferOw
1420: 6e 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69  nership() functi
1430: 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64  on below for add
1440: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1450: 69 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ion.*/.#if SQLIT
1460: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 64  E_THREADSAFE.# d
1470: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
1480: 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64  ID(X)   (X)->tid
1490: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
14a0: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
14b0: 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68  _THREADID(X) (th
14c0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
14d0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20  hOthersLocks==0 
14e0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  && \.           
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
1510: 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  (X)->tid, pthrea
1520: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
1530: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
1540: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
1550: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
1560: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
1570: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
1580: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
1590: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
15a0: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
15b0: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
15c0: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
15d0: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
15e0: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
15f0: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
1600: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
1610: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
1620: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
1630: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
1640: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
1650: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
1660: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
1670: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
1680: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
1690: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
16a0: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
16b0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
16c0: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
16d0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
16e0: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
16f0: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
1700: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
1710: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
1720: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
1730: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
1740: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
1750: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
1760: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
1770: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
1780: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
1790: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
17a0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
17b0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
17c0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17d0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
17e0: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
17f0: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
1800: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
1810: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
1820: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
1830: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
1840: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
1850: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
1860: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
1870: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
1880: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
1890: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
18a0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
18b0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
18c0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
18d0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
18e0: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
18f0: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
1900: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1910: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
1920: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
1930: 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20  .**.** Bummer.  
1940: 49 66 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74  If you ask me, t
1950: 68 69 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20  his is broken.  
1960: 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49  Badly broken.  I
1970: 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  t means.** that 
1980: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
1990: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
19a0: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
19b0: 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f  cess among.** co
19c0: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
19d0: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
19e0: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
19f0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
1a00: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
1a10: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
1a20: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
1a30: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
1a40: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
1a50: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
1a60: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1a70: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1a80: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
1a90: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
1aa0: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
1ab0: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
1ac0: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
1ad0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
1ae0: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
1af0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
1b00: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
1b10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b20: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
1b30: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1b40: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
1b50: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
1b60: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
1b70: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
1b80: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
1b90: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
1ba0: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
1bb0: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
1bc0: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
1bd0: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
1be0: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
1bf0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
1c00: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
1c10: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
1c20: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
1c30: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
1c40: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
1c50: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
1c60: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
1c70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
1c80: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
1c90: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
1ca0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
1cb0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
1cc0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
1cd0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
1ce0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
1cf0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
1d00: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
1d10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1d20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1d30: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
1d40: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
1d50: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1d60: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
1d70: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
1d80: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
1d90: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
1da0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
1db0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
1dc0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
1dd0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
1de0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
1df0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
1e00: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
1e10: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
1e20: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
1e30: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
1e40: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
1e50: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
1e60: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
1e70: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
1e80: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
1e90: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
1ea0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
1eb0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
1ec0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
1ed0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
1ee0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
1ef0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
1f00: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
1f10: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
1f20: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
1f30: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
1f40: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
1f50: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
1f60: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1f70: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
1f80: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
1f90: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
1fa0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
1fb0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
1fc0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
1fd0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
1fe0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
1ff0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
2000: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32  d state..**.** 2
2010: 30 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d  004-Jan-11:.** M
2020: 6f 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f  ore recent disco
2030: 76 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53  veries about POS
2040: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
2050: 73 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a  s.  (The more.**
2060: 20 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65   I discover, the
2070: 20 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20   more I realize 
2080: 74 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69  the a POSIX advi
2090: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  sory locks are.*
20a0: 2a 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e  * an abomination
20b0: 2e 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  .).**.** If you 
20c0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
20d0: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
20e0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
20f0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
2100: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
2110: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
2120: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
2130: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
2140: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
2150: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
2160: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
2170: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
2180: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
2190: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
21a0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
21b0: 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  re.  There is on
21c0: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  e openCnt struct
21d0: 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20  ure.** per open 
21e0: 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 61  inode, which mea
21f0: 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  ns that multiple
2200: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 70 6f   unixFile can po
2210: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
2220: 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65  ** openCnt.  Whe
2230: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2240: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
2250: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
2260: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
2270: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
2280: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
2290: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
22a0: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
22b0: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
22c0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22d0: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
22e0: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
22f0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
2300: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
2310: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
2320: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
2330: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
2340: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2350: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2360: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2370: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2380: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
2390: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
23a0: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
23b0: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
23c0: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
23d0: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
23e0: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
23f0: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
2400: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
2410: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
2420: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
2430: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
2440: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2450: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2460: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2470: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2480: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
2490: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
24a0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
24b0: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
24c0: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
24d0: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
24e0: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
24f0: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
2500: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
2510: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
2520: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
2530: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
2540: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2550: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2560: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2570: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2580: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
2590: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
25a0: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
25b0: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
25c0: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
25d0: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
25e0: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
25f0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
2600: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
2610: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
2620: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
2630: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
2640: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2650: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2660: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2670: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2680: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2690: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
26a0: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
26b0: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
26c0: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
26d0: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
26e0: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
26f0: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
2700: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
2710: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
2720: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
2730: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
2740: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2750: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2760: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2770: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2780: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
2790: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
27a0: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
27b0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
27c0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
27d0: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
27e0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
27f0: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
2800: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
2810: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
2820: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
2830: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
2840: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2850: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2860: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2870: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2880: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
2890: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
28a0: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
28b0: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
28c0: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
28d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
28e0: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
28f0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2900: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2910: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2920: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2930: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2940: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2950: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2960: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2970: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2980: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2990: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
29a0: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
29b0: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
29c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
29d0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
29e0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
29f0: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2a00: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2a10: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2a20: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2a30: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2a40: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2a50: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2a60: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2a70: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2a80: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2a90: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2ab0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2ac0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2ad0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2ae0: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2af0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2b00: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2b10: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2b20: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2b30: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2b40: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2b50: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2b60: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2b70: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2b80: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2b90: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2ba0: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2bb0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2bc0: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2bd0: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2be0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2bf0: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2c00: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2c10: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2c20: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2c30: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2c40: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2c50: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2c60: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54   */.#if SQLITE_T
2c70: 48 52 45 41 44 53 41 46 45 0a 20 20 70 74 68 72  HREADSAFE.  pthr
2c80: 65 61 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20  ead_t tid;   /* 
2c90: 54 68 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72  Thread ID or zer
2ca0: 6f 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e  o if threads can
2cb0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
2cc0: 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ther */.#endif.}
2cd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2ce0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2cf0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2d00: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
2d10: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
2d20: 6f 64 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65  ode on each thre
2d30: 61 64 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ad with a differ
2d40: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20  ent process ID. 
2d50: 20 28 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a   (Threads have.*
2d60: 2a 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  * different proc
2d70: 65 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78  ess IDs on linux
2d80: 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73  , but not on mos
2d90: 74 20 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29  t other unixes.)
2da0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
2db0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
2dc0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
2dd0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
2de0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
2df0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
2e00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2e10: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
2e20: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
2e30: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
2e40: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
2e50: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
2e60: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
2e70: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f  it..*/.struct lo
2e80: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
2e90: 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20  t lockKey key;  
2ea0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
2eb0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  y */.  int cnt; 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ed0: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
2ee0: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
2ef0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  int locktype;   
2f00: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
2f10: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
2f20: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
2f30: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f50: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
2f60: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
2f70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
2f80: 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 2c 20 2a 70  kInfo *pNext, *p
2f90: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20  Prev;   /* List 
2fa0: 6f 66 20 61 6c 6c 20 6c 6f 63 6b 49 6e 66 6f 20  of all lockInfo 
2fb0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
2fc0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2fd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2fe0: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
2ff0: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
3000: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
3010: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70 65  a particular ope
3020: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67  nCnt structure g
3030: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20  iven its inode. 
3040: 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20   This.** is the 
3050: 73 61 6d 65 20 61 73 20 74 68 65 20 6c 6f 63 6b  same as the lock
3060: 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74 20  Key except that 
3070: 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69 73  the thread ID is
3080: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72   omitted..*/.str
3090: 75 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a 20 20  uct openKey {.  
30a0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20  dev_t dev;   /* 
30b0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
30c0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
30d0: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
30e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
30f0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3100: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3110: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
3120: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
3130: 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20 73  * inode.  This s
3140: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
3150: 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62  rack of the numb
3160: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74  er of locks on t
3170: 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49  hat.** inode.  I
3180: 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74 74  f a close is att
3190: 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20 61  empted against a
31a0: 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73 20  n inode that is 
31b0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73  holding.** locks
31c0: 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20 64  , the close is d
31d0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
31e0: 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62 79  l locks clear by
31f0: 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66   adding the.** f
3200: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
3210: 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20 74  o be closed to t
3220: 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e  he pending list.
3230: 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 43  .*/.struct openC
3240: 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20 6f 70  nt {.  struct op
3250: 65 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f 2a 20  enKey key;   /* 
3260: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
3270: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3290: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
32a0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
32b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
32c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
32d0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
32e0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20  nding locks */. 
32f0: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20   int nPending;  
3300: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3310: 20 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73   of pending clos
3320: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  e() operations *
3330: 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e  /.  int *aPendin
3340: 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c  g;        /* Mal
3350: 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c 64  loced space hold
3360: 69 6e 67 20 66 64 27 73 20 61 77 61 69 74 69 6e  ing fd's awaitin
3370: 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 20  g a close() */. 
3380: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
3390: 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20  *pNext, *pPrev; 
33a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
33b0: 20 6f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 73   openCnt objects
33c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69   */.};../*.** Li
33d0: 73 74 20 6f 66 20 61 6c 6c 20 6c 6f 63 6b 49 6e  st of all lockIn
33e0: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 6f  fo and openCnt o
33f0: 62 6a 65 63 74 73 2e 20 20 54 68 69 73 20 75 73  bjects.  This us
3400: 65 64 20 74 6f 20 62 65 20 61 20 68 61 73 68 0a  ed to be a hash.
3410: 2a 2a 20 74 61 62 6c 65 2e 20 20 42 75 74 20 74  ** table.  But t
3420: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  he number of obj
3430: 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20 6d  ects is rarely m
3440: 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65 6e  ore than a dozen
3450: 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65 78   and.** never ex
3460: 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f 75  ceeds a few thou
3470: 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b 75  sand.  And looku
3480: 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63 72  p is not on a cr
3490: 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20 6f  itical.** path o
34a0: 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65  o a simple linke
34b0: 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66 66  d list will suff
34c0: 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ice..*/.static s
34d0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
34e0: 6c 6f 63 6b 4c 69 73 74 20 3d 20 30 3b 0a 73 74  lockList = 0;.st
34f0: 61 74 69 63 20 73 74 72 75 63 74 20 6f 70 65 6e  atic struct open
3500: 43 6e 74 20 2a 6f 70 65 6e 4c 69 73 74 20 3d 20  Cnt *openList = 
3510: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f  0;../*.** The lo
3520: 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61 72 65  cking styles are
3530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3540: 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 66   the different f
3550: 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
3560: 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 70 70  apabilities supp
3570: 6f 72 74 65 64 20 62 79 20 64 69 66 66 65 72 65  orted by differe
3580: 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  nt file systems.
3590: 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c    .**.** POSIX l
35a0: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66 75 6c  ocking style ful
35b0: 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68 61 72  ly supports shar
35c0: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
35d0: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
35e0: 73 20 0a 2a 2a 20 41 46 50 20 6c 6f 63 6b 69 6e  s .** AFP lockin
35f0: 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  g only supports 
3600: 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
3610: 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c  ange locks.** FL
3620: 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  OCK only support
3630: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d  s a single file-
3640: 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69 76 65  global exclusive
3650: 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b   lock.** DOTLOCK
3660: 20 69 73 6e 27 74 20 61 20 74 72 75 65 20 6c 6f   isn't a true lo
3670: 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69 74 20  cking style, it 
3680: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 75 73  refers to the us
3690: 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c 0a 2a  e of a special.*
36a0: 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64 20 74  *   file named t
36b0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64  he same as the d
36c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
36d0: 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65  h a '.lock' exte
36e0: 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20  nsion, this.**  
36f0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
3700: 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61  file systems tha
3710: 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61  t do not offer a
3720: 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69 6c 65  ny reliable file
3730: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c   locking.** NO l
3740: 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74 68 61  ocking means tha
3750: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
3760: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3770: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3780: 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d  d for.**   read-
3790: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
37a0: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55  s currently.** U
37b0: 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61 6e 73  NSUPPORTED means
37c0: 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67   that no locking
37d0: 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74   will be attempt
37e0: 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  ed, this is only
37f0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66   used for.**   f
3800: 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61 74  ile systems that
3810: 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   are known to be
3820: 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a   unsupported.*/.
3830: 23 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f  #define LOCKING_
3840: 53 54 59 4c 45 5f 50 4f 53 49 58 20 20 20 20 20  STYLE_POSIX     
3850: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4c 4f 43     1.#define LOC
3860: 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20  KING_STYLE_NONE 
3870: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
3880: 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f  e LOCKING_STYLE_
3890: 44 4f 54 46 49 4c 45 20 20 20 20 20 20 33 0a 23  DOTFILE      3.#
38a0: 64 65 66 69 6e 65 20 4c 4f 43 4b 49 4e 47 5f 53  define LOCKING_S
38b0: 54 59 4c 45 5f 46 4c 4f 43 4b 20 20 20 20 20 20  TYLE_FLOCK      
38c0: 20 20 34 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b    4.#define LOCK
38d0: 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 20 20  ING_STYLE_AFP   
38e0: 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20         5../*.** 
38f0: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
3900: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
3910: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
3920: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
3930: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
3940: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
3950: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
3960: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
3970: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
3980: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
3990: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
39a0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
39b0: 53 59 29 29 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  SY))../*.** Help
39c0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
39d0: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
39e0: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
39f0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
3a00: 63 20 76 6f 69 64 20 65 6e 74 65 72 4d 75 74 65  c void enterMute
3a10: 78 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  x(){.  sqlite3_m
3a20: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
3a30: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
3a40: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
3a50: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
3a60: 74 69 63 20 76 6f 69 64 20 6c 65 61 76 65 4d 75  tic void leaveMu
3a70: 74 65 78 28 29 7b 0a 20 20 73 71 6c 69 74 65 33  tex(){.  sqlite3
3a80: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
3a90: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
3aa0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
3ab0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a  IC_MASTER));.}..
3ac0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
3ad0: 44 53 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DSAFE./*.** This
3ae0: 20 76 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64   variable record
3af0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
3b00: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
3b10: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3b20: 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  s.** locks..**.*
3b30: 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68  *    0:  No.  Th
3b40: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
3b50: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3b60: 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31  s locks..**    1
3b70: 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73  :  Yes.  Threads
3b80: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
3b90: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
3ba0: 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f  .**   -1:  We do
3bb0: 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a  n't know yet..**
3bc0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  .** On some syst
3bd0: 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20  ems, we know at 
3be0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20  compile-time if 
3bf0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
3c00: 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68  ride each.** oth
3c10: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74  ers locks.  On t
3c20: 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68  hose systems, th
3c30: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3c40: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61  OVERRIDE_LOCK ma
3c50: 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  cro.** will be s
3c60: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
3c70: 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74  .  On other syst
3c80: 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ems, we have to 
3c90: 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74  check at.** runt
3ca0: 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c  ime.  On these l
3cb0: 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53  atter systems, S
3cc0: 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLTIE_THREAD_OVE
3cd0: 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a  RRIDE_LOCK is.**
3ce0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
3cf0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
3d00: 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c  normally has fil
3d10: 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42  e scope only.  B
3d20: 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ut during testin
3d30: 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74  g, we make.** it
3d40: 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61   a global so tha
3d50: 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20  t the test code 
3d60: 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76  can change its v
3d70: 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  alue in order to
3d80: 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20   verify.** that 
3d90: 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20  the right stuff 
3da0: 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65  happens in eithe
3db0: 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  r case..*/.#ifnd
3dc0: 65 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ef SQLITE_THREAD
3dd0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23  _OVERRIDE_LOCK.#
3de0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
3df0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3e00: 4f 43 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69  OCK -1.#endif.#i
3e10: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3e20: 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72  .int threadsOver
3e30: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
3e40: 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52  cks = SQLITE_THR
3e50: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3e60: 4b 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  K;.#else.static 
3e70: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
3e80: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
3e90: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
3ea0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3eb0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
3ec0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  This structure h
3ed0: 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  olds information
3ee0: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64   passed into ind
3ef0: 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20  ividual test.** 
3f00: 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74  threads by the t
3f10: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
3f20: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
3f30: 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68  ne..*/.struct th
3f40: 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20  readTestData {. 
3f50: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3f70: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
3f80: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
3f90: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ock;     /* The 
3fa0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
3fb0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  n */.  int resul
3fc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3fd0: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c   Result of the l
3fe0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
3ff0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53   */.};..#ifdef S
4000: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4010: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
4020: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
4030: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
4040: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
4050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4060: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
4070: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
4080: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
4090: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
40a0: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
40b0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
40c0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
40d0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
40e0: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
40f0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
4100: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
4110: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
4120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
4130: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
4140: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
4150: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
4160: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
4170: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
4180: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
4190: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
41a0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
41b0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
41c0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
41d0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
41e0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
41f0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  se{.    s = fcnt
4200: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
4210: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4220: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
4230: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
4240: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
4250: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
4260: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
4270: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
4280: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4290: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
42a0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
42b0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
42c0: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
42d0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
42e0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
42f0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
4300: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4310: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
4320: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
4330: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
4340: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
4350: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
4360: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
4370: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4380: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
4390: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
43a0: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
43b0: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
43c0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
43d0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
43e0: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
43f0: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
4400: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
4410: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
4420: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
4430: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
4440: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
4450: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4460: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
4470: 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
4480: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
4490: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
44a0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
44b0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
44c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
44d0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
44e0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
44f0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
4500: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
4510: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4520: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4530: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
4540: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
4550: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
4560: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4570: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
4580: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
4590: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
45a0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
45b0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
45c0: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
45d0: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
45e0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
45f0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
4600: 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f  #define fcntl lo
4610: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
4620: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
4630: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ACE */../*.** Th
4640: 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  e testThreadLock
4650: 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f  ingBehavior() ro
4660: 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74  utine launches t
4670: 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74  wo separate.** t
4680: 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72  hreads on this r
4690: 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f  outine.  This ro
46a0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
46b0: 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a  o lock a file.**
46c0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
46d0: 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73   returns.  The s
46e0: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
46f0: 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70  e of that attemp
4700: 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20  t.** allows the 
4710: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4720: 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63  gBehavior() proc
4730: 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69  edure to determi
4740: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
4750: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
4760: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4770: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  thers locks..*/.
4780: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72  static void *thr
4790: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76  eadLockingTest(v
47a0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74  oid *pArg){.  st
47b0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
47c0: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74  ata *pData = (st
47d0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
47e0: 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61  ata*)pArg;.  pDa
47f0: 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e  ta->result = fcn
4800: 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f  tl(pData->fd, F_
4810: 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c  SETLK, &pData->l
4820: 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ock);.  return p
4830: 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
4840: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74 74  is procedure att
4850: 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
4860: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
4870: 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e  t threads.** can
4880: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4890: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
48a0: 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68   sets the .** th
48b0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
48c0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72  hOthersLocks var
48d0: 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74  iable appropriat
48e0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
48f0: 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f  oid testThreadLo
4900: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e  ckingBehavior(in
4910: 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e  t fd_orig){.  in
4920: 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74  t fd;.  struct t
4930: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 5b  hreadTestData d[
4940: 32 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  2];.  pthread_t 
4950: 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75  t[2];..  fd = du
4960: 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66  p(fd_orig);.  if
4970: 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b  ( fd<0 ) return;
4980: 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20  .  memset(d, 0, 
4990: 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b  sizeof(d));.  d[
49a0: 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b  0].fd = fd;.  d[
49b0: 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d  0].lock.l_type =
49c0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d   F_RDLCK;.  d[0]
49d0: 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  .lock.l_len = 1;
49e0: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73  .  d[0].lock.l_s
49f0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d  tart = 0;.  d[0]
4a00: 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d  .lock.l_whence =
4a10: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31   SEEK_SET;.  d[1
4a20: 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d  ] = d[0];.  d[1]
4a30: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4a40: 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61  _WRLCK;.  pthrea
4a50: 64 5f 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20  d_create(&t[0], 
4a60: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
4a70: 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20  Test, &d[0]);.  
4a80: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26  pthread_create(&
4a90: 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c  t[1], 0, threadL
4aa0: 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31  ockingTest, &d[1
4ab0: 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f  ]);.  pthread_jo
4ac0: 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70  in(t[0], 0);.  p
4ad0: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d  thread_join(t[1]
4ae0: 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64  , 0);.  close(fd
4af0: 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72  );.  threadsOver
4b00: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
4b10: 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75  cks =  d[0].resu
4b20: 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65  lt==0 && d[1].re
4b30: 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  sult==0;.}.#endi
4b40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
4b50: 41 44 53 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ADSAFE */../*.**
4b60: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49   Release a lockI
4b70: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
4b80: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4b90: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4ba0: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4bb0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
4bc0: 49 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b  Info(struct lock
4bd0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  Info *pLock){.  
4be0: 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  if( pLock ){.   
4bf0: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a   pLock->nRef--;.
4c00: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e      if( pLock->n
4c10: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
4c20: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76  if( pLock->pPrev
4c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
4c40: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76  rt( pLock->pPrev
4c50: 2d 3e 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29  ->pNext==pLock )
4c60: 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  ;.        pLock-
4c70: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
4c80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
4c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ca0: 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c     assert( lockL
4cb0: 69 73 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20  ist==pLock );.  
4cc0: 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d        lockList =
4cd0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
4ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4cf0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b   pLock->pNext ){
4d00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4d10: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70   pLock->pNext->p
4d20: 50 72 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  Prev==pLock );. 
4d30: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e         pLock->pN
4d40: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f  ext->pPrev = pLo
4d50: 63 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  ck->pPrev;.     
4d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4d70: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
4d80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4d90: 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43   Release a openC
4da0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
4db0: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
4dc0: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
4dd0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
4de0: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
4df0: 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  nt(struct openCn
4e00: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66 28  t *pOpen){.  if(
4e10: 20 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f   pOpen ){.    pO
4e20: 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  pen->nRef--;.   
4e30: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66   if( pOpen->nRef
4e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4e50: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b   pOpen->pPrev ){
4e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4e70: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
4e80: 4e 65 78 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20  Next==pOpen );. 
4e90: 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50         pOpen->pP
4ea0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70  rev->pNext = pOp
4eb0: 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  en->pNext;.     
4ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4ed0: 61 73 73 65 72 74 28 20 6f 70 65 6e 4c 69 73 74  assert( openList
4ee0: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
4ef0: 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f     openList = pO
4f00: 70 65 6e 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pen->pNext;.    
4f10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f    }.      if( pO
4f20: 70 65 6e 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  pen->pNext ){.  
4f30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4f40: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
4f50: 76 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  v==pOpen );.    
4f60: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74      pOpen->pNext
4f70: 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d  ->pPrev = pOpen-
4f80: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
4f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4fa0: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
4fb0: 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ng);.      sqlit
4fc0: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
4fd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
4fe0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4ff0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
5000: 2f 2a 0a 2a 2a 20 54 65 73 74 73 20 61 20 62 79  /*.** Tests a by
5010: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 69 6e 67  te-range locking
5020: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   query to see if
5030: 20 62 79 74 65 20 72 61 6e 67 65 20 6c 6f 63 6b   byte range lock
5040: 73 20 61 72 65 20 0a 2a 2a 20 73 75 70 70 6f 72  s are .** suppor
5050: 74 65 64 2c 20 69 66 20 6e 6f 74 20 77 65 20 66  ted, if not we f
5060: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 64 6f 74 6c  all back to dotl
5070: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2e  ockLockingStyle.
5080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
5090: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
50a0: 69 6e 74 20 66 64 29 7b 0a 20 20 73 74 72 75 63  int fd){.  struc
50b0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
50c0: 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 62 79 74  ;..  /* Test byt
50d0: 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
50e0: 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
50f0: 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
5100: 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
5110: 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
5120: 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
5130: 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
5140: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
5150: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
5160: 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
5170: 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
5180: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
5190: 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
51a0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
51b0: 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 66 64 2c  .  if( fcntl(fd,
51c0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
51d0: 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
51e0: 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f   return LOCKING_
51f0: 53 54 59 4c 45 5f 50 4f 53 49 58 3b 0a 20 20 7d  STYLE_POSIX;.  }
5200: 0a 20 20 0a 20 20 2f 2a 20 54 65 73 74 69 6e 67  .  .  /* Testing
5210: 20 66 6f 72 20 66 6c 6f 63 6b 28 29 20 63 61 6e   for flock() can
5220: 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73 69   give false posi
5230: 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69 66  tives.  So if if
5240: 20 74 68 65 20 61 62 6f 76 65 20 0a 20 20 2a 2a   the above .  **
5250: 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
5260: 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  n we fall back t
5270: 6f 20 75 73 69 6e 67 20 64 6f 74 2d 66 69 6c 65  o using dot-file
5280: 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a   style locking..
5290: 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20    */  .  return 
52a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f  LOCKING_STYLE_DO
52b0: 54 46 49 4c 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TFILE;.}.#endif.
52c0: 0a 2f 2a 20 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ./* .** If SQLIT
52d0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
52e0: 5f 53 54 59 4c 45 20 69 73 20 64 65 66 69 6e 65  _STYLE is define
52f0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
5300: 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20 0a 2a   Examines the .*
5310: 2a 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65  * f_fstypename e
5320: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74  ntry in the stat
5330: 66 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20  fs structure as 
5340: 72 65 74 75 72 6e 65 64 20 62 79 20 73 74 61 74  returned by stat
5350: 28 29 20 66 6f 72 20 0a 2a 2a 20 74 68 65 20 66  () for .** the f
5360: 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69  ile system hosti
5370: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
5380: 66 69 6c 65 20 61 6e 64 20 73 65 6c 65 63 74 73  file and selects
5390: 20 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74    the appropriat
53a0: 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 79  e.** locking sty
53b0: 6c 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20  le based on its 
53c0: 76 61 6c 75 65 2e 20 20 54 68 65 73 65 20 76 61  value.  These va
53d0: 6c 75 65 73 20 61 6e 64 20 61 73 73 69 67 6e 6d  lues and assignm
53e0: 65 6e 74 73 20 61 72 65 20 0a 2a 2a 20 62 61 73  ents are .** bas
53f0: 65 64 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58  ed on Darwin/OSX
5400: 20 62 65 68 61 76 69 6f 72 20 61 6e 64 20 68 61   behavior and ha
5410: 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 68 6f 72  ve not been thor
5420: 6f 75 67 68 6c 79 20 74 65 73 74 65 64 20 6f 6e  oughly tested on
5430: 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65   .** other syste
5440: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ms..**.** If SQL
5450: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
5460: 4e 47 5f 53 54 59 4c 45 20 69 73 20 6e 6f 74 20  NG_STYLE is not 
5470: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
5480: 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 0a 2a 2a  nction always.**
5490: 20 72 65 74 75 72 6e 73 20 4c 4f 43 4b 49 4e 47   returns LOCKING
54a0: 5f 53 54 59 4c 45 5f 50 4f 53 49 58 2e 0a 2a 2f  _STYLE_POSIX..*/
54b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 74 65  .static int dete
54c0: 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a  ctLockingStyle(.
54d0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
54e0: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs,.  const cha
54f0: 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20 20  r *filePath, .  
5500: 69 6e 74 20 66 64 0a 29 7b 0a 23 69 66 64 65 66  int fd.){.#ifdef
5510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
5520: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
5530: 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
5540: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5550: 7a 46 69 6c 65 73 79 73 74 65 6d 3b 0a 20 20 20  zFilesystem;.   
5560: 20 69 6e 74 20 65 4c 6f 63 6b 69 6e 67 53 74 79   int eLockingSty
5570: 6c 65 3b 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d  le;.  } aMap[] =
5580: 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
5590: 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45     LOCKING_STYLE
55a0: 5f 50 4f 53 49 58 20 7d 2c 0a 20 20 20 20 7b 20  _POSIX },.    { 
55b0: 22 75 66 73 22 2c 20 20 20 20 4c 4f 43 4b 49 4e  "ufs",    LOCKIN
55c0: 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 20 7d 2c  G_STYLE_POSIX },
55d0: 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
55e0: 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41   LOCKING_STYLE_A
55f0: 46 50 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  FP },.#ifdef SQL
5600: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 46 50 5f 4c  ITE_ENABLE_AFP_L
5610: 4f 43 4b 49 4e 47 5f 53 4d 42 0a 20 20 20 20 7b  OCKING_SMB.    {
5620: 20 22 73 6d 62 66 73 22 2c 20 20 4c 4f 43 4b 49   "smbfs",  LOCKI
5630: 4e 47 5f 53 54 59 4c 45 5f 41 46 50 20 7d 2c 0a  NG_STYLE_AFP },.
5640: 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73 6d 62  #else.    { "smb
5650: 66 73 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54  fs",  LOCKING_ST
5660: 59 4c 45 5f 46 4c 4f 43 4b 20 7d 2c 0a 23 65 6e  YLE_FLOCK },.#en
5670: 64 69 66 0a 20 20 20 20 7b 20 22 6d 73 64 6f 73  dif.    { "msdos
5680: 22 2c 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ",  LOCKING_STYL
5690: 45 5f 44 4f 54 46 49 4c 45 20 7d 2c 0a 20 20 20  E_DOTFILE },.   
56a0: 20 7b 20 22 77 65 62 64 61 76 22 2c 20 4c 4f 43   { "webdav", LOC
56b0: 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 20  KING_STYLE_NONE 
56c0: 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
56d0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
56e0: 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
56f0: 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
5700: 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 72 65  lePath ){.    re
5710: 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  turn LOCKING_STY
5720: 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  LE_NONE;.  }.  i
5730: 66 28 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  f( pVfs->pAppDat
5740: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
5750: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
5760: 54 28 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  T(pVfs->pAppData
5770: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
5780: 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
5790: 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
57a0: 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
57b0: 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
57c0: 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
57d0: 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  turn LOCKING_STY
57e0: 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  LE_NONE;.    }. 
57f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
5800: 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
5810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5820: 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
5830: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
5840: 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
5850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5860: 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 65  return aMap[i].e
5870: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5890: 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
58a0: 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
58b0: 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
58c0: 73 22 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  s". */.  return 
58d0: 74 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  testLockingStyle
58e0: 28 66 64 29 3b 20 20 0a 23 65 6e 64 69 66 0a 20  (fd);  .#endif. 
58f0: 20 72 65 74 75 72 6e 20 4c 4f 43 4b 49 4e 47 5f   return LOCKING_
5900: 53 54 59 4c 45 5f 50 4f 53 49 58 3b 0a 7d 0a 0a  STYLE_POSIX;.}..
5910: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
5920: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
5930: 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  ocate lockInfo a
5940: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
5950: 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65  tures that.** de
5960: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
5970: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
5980: 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69  reate new ones i
5990: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
59a0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
59b0: 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  es might be unin
59c0: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
59d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
59e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
59f0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
5a00: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
5a10: 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  int findLockInfo
5a20: 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20  (.  int fd,     
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
5a50: 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20  criptor used in 
5a60: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  the key */.  str
5a70: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70  uct lockInfo **p
5a80: 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74  pLock,    /* Ret
5a90: 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f  urn the lockInfo
5aa0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
5ab0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e  */.  struct open
5ac0: 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20  Cnt **ppOpen    
5ad0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
5ae0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
5af0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5b00: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
5b10: 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20  lockKey key1;.  
5b20: 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b  struct openKey k
5b30: 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74  ey2;.  struct st
5b40: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74  at statbuf;.  st
5b50: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
5b60: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f  Lock;.  struct o
5b70: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20  penCnt *pOpen;. 
5b80: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
5b90: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
5ba0: 20 72 63 21 3d 30 20 29 7b 0a 23 69 66 64 65 66   rc!=0 ){.#ifdef
5bb0: 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69   EOVERFLOW.    i
5bc0: 66 28 20 65 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  f( errno==EOVERF
5bd0: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
5be0: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
5bf0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
5c00: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
5c10: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
5c20: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
5c30: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
5c40: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
5c50: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
5c60: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
5c70: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
5c80: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
5c90: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
5ca0: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
5cb0: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
5cc0: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
5cd0: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
5ce0: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
5cf0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
5d00: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
5d10: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
5d20: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
5d30: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
5d40: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
5d50: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
5d60: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
5d70: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
5d80: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
5d90: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
5da0: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
5db0: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
5dc0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
5dd0: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
5de0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
5df0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
5e00: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
5e10: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
5e20: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
5e30: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
5e40: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
5e50: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
5e60: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
5e70: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
5e80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 72 69 74  e==0 ){.    writ
5e90: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a 20  e(fd, "S", 1);. 
5ea0: 20 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64     rc = fstat(fd
5eb0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
5ec0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
5ed0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5ee0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
5ef0: 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65   }..  memset(&ke
5f00: 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  y1, 0, sizeof(ke
5f10: 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76  y1));.  key1.dev
5f20: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
5f30: 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  v;.  key1.ino = 
5f40: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
5f50: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
5f60: 44 53 41 46 45 0a 20 20 69 66 28 20 74 68 72 65  DSAFE.  if( thre
5f70: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
5f80: 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a  thersLocks<0 ){.
5f90: 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f      testThreadLo
5fa0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64  ckingBehavior(fd
5fb0: 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69  );.  }.  key1.ti
5fc0: 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72  d = threadsOverr
5fd0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
5fe0: 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64  ks ? 0 : pthread
5ff0: 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a  _self();.#endif.
6000: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20    memset(&key2, 
6010: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29  0, sizeof(key2))
6020: 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73  ;.  key2.dev = s
6030: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
6040: 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74   key2.ino = stat
6050: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c  buf.st_ino;.  pL
6060: 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a  ock = lockList;.
6070: 20 20 77 68 69 6c 65 28 20 70 4c 6f 63 6b 20 26    while( pLock &
6080: 26 20 6d 65 6d 63 6d 70 28 26 6b 65 79 31 2c 20  & memcmp(&key1, 
6090: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
60a0: 65 6f 66 28 6b 65 79 31 29 29 20 29 7b 0a 20 20  eof(key1)) ){.  
60b0: 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 2d    pLock = pLock-
60c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
60d0: 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ( pLock==0 ){.  
60e0: 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65    pLock = sqlite
60f0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
6100: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
6110: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
6120: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6130: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
6140: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
6150: 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  kinfo;.    }.   
6160: 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65   pLock->key = ke
6170: 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  y1;.    pLock->n
6180: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  Ref = 1;.    pLo
6190: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ck->cnt = 0;.   
61a0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
61b0: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = 0;.    pLock-
61c0: 3e 70 4e 65 78 74 20 3d 20 6c 6f 63 6b 4c 69 73  >pNext = lockLis
61d0: 74 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50  t;.    pLock->pP
61e0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
61f0: 20 6c 6f 63 6b 4c 69 73 74 20 29 20 6c 6f 63 6b   lockList ) lock
6200: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c  List->pPrev = pL
6210: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 4c 69 73  ock;.    lockLis
6220: 74 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  t = pLock;.  }el
6230: 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  se{.    pLock->n
6240: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
6250: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
6260: 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b  if( ppOpen!=0 ){
6270: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f 70 65  .    pOpen = ope
6280: 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  nList;.    while
6290: 28 20 70 4f 70 65 6e 20 26 26 20 6d 65 6d 63 6d  ( pOpen && memcm
62a0: 70 28 26 6b 65 79 32 2c 20 26 70 4f 70 65 6e 2d  p(&key2, &pOpen-
62b0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
62c0: 32 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  2)) ){.      pOp
62d0: 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78  en = pOpen->pNex
62e0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
62f0: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
6300: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
6310: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
6320: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
6330: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
6340: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
6350: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
6360: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
6370: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6380: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
6390: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
63a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
63b0: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
63c0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
63d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
63e0: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
63f0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
6400: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
6410: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
6420: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
6430: 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73  >pNext = openLis
6440: 74 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  t;.      pOpen->
6450: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
6460: 20 69 66 28 20 6f 70 65 6e 4c 69 73 74 20 29 20   if( openList ) 
6470: 6f 70 65 6e 4c 69 73 74 2d 3e 70 50 72 65 76 20  openList->pPrev 
6480: 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 20 20 6f  = pOpen;.      o
6490: 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 3b  penList = pOpen;
64a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
64b0: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b    pOpen->nRef++;
64c0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70  .    }.    *ppOp
64d0: 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a  en = pOpen;.  }.
64e0: 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e  .exit_findlockin
64f0: 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  fo:.  return rc;
6500: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6510: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65  E_DEBUG./*.** He
6520: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
6530: 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74  r printing out t
6540: 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  race information
6550: 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a   from debugging.
6560: 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69  ** binaries. Thi
6570: 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
6580: 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69  ring represetati
6590: 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  on of the suppli
65a0: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f  ed.** integer lo
65b0: 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ck-type..*/.stat
65c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  ic const char *l
65d0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20  ocktypeName(int 
65e0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69  locktype){.  swi
65f0: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
6600: 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a  .  case NO_LOCK:
6610: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
6620: 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f    case SHARED_LO
6630: 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52  CK: return "SHAR
6640: 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53 45  ED";.  case RESE
6650: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
6660: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
6670: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
6680: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
6690: 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43 4c  NG";.  case EXCL
66a0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
66b0: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
66c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
66d0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
66e0: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
66f0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 64  currently in a d
6700: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
6710: 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64 20  than the thread 
6720: 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78  that the.** unix
6730: 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62 65  File argument be
6740: 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20 74  longs to, then t
6750: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
6760: 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  p of the unixFil
6770: 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68 65  e.** over to the
6780: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
6790: 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c  .**.** A unixFil
67a0: 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20  e is only owned 
67b0: 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20 73  by a thread on s
67c0: 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e 65  ystems where one
67d0: 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75 6e   thread is.** un
67e0: 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64 65  able to override
67f0: 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20 62   locks created b
6800: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
6810: 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20 69  read.  RedHat9 i
6820: 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65 20  s.** an example 
6830: 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  of such a system
6840: 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69  ..**.** Ownershi
6850: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e  p transfer is on
6860: 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68  ly allowed if th
6870: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75  e unixFile is cu
6880: 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
6890: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78  ..** If the unix
68a0: 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61  File is locked a
68b0: 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20  nd an ownership 
68c0: 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72  is wrong, then r
68d0: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
68e0: 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f  MISUSE.  SQLITE_
68f0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
6900: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
6910: 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ks..*/.#if SQLIT
6920: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73 74 61  E_THREADSAFE.sta
6930: 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72  tic int transfer
6940: 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69  Ownership(unixFi
6950: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
6960: 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f  t rc;.  pthread_
6970: 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74  t hSelf;.  if( t
6980: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
6990: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b  chOthersLocks ){
69a0: 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69  .    /* Ownershi
69b0: 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20  p transfers not 
69c0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73  needed on this s
69d0: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74  ystem */.    ret
69e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
69f0: 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68   }.  hSelf = pth
6a00: 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69  read_self();.  i
6a10: 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c  f( pthread_equal
6a20: 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65  (pFile->tid, hSe
6a30: 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  lf) ){.    /* We
6a40: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
6a50: 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f  e same thread */
6a60: 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e  .    OSTRACE1("N
6a70: 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65  o-transfer, same
6a80: 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20   thread\n");.   
6a90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6aa0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  K;.  }.  if( pFi
6ab0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
6ac0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
6ad0: 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65  We cannot change
6ae0: 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65   ownership while
6af0: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
6b00: 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72  a lock! */.    r
6b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6b20: 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  USE;.  }.  OSTRA
6b30: 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77  CE4("Transfer ow
6b40: 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66 72  nership of %d fr
6b50: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
6b70: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64  e->h, pFile->tid
6b80: 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c  , hSelf);.  pFil
6b90: 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a  e->tid = hSelf;.
6ba0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f    if (pFile->pLo
6bb0: 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  ck != NULL) {.  
6bc0: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
6bd0: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
6be0: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
6bf0: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c  ckInfo(pFile->h,
6c00: 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20   &pFile->pLock, 
6c10: 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35  0);.    OSTRACE5
6c20: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20  ("LOCK    %d is 
6c30: 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22  now %s(%s,%d)\n"
6c40: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
6c50: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
6c60: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
6c70: 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ype),.          
6c80: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
6c90: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
6ca0: 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c  type), pFile->pL
6cb0: 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72  ock->cnt);.    r
6cc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
6cd0: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
6ce0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
6cf0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73  .#else.  /* On s
6d00: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62  ingle-threaded b
6d10: 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70  uilds, ownership
6d20: 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e   transfer is a n
6d30: 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65  o-op */.# define
6d40: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
6d50: 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ip(X) SQLITE_OK.
6d60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
6d70: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
6d80: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
6d90: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
6da0: 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
6db0: 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
6dc0: 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
6dd0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
6de0: 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
6df0: 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
6e00: 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
6e10: 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
6e20: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
6e30: 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
6e40: 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
6e50: 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
6e60: 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
6e70: 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
6e80: 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
6e90: 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
6ea0: 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
6eb0: 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79  USE_PREAD.** any
6ec0: 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
6ed0: 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
6ee0: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
6ef0: 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
6f00: 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
6f10: 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
6f20: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
6f30: 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
6f40: 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
6f50: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
6f60: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
6f70: 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
6f80: 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
6f90: 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
6fa0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
6fb0: 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
6fc0: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
6fd0: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
6fe0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6ff0: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
7000: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
7010: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
7020: 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e  t = pread64(id->
7030: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
7040: 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
7050: 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
7060: 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  -1 );.#else.  ne
7070: 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
7080: 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
7090: 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75  EEK_SET);.  Simu
70a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
70b0: 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66  Offset-- );.  if
70c0: 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
70d0: 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  set ){.    retur
70e0: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
70f0: 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
7100: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
7110: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
7120: 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20  OSTRACE5("READ  
7130: 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
7140: 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
7150: 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
7160: 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
7170: 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f  return got;.}../
7180: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
7190: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
71a0: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
71b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
71c0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
71d0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
71e0: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
71f0: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
7200: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
7210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
7220: 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
7230: 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
7240: 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
7250: 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
7260: 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
7270: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73    int got;.  ass
7280: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74  ert( id );.  got
7290: 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28   = seekAndRead((
72a0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66  unixFile*)id, of
72b0: 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
72c0: 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
72d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
72e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
72f0: 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
7300: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7310: 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
7320: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
7330: 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
7340: 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
7350: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
7360: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
7370: 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
7380: 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
7390: 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
73a0: 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
73b0: 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
73c0: 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
73d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
73e0: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
73f0: 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
7400: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
7410: 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28  nt seekAndWrite(
7420: 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36  unixFile *id, i6
7430: 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20  4 offset, const 
7440: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
7450: 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
7460: 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
7470: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
7480: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
7490: 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20  _PREAD).  got = 
74a0: 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
74b0: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
74c0: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
74d0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
74e0: 6f 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64  ot = pwrite64(id
74f0: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
7500: 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20  offset);.#else. 
7510: 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
7520: 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
7530: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69  , SEEK_SET);.  i
7540: 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
7550: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
7560: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
7570: 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
7580: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
7590: 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
75a0: 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54    OSTRACE5("WRIT
75b0: 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
75c0: 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
75d0: 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
75e0: 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
75f0: 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
7600: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
7610: 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
7620: 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
7630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
7640: 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
7650: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
7660: 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
7670: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7680: 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
7690: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
76a0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
76b0: 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
76c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
76d0: 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e   offset .){.  in
76e0: 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
76f0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
7700: 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
7710: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
7720: 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
7730: 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46 69 6c  ndWrite((unixFil
7740: 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70  e*)id, offset, p
7750: 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
7760: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
7770: 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
7780: 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
7790: 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
77a0: 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
77b0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
77c0: 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
77d0: 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
77e0: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
77f0: 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
7800: 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  ));.  if( amt>0 
7810: 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
7820: 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <0 ){.      retu
7830: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
7840: 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
7850: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7860: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
7870: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
7880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
7890: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
78a0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
78b0: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
78c0: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
78d0: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
78e0: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
78f0: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
7900: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
7910: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
7920: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
7930: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
7940: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
7950: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
7960: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
7970: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
7980: 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
7990: 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
79a0: 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
79b0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
79c0: 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
79d0: 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
79e0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
79f0: 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
7a00: 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
7a10: 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
7a20: 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
7a30: 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
7a40: 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
7a50: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
7a60: 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
7a70: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
7a80: 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
7a90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
7aa0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
7ab0: 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
7ac0: 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
7ad0: 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
7ae0: 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
7af0: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
7b00: 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
7b10: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
7b20: 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
7b30: 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
7b40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
7b50: 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
7b60: 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
7b70: 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
7b80: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
7b90: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
7ba0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
7bb0: 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
7bc0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
7bd0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
7be0: 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
7bf0: 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
7c00: 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
7c10: 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
7c20: 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
7c30: 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
7c40: 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
7c50: 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
7c60: 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
7c70: 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
7c80: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
7c90: 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
7ca0: 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
7cb0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
7cc0: 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
7cd0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
7ce0: 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
7cf0: 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
7d00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7d10: 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
7d20: 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
7d30: 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
7d40: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
7d50: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
7d60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
7d70: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
7d80: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
7d90: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
7da0: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
7db0: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
7dc0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
7dd0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
7de0: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
7df0: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
7e00: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
7e10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7e20: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
7e30: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
7e40: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
7e50: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
7e60: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
7e70: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
7e80: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
7e90: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
7ea0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
7eb0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
7ec0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7ed0: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
7ee0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
7ef0: 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  ..#if HAVE_FULLF
7f00: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
7f10: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
7f20: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
7f30: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
7f40: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
7f50: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
7f60: 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
7f70: 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
7f80: 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
7f90: 6e 63 28 29 2e 0a 20 20 20 2a 20 49 74 20 73 68  nc()..   * It sh
7fa0: 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
7fb0: 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
7fc0: 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
7fd0: 20 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c   local .   * fil
7fe0: 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
7ff0: 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
8000: 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
8010: 4c 46 53 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27  LFSYNC.   * isn'
8020: 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
8030: 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
8040: 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
8050: 20 66 73 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64   fsync .   * and
8060: 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
8070: 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
8080: 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
8090: 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
80a0: 20 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65   * It'd be bette
80b0: 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
80c0: 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
80d0: 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
80e0: 20 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c   * the fcntl cal
80f0: 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
8100: 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20  c is called..   
8110: 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
8120: 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
8130: 65 6c 73 65 20 0a 20 20 69 66 28 20 64 61 74 61  else .  if( data
8140: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
8150: 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
8160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
8170: 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
8180: 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f  .#endif /* HAVE_
8190: 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 23 65 6e  FULLFSYNC */.#en
81a0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
81b0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a  QLITE_NO_SYNC) *
81c0: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
81d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
81e0: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
81f0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
8200: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
8210: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
8220: 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
8230: 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
8240: 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
8250: 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
8260: 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
8270: 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
8280: 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
8290: 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
82a0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
82b0: 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
82c0: 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
82d0: 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
82e0: 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
82f0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
8300: 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
8310: 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
8320: 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
8330: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
8340: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
8350: 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
8360: 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
8370: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
8380: 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
8390: 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
83a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
83b0: 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
83c0: 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
83d0: 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
83e0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
83f0: 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
8400: 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
8410: 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
8420: 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
8430: 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
8440: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
8450: 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
8460: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8470: 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
8480: 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
8490: 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
84a0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
84b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84c0: 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
84d0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
84e0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
84f0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
8500: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
8510: 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
8520: 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
8530: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
8540: 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
8550: 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
8560: 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
8570: 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
8580: 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
8590: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
85a0: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
85b0: 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
85c0: 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
85d0: 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
85e0: 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
85f0: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
8600: 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
8610: 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
8620: 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
8630: 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
8640: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
8650: 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
8660: 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
8670: 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
8680: 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
8690: 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
86a0: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
86b0: 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
86c0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
86d0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
86e0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   );.  OSTRACE2("
86f0: 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
8700: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63   pFile->h);.  rc
8710: 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
8720: 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
8730: 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
8740: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
8750: 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
8760: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
8770: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
8780: 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28  FSYNC;.  }.  if(
8790: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
87a0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34   ){.    OSTRACE4
87b0: 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
87c0: 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
87d0: 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
87e0: 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
87f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
8800: 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
8810: 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65  ullsync);.#ifnde
8820: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
8830: 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20  _DIRSYNC.    /* 
8840: 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  The directory sy
8850: 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  nc is only attem
8860: 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79  pted if full_fsy
8870: 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72  nc is.    ** tur
8880: 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61  ned off or unava
8890: 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75  ilable.  If a fu
88a0: 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65  ll_fsync occurre
88b0: 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20  d above,.    ** 
88c0: 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  then the directo
88d0: 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72  ry sync is super
88e0: 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  fluous..    */. 
88f0: 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55     if( (!HAVE_FU
8900: 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75  LLFSYNC || !isFu
8910: 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llsync) && full_
8920: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
8930: 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
8940: 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
8950: 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
8960: 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
8970: 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
8980: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
8990: 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
89a0: 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
89b0: 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
89c0: 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
89d0: 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
89e0: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
89f0: 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
8a00: 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
8a10: 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
8a20: 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
8a30: 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
8a40: 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
8a50: 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
8a60: 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
8a70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
8a80: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
8a90: 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  d);  /* Only nee
8aa0: 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
8ab0: 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72  so close the dir
8ac0: 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46  ectory */.    pF
8ad0: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
8ae0: 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61      /* when we a
8af0: 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a  re done. */.  }.
8b00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
8b20: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
8b30: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
8b40: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
8b50: 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
8b60: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
8b70: 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
8b80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
8b90: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
8ba0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
8bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8bc0: 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72  _TRUNCATE );.  r
8bd0: 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
8be0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
8bf0: 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
8c00: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8c20: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
8c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8c40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8c50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
8c60: 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
8c70: 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
8c80: 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
8c90: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
8ca0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
8cb0: 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
8cc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
8cd0: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
8ce0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
8cf0: 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
8d00: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
8d10: 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
8d20: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
8d30: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8d40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8d50: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
8d60: 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
8d70: 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
8d80: 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
8d90: 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
8da0: 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c 6f  base, the findLo
8db0: 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  ckInfo() procedu
8dc0: 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
8dd0: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
8de0: 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
8df0: 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
8e00: 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
8e10: 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
8e20: 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
8e30: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
8e40: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
8e50: 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
8e60: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
8e70: 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
8e80: 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
8e90: 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
8ea0: 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
8eb0: 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
8ec0: 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
8ed0: 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
8ee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ef0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
8f00: 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c  s routine transl
8f10: 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 20  ates a standard 
8f20: 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65  POSIX errno code
8f30: 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a   into something.
8f40: 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65  ** useful to the
8f50: 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20   clients of the 
8f60: 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e  sqlite3 function
8f70: 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
8f80: 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e  , it is.** inten
8f90: 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  ded to translate
8fa0: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 74   a variety of "t
8fb0: 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73  ry again" errors
8fc0: 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53   into SQLITE_BUS
8fd0: 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65  Y.** and a varie
8fe0: 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c  ty of "please cl
8ff0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
9000: 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72  criptor NOW" err
9010: 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c  ors into .** SQL
9020: 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a  ITE_IOERR.** .**
9030: 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69   Errors during i
9040: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
9050: 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20   locks, or file 
9060: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66  system support f
9070: 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f  or locks,.** sho
9080: 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43  uld handle ENOLC
9090: 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e  K, ENOTSUP, EOPN
90a0: 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65 6c  OTSUPP separatel
90b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
90c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
90d0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70  PosixError(int p
90e0: 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73  osixError, int s
90f0: 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20  qliteIOErr) {.  
9100: 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72  switch (posixErr
9110: 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a 20  or) {.  case 0: 
9120: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9130: 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63 61  TE_OK;.    .  ca
9140: 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73  se EAGAIN:.  cas
9150: 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63  e ETIMEDOUT:.  c
9160: 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73  ase EBUSY:.  cas
9170: 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20  e EINTR:.  case 
9180: 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a  ENOLCK:  .    /*
9190: 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72   random NFS retr
91a0: 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20  y error, unless 
91b0: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
91c0: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
91d0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
91e0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
91f0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
9200: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20  t it says */.   
9210: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
9220: 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  USY;.    .  case
9230: 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a   EACCES: .    /*
9240: 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20   EACCES is like 
9250: 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f  EAGAIN during lo
9260: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
9270: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74  , but not any ot
9280: 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69  her time*/.    i
9290: 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20  f( (sqliteIOErr 
92a0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
92b0: 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69  LOCK) || ..(sqli
92c0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
92d0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
92e0: 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72  || ..(sqliteIOEr
92f0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
9300: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73  R_RDLOCK) ||..(s
9310: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
9320: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
9330: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b  RESERVEDLOCK) ){
9340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9350: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
9360: 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
9370: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63  l through */.  c
9380: 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20  ase EPERM: .    
9390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
93a0: 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  RM;.    .  case 
93b0: 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74  EDEADLK:.    ret
93c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
93d0: 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a 23  _BLOCKED;.    .#
93e0: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
93f0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
9400: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
9410: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
9420: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
9430: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
9440: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
9450: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
9460: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
9470: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
9480: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
9490: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
94a0: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
94b0: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
94c0: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
94d0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
94e0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
94f0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
9500: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
9510: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
9520: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
9530: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
9540: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
9550: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
9560: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
9570: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
9580: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
9590: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 20    case ENOENT:. 
95a0: 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20 20   case ESTALE:.  
95b0: 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20  case ENOSYS:.   
95c0: 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64   /* these should
95d0: 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e   force the clien
95e0: 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66  t to close the f
95f0: 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63  ile and reconnec
9600: 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61  t */.    .  defa
9610: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
9620: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
9630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9640: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
9650: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
9660: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
9670: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
9680: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
9690: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
96a0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
96b0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
96c0: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
96d0: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
96e0: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
96f0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
9700: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
9710: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
9720: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
9730: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
9740: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
9750: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
9760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9770: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
9780: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
9790: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
97a0: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
97b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
97c0: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
97d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
97e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
97f0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
9800: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
9810: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
9820: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9840: 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   );.  enterMutex
9850: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
9860: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
9870: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
9880: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
9890: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
98a0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
98b0: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
98c0: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
98d0: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
98e0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
98f0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
9900: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
9910: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
9920: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
9930: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
9940: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
9950: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9960: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
9970: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
9980: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
9990: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
99a0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
99b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
99c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
99d0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20  F_WRLCK;.    if 
99e0: 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69  (-1 == fcntl(pFi
99f0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
9a00: 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20  &lock)) {.      
9a10: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
9a20: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
9a30: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9a40: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9a50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
9a60: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
9a70: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
9a80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9a90: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
9aa0: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
9ab0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
9ac0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9ad0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61    }.  }.  .  lea
9ae0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
9af0: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
9b00: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
9b10: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
9b20: 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70 52  eserved);..  *pR
9b30: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
9b40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9b50: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
9b60: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
9b70: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
9b80: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
9b90: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
9ba0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9bb0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
9bc0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
9bd0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
9be0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
9bf0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
9c00: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
9c10: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
9c20: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
9c30: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
9c40: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
9c50: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
9c60: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
9c70: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
9c80: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
9c90: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
9ca0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
9cb0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
9cc0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
9cd0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
9ce0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
9cf0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
9d00: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
9d10: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
9d20: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
9d30: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
9d40: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
9d50: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
9d60: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
9d70: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
9d80: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
9d90: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
9da0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
9db0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
9dc0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
9dd0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
9de0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
9df0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
9e00: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
9e10: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
9e20: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
9e30: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
9e40: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
9e50: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
9e60: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
9e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9e80: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
9e90: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
9ea0: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54  ocktype){.  /* T
9eb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
9ec0: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
9ed0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
9ee0: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
9ef0: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
9f00: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
9f10: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
9f20: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
9f30: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
9f40: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
9f50: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
9f60: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
9f70: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
9f80: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
9f90: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
9fa0: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
9fb0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
9fc0: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
9fd0: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
9fe0: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
9ff0: 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73  ble with windows
a000: 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61   systems simulta
a010: 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63  neously.  ** acc
a020: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
a030: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
a040: 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65  n case that is e
a050: 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20  ver required..  
a060: 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20  **.  ** Symbols 
a070: 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20  defined in os.h 
a080: 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70  indentify the 'p
a090: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64  ending byte' and
a0a0: 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20   the 'reserved. 
a0b0: 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20   ** byte', each 
a0c0: 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20  single bytes at 
a0d0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
a0e0: 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61  ts, and the 'sha
a0f0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
a100: 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66  nge', a range of
a110: 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20   510 bytes at a 
a120: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
a130: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  t..  **.  ** To 
a140: 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
a150: 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63  lock, a read-loc
a160: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e  k is obtained on
a170: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20   the 'pending.  
a180: 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68  ** byte'.  If th
a190: 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
a1a0: 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  , a random byte 
a1b0: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
a1c0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a1d0: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
a1e0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
a1f0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
a200: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  te' released..  
a210: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a220: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a230: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
a240: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
a250: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
a260: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
a270: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
a280: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
a290: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
a2a0: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
a2b0: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
a2c0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
a2d0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
a2e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
a2f0: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
a300: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
a310: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
a320: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
a330: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
a340: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
a350: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
a360: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
a370: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
a380: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
a390: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
a3a0: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
a3b0: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
a3c0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
a3d0: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
a3e0: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
a3f0: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
a400: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a410: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
a420: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
a430: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
a440: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
a450: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
a460: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
a470: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
a480: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
a490: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
a4a0: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
a4b0: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
a4c0: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
a4d0: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
a4e0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
a4f0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
a500: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
a510: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
a520: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
a530: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
a540: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
a550: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
a560: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
a570: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
a580: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
a590: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
a5a0: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
a5b0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
a5c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73  **.  ** The reas
a5d0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  on a single byte
a5e0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
a5f0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27  instead of the '
a600: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
a610: 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20   range' is that 
a620: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
a630: 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20   windows do not 
a640: 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63  support read-loc
a650: 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ks. By.  ** lock
a660: 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ing a random byt
a670: 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20  e from a range, 
a680: 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45  concurrent SHARE
a690: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73  D locks may exis
a6a0: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  t.  ** even if t
a6b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  he locking primi
a6c0: 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77  tive used is alw
a6d0: 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ays a write-lock
a6e0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ..  */.  int rc 
a6f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
a700: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a710: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a720: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
a730: 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  o *pLock = pFile
a740: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63  ->pLock;.  struc
a750: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
a760: 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74  int s;..  assert
a770: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
a780: 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25  RACE7("LOCK    %
a790: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
a7a0: 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  d) pid=%d\n", pF
a7b0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f  ile->h,.      lo
a7c0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
a7d0: 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  ype), locktypeNa
a7e0: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
a7f0: 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  pe),.      lockt
a800: 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c  ypeName(pLock->l
a810: 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d  ocktype), pLock-
a820: 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29  >cnt , getpid())
a830: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
a840: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
a850: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
a860: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
a870: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
a880: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
a890: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
a8a0: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
a8b0: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
a8c0: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61   enterMutex() ha
a8d0: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
a8e0: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
a8f0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a900: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
a910: 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
a920: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
a930: 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
a940: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
a950: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
a960: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
a970: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a980: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
a990: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
a9a0: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
a9b0: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
a9c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
a9d0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
a9e0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
a9f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
aa00: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
aa10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
aa20: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
aa30: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
aa40: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
aa50: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
aa60: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
aa70: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
aa80: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
aa90: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
aaa0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
aab0: 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   */.  enterMutex
aac0: 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ();..  /* Make s
aad0: 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ure the current 
aae0: 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20  thread owns the 
aaf0: 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pFile..  */.  rc
ab00: 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72   = transferOwner
ab10: 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69  ship(pFile);.  i
ab20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ab30: 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74   ){.    leaveMut
ab40: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
ab50: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
ab60: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
ab70: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
ab80: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
ab90: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
aba0: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
abb0: 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
abc0: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
abd0: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
abe0: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
abf0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
ac00: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
ac10: 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e!=pLock->lockty
ac20: 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  pe && .         
ac30: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
ac40: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
ac50: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  || locktype>SHAR
ac60: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
ac70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ac80: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
ac90: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
aca0: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
acb0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
acc0: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
acd0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
ace0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
acf0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
ad00: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
ad10: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
ad20: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
ad30: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
ad40: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
ad50: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
ad60: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
ad70: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
ad80: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
ad90: 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  || pLock->lockty
ada0: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
adb0: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
adc0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
add0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
ade0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
adf0: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
ae00: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
ae10: 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  cnt>0 );.    pFi
ae20: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
ae30: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ae40: 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
ae50: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
ae60: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
ae70: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
ae80: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
ae90: 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68  1L;..  lock.l_wh
aea0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
aeb0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
aec0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
aed0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
aee0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
aef0: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
af00: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
af10: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
af20: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
af30: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
af40: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
af50: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
af60: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
af70: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
af80: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
af90: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
afa0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
afb0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
afc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
afd0: 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  = (locktype==SHA
afe0: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
aff0: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
b000: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
b010: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
b020: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
b030: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
b040: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
b050: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  (-1) ){.      in
b060: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
b070: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b080: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b090: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b0a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
b0c0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b0d0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
b0e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
b0f0: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
b100: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
b120: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
b130: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
b140: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
b150: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
b160: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
b170: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
b180: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
b190: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
b1a0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b1b0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
b1c0: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t tErrno = 0;.  
b1d0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b1e0: 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  >cnt==0 );.    a
b1f0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
b200: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20  cktype==0 );..  
b210: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
b220: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
b230: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b240: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b250: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b260: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
b270: 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28   if( (s = fcntl(
b280: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b290: 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29  K, &lock))==(-1)
b2a0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
b2b0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
b2c0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
b2d0: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
b2e0: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
b2f0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
b300: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
b310: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
b320: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
b330: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
b340: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
b350: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b360: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  k)!=0 ){.      i
b370: 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20  f( s != -1 ){.  
b380: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
b390: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
b3a0: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
b3b0: 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  */.        tErrn
b3c0: 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20  o = errno; .    
b3d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b3e0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b3f0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b400: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
b410: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
b420: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
b430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
b440: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b450: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
b460: 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
b470: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  nd_lock;.      }
b480: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
b490: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b4a0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b4b0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b4c0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b4d0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
b4e0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b4f0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b500: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b510: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
b520: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
b530: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b540: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
b550: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
b560: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
b570: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
b580: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
b590: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
b5a0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
b5b0: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
b5c0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
b5d0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
b5e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
b5f0: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
b600: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
b610: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
b620: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
b630: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
b640: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
b650: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
b660: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
b670: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
b680: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
b690: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
b6a0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
b6b0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
b6c0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
b6d0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
b6e0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
b6f0: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
b700: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
b710: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
b720: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b730: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
b740: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
b750: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
b760: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
b770: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b780: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
b790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b7a0: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
b7b0: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
b7c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b7d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b7e0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
b7f0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
b800: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b810: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
b820: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
b830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
b840: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
b850: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
b860: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
b870: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
b880: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b890: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b8a0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b8b0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b8c0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
b8d0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
b8e0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
b8f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b900: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b920: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
b930: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b940: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b950: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
b960: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
b970: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
b980: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
b990: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
b9a0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
b9b0: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
b9c0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  NG_LOCK;.    pLo
b9d0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  ck->locktype = P
b9e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
b9f0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65  ..end_lock:.  le
ba00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
ba10: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
ba20: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
ba30: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
ba40: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
ba50: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
ba60: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
ba70: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
ba80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
ba90: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
baa0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
bab0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
bac0: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
bad0: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
bae0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
baf0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
bb00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
bb10: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
bb20: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
bb30: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
bb40: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
bb50: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
bb60: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
bb70: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
bb80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb90: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
bba0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
bbb0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74   locktype){.  st
bbc0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
bbd0: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
bbe0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
bbf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bc00: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bc10: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
bc20: 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  id;.  int h;..  
bc30: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
bc40: 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c  .  OSTRACE7("UNL
bc50: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
bc60: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c  d(%d,%d) pid=%d\
bc70: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bc80: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46  cktype,.      pF
bc90: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
bca0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
bcb0: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
bcc0: 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
bcd0: 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
bce0: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
bcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bd00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
bd10: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
bd20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bd30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
bd40: 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
bd50: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
bd60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
bd70: 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28   }.  enterMutex(
bd80: 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e  );.  h = pFile->
bd90: 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69  h;.  pLock = pFi
bda0: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73  le->pLock;.  ass
bdb0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21  ert( pLock->cnt!
bdc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
bdd0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
bde0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
bdf0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
be00: 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c  cktype==pFile->l
be10: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 53  ocktype );.    S
be20: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
be30: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
be40: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
be50: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
be60: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
be70: 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  (0);.    if( loc
be80: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
be90: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
bea0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
beb0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
bec0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bed0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
bee0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
bef0: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
bf00: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
bf10: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
bf20: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
bf30: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
bf40: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
bf50: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bf60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bf70: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
bf80: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
bf90: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
bfa0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
bfb0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
bfc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
bfd0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
bfe0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
bff0: 20 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64 5f   }.....goto end_
c000: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  unlock;.      }.
c010: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
c020: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
c030: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
c040: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c050: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c060: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c070: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c080: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
c090: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
c0a0: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
c0b0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
c0c0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
c0d0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70  =(-1) ){.      p
c0e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c0f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c110: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
c120: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c130: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c140: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c150: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
c160: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
c170: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
c180: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
c190: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
c1a0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
c1b0: 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f  ...goto end_unlo
c1c0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
c1d0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
c1e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72  _LOCK ){.    str
c1f0: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
c200: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  en;..    /* Decr
c210: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
c220: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
c230: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
c240: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
c250: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
c260: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
c270: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
c280: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
c290: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
c2a0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  k..    */.    pL
c2b0: 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20  ock->cnt--;.    
c2c0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  if( pLock->cnt==
c2d0: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
c2e0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c2f0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
c300: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c310: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
c320: 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
c330: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69  n = 0L;.      Si
c340: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c350: 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
c360: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
c370: 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
c380: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c390: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
c3a0: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
c3b0: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
c3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
c3d0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
c3e0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
c3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
c400: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c410: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c420: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c430: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c440: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c450: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
c460: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
c470: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
c480: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c490: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
c4a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f     }.        pLo
c4b0: 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09 09  ck->cnt = 1;....
c4c0: 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b  .goto end_unlock
c4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4e0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
c4f0: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
c500: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
c510: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
c520: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
c530: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
c540: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
c550: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
c560: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
c570: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
c580: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
c590: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
c5a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c5b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c5c0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70  .      pOpen = p
c5d0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
c5e0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
c5f0: 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
c600: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
c610: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
c620: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26  pen->nLock==0 &&
c630: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
c640: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
c650: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
c660: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
c670: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
c680: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70           close(p
c690: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
c6a0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c6c0: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
c6d0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ng);.        pOp
c6e0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
c6f0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
c700: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
c710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c720: 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  ...end_unlock:. 
c730: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
c740: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c750: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  OK ) pFile->lock
c760: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
c770: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c780: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c790: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
c7a0: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
c7b0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
c7c0: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
c7d0: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
c7e0: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
c7f0: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
c800: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
c810: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
c820: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
c830: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
c840: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
c850: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
c860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
c870: 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
c880: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
c890: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
c8a0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
c8b0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b  ;.  if( pFile ){
c8c0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
c8d0: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
c8e0: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64    close(pFile->d
c8f0: 69 72 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  irfd);.    }.   
c900: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
c910: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
c920: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 7d  pFile->h);.    }
c930: 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 43  .    OSTRACE2("C
c940: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
c950: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f  pFile->h);.    O
c960: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
c970: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
c980: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
c990: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
c9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
c9c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
c9d0: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
c9e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
c9f0: 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
ca00: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ca10: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
ca20: 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f  id;.    unixUnlo
ca30: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
ca40: 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28  .    enterMutex(
ca50: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
ca60: 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65  ->pOpen && pFile
ca70: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
ca80: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
ca90: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
caa0: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
cab0: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
cac0: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
cad0: 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
cae0: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
caf0: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
cb00: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
cb10: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
cb20: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
cb30: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e  pOpen->aPending.
cb40: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
cb50: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
cb60: 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
cb70: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
cb80: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
cb90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  */.      int *aN
cba0: 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ew;.      struct
cbb0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20   openCnt *pOpen 
cbc0: 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
cbd0: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
cbe0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f 70  ite3_realloc(pOp
cbf0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70  en->aPending, (p
cc00: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31  Open->nPending+1
cc10: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
cc20: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
cc30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
cc40: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   If a malloc fai
cc50: 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68  ls, just leak th
cc60: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
cc70: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  r */.      }else
cc80: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  {.        pOpen-
cc90: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
cca0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d  ;.        pOpen-
ccb0: 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d  >aPending[pOpen-
ccc0: 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46 69  >nPending] = pFi
ccd0: 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20 70  le->h;.        p
cce0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
ccf0: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
cd00: 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  >h = -1;.      }
cd10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
cd20: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
cd30: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
cd40: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
cd50: 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  le->pOpen);.    
cd60: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
cd70: 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65  );.    leaveMute
cd80: 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
cd90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cda0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cdb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
cdc0: 59 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  YLE.#pragma mark
cdd0: 20 41 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a   AFP Support../*
cde0: 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b  . ** The afpLock
cdf0: 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63  ingContext struc
ce00: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  ture contains al
ce10: 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69  l afp lock speci
ce20: 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79  fic state. */.ty
ce30: 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
ce40: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
ce50: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
ce60: 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
ce70: 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
ce80: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
ce90: 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
cea0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
ceb0: 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74  filePath;.};..st
cec0: 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
ced0: 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
cee0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
cef0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
cf00: 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
cf10: 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
cf20: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
cf30: 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
cf40: 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
cf50: 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
cf60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
cf70: 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
cf80: 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
cf90: 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
cfa0: 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
cfb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
cfc0: 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
cfd0: 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
cfe0: 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
cff0: 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
d000: 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
d010: 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
d020: 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
d030: 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
d040: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d060: 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
d070: 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
d080: 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
d090: 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
d0a0: 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
d0b0: 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
d0c0: 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
d0d0: 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a  geLockPB2)../* .
d0e0: 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
d0f0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
d100: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
d110: 66 61 69 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74 61  failure.. */.sta
d120: 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65  tic int _AFPFSSe
d130: 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
d140: 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 75 6e  har *path, .  un
d150: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  ixFile *pFile, .
d160: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
d170: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20  long offset, .  
d180: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
d190: 6e 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e  ng length, .  in
d1a0: 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b  t setLockFlag.){
d1b0: 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
d1c0: 6e 67 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20  ngeLockPB2      
d1d0: 20 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20   pb;.  int      
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d1f0: 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
d200: 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
d210: 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
d220: 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
d230: 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
d240: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
d250: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
d260: 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
d270: 65 2d 3e 68 3b 0a 20 20 4f 53 54 52 41 43 45 35  e->h;.  OSTRACE5
d280: 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e  ("AFPLOCK settin
d290: 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64  g lock %s for %d
d2a0: 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
d2b0: 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
d2c0: 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
d2d0: 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c  OFF"), pFile->h,
d2e0: 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
d2f0: 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
d300: 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
d310: 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
d320: 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
d330: 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
d340: 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
d350: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d360: 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46      OSTRACE4("AF
d370: 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  PLOCK failed to 
d380: 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
d390: 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20 74 45 72  %s\n", path, tEr
d3a0: 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
d3b0: 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d  rrno));.    rc =
d3c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d3d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d3e0: 6f 2c 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f  o, setLockFlag ?
d3f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
d400: 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
d410: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 2f 2a 20 65 72  R_UNLOCK); /* er
d420: 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ror */.    if( I
d430: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d440: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
d450: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d460: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
d470: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
d480: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
d490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
d4a0: 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 72  ../* AFP-style r
d4b0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68 65  eserved lock che
d4c0: 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
d4d0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
d4e0: 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65 73  .** unixCheckRes
d4f0: 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20 74  ervedLock, see t
d500: 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  he unixCheckRese
d510: 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69 6f  rvedLock functio
d520: 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73 74  n comments */.st
d530: 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
d540: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
d550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d560: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
d570: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d580: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
d590: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
d5a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d5b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
d5c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
d5d0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
d5e0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
d5f0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
d600: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d610: 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
d620: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
d630: 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
d640: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
d650: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
d660: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
d670: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
d680: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
d690: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
d6a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
d6b0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
d6c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
d6d0: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
d6e0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
d6f0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
d700: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
d710: 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
d720: 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
d730: 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
d740: 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
d750: 6c 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  lrc = _AFPFSSetL
d760: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
d770: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  ePath, pFile, RE
d780: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
d790: 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
d7a0: 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
d7b0: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
d7c0: 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
d7d0: 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
d7e0: 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
d7f0: 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
d800: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
d810: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
d820: 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  rc = _AFPFSSetLo
d830: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
d840: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
d850: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
d860: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
d870: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
d880: 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
d890: 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
d8a0: 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
d8b0: 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
d8c0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
d8d0: 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
d8e0: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
d8f0: 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
d900: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54    }.  }.  .  OST
d910: 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
d920: 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  OCK %d %d %d\n",
d930: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
d940: 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20 2a  eserved);.  .  *
d950: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
d960: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
d970: 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65  .}../* AFP-style
d980: 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69   locking followi
d990: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
d9a0: 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65  of unixLock, see
d9b0: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a   the unixLock .*
d9c0: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65  * function comme
d9d0: 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20  nts for details 
d9e0: 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65  of lock manageme
d9f0: 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt. */.static in
da00: 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
da10: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
da20: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
da30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
da40: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
da50: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
da60: 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
da70: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
da80: 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
da90: 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
daa0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
dab0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
dac0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35  le );.  OSTRACE5
dad0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
dae0: 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  was %s pid=%d\n"
daf0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
db00: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
db10: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
db20: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
db30: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70  >locktype), getp
db40: 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
db50: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
db60: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
db70: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
db80: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
db90: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
dba0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
dbb0: 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
dbc0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
dbd0: 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d  , as.  ** enterM
dbe0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
dbf0: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
dc00: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
dc10: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
dc20: 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
dc30: 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
dc40: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
dc50: 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
dc60: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
dc70: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
dc80: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
dc90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
dca0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
dcb0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
dcc0: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
dcd0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
dce0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
dcf0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
dd00: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
dd10: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
dd20: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
dd30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
dd40: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
dd50: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
dd60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
dd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
dd80: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
dd90: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
dda0: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
ddb0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
ddc0: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
ddd0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  enterMutex();.. 
dde0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ddf0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
de00: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
de10: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
de20: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
de30: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
de40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
de50: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
de60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
de70: 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
de80: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
de90: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
dea0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
deb0: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
dec0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
ded0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
dee0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
def0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
df00: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
df10: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
df20: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
df30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
df40: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
df50: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
df60: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
df70: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
df80: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
df90: 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
dfa0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
dfb0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
dfc0: 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
dfd0: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
dfe0: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
dff0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
e000: 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
e010: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
e020: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
e030: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
e040: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
e050: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
e060: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
e070: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
e080: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
e090: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
e0a0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
e0b0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
e0c0: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
e0d0: 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  k, lrc1, lrc2, l
e0e0: 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a 20  rc1Errno;.    . 
e0f0: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
e100: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
e110: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
e120: 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
e130: 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
e140: 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
e150: 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
e160: 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
e170: 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f  andom(); .    co
e180: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
e190: 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78  kByte = (lk & 0x
e1a0: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
e1b0: 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
e1c0: 20 6c 72 63 31 20 3d 20 5f 41 46 50 46 53 53 65   lrc1 = _AFPFSSe
e1d0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e1e0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
e1f0: 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
e200: 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d  D_FIRST+context-
e210: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
e220: 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
e230: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
e240: 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63  c1) ){.      lrc
e250: 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e  1Errno = pFile->
e260: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d  lastErrno;.    }
e270: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
e280: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
e290: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
e2a0: 72 63 32 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  rc2 = _AFPFSSetL
e2b0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
e2c0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  ePath, pFile, PE
e2d0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
e2e0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
e2f0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
e300: 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
e310: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e320: 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
e330: 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
e340: 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
e350: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
e360: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
e370: 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
e380: 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
e390: 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
e3a0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
e3b0: 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
e3c0: 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
e3d0: 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
e3e0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
e3f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e400: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
e410: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e420: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
e430: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
e440: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
e450: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
e460: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
e470: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
e480: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
e490: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
e4a0: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
e4b0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
e4c0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
e4d0: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
e4e0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
e4f0: 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20  if (locktype >= 
e500: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
e510: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e520: 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
e530: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
e540: 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
e550: 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
e560: 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
e570: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
e580: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
e590: 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
e5a0: 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
e5b0: 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
e5c0: 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
e5d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
e5e0: 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
e5f0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
e600: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
e610: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
e620: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
e630: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
e640: 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
e650: 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
e660: 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
e670: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
e680: 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
e690: 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
e6a0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 28   */.      if (!(
e6b0: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
e6c0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
e6d0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
e6e0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74           context
e710: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
e720: 2c 20 31 2c 20 30 29 29 29 20 7b 0a 20 20 20 20  , 1, 0))) {.    
e730: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
e740: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
e750: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
e760: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
e770: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e780: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e790: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
e7a0: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
e7d0: 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
e7e0: 20 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 65         if (faile
e7f0: 64 20 26 26 20 28 66 61 69 6c 65 64 20 3d 20 5f  d && (failed = _
e800: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
e810: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
e820: 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e840: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f  HARED_FIRST + co
e850: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
e860: 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 29 20 7b  kByte, 1, 1))) {
e870: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e880: 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
e890: 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
e8a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
e8b0: 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
e8c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
e8d0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
e8e0: 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
e8f0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
e900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e910: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
e920: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
e930: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
e940: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
e950: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
e960: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
e970: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
e980: 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
e990: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
e9a0: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
e9b0: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
e9c0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
e9d0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
e9e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
e9f0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
ea00: 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
ea10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ea20: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
ea30: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
ea40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
ea50: 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
ea60: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
ea70: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ea80: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ea90: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
eaa0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
eab0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
eac0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
ead0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
eae0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
eaf0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
eb00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
eb10: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
eb20: 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
eb30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
eb40: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
eb50: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
eb60: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
eb70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb80: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
eb90: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
eba0: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
ebb0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
ebc0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
ebd0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
ebe0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ebf0: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
ec00: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
ec10: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
ec20: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
ec30: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
ec40: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
ec50: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
ec60: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
ec70: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
ec80: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
ec90: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
eca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ecb0: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
ecc0: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
ecd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ece0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
ecf0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
ed00: 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 53 51 4c  int failed = SQL
ed10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46  ITE_OK;.  if( pF
ed20: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
ed30: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ed40: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
ed50: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  HARED_LOCK ){.. 
ed60: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74       /* unlock t
ed70: 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e  he exclusive ran
ed80: 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74  ge - then re-est
ed90: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
eda0: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
edb0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
edc0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
edd0: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66  OCK) {.        f
ede0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
edf0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
ee00: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
ee10: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
ee50: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66 61  .        if (!fa
ee60: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20  iled) {.        
ee70: 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    /* successfull
ee80: 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65 78  y removed the ex
ee90: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
eea0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 66            if ((f
eeb0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
eec0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
eed0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  ilePath, pFile, 
eee0: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 0a 20 20  SHARED_FIRST+.  
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
ef10: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
ef20: 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a 20 20 20  e, 1, 1))) {.   
ef30: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c           /* fail
ef40: 65 64 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ed to re-establi
ef50: 73 68 20 6f 75 72 20 73 68 61 72 65 64 20 6c 6f  sh our shared lo
ef60: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ck */.          
ef70: 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
ef80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ef90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
efa0: 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
efb0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  d;.        } .  
efc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
efd0: 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45  if (rc == SQLITE
efe0: 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  _OK && pFile->lo
eff0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
f000: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66  LOCK) {.      if
f010: 20 28 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50   ((failed = _AFP
f020: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
f030: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
f040: 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
f070: 59 54 45 2c 20 31 2c 20 30 29 29 29 7b 0a 20 20  YTE, 1, 0))){.  
f080: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20        /* failed 
f090: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
f0a0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
f0b0: 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
f0c0: 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
f0d0: 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d   } .    if (rc =
f0e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  = SQLITE_OK && p
f0f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
f100: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
f110: 0a 20 20 20 20 20 20 69 66 20 28 28 66 61 69 6c  .      if ((fail
f120: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
f130: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
f140: 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
f180: 2c 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20 20  , 0))) {.       
f190: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65   /* failed to re
f1a0: 6c 65 61 73 65 20 74 68 65 20 72 65 73 65 72 76  lease the reserv
f1b0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
f1c0: 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
f1d0: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20   .      }.    } 
f1e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
f1f0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
f200: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
f210: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
f220: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
f230: 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
f260: 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d  FIRST + context-
f270: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
f280: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28   1, 0);.    if (
f290: 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
f2a0: 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a 20  rc = failed;  . 
f2b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72     }.  }.  if (r
f2c0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  c == SQLITE_OK).
f2d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f2e0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f2f0: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
f300: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f310: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
f320: 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
f330: 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
f340: 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
f350: 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
f360: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f370: 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
f380: 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
f390: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f3a0: 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
f3b0: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
f3c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f3d0: 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
f3e0: 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
f3f0: 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
f400: 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a  ixFile(id);.}...
f410: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f  #pragma mark flo
f420: 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69  ck() style locki
f430: 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6c  ng../*.** The fl
f440: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
f450: 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 2a 2f  t is not used.*/
f460: 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c  .typedef void fl
f470: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
f480: 74 3b 0a 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74 79  t;../* flock-sty
f490: 6c 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  le reserved lock
f4a0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77   checking follow
f4b0: 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72  ing the behavior
f4c0: 20 6f 66 20 0a 20 2a 2a 20 75 6e 69 78 43 68 65   of . ** unixChe
f4d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
f4e0: 73 65 65 20 74 68 65 20 75 6e 69 78 43 68 65 63  see the unixChec
f4f0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75  kReservedLock fu
f500: 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20  nction comments 
f510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
f520: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
f530: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
f540: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
f550: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
f560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
f570: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
f580: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f590: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f5a0: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
f5b0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
f5c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
f5d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
f5e0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
f5f0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
f600: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
f610: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
f620: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
f630: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
f640: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
f650: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
f660: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
f670: 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
f680: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
f690: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
f6a0: 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
f6b0: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
f6c0: 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
f6d0: 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
f6e0: 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66  .    int lrc = f
f6f0: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
f700: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
f710: 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
f720: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
f730: 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
f740: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
f750: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
f760: 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
f770: 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
f780: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
f790: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f7a0: 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
f7b0: 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
f7c0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72  or */.        lr
f7d0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
f7e0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f7f0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f800: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20  RR_UNLOCK); .   
f810: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f820: 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
f830: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
f840: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
f850: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f860: 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
f870: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
f880: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
f890: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f8a0: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
f8b0: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
f8c0: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
f8d0: 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
f8e0: 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
f8f0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f900: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f910: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f920: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
f930: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f940: 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
f950: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f960: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f970: 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
f980: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
f990: 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54 20   OSTRACE4("TEST 
f9a0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
f9b0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
f9c0: 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20  c, reserved);.. 
f9d0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
f9e0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
f9f0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
fa00: 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
fa10: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fa20: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 69   locktype) {.  i
fa30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fa40: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
fa50: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fa60: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
fa70: 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
fa80: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
fa90: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
faa0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
fab0: 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
fac0: 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
fad0: 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
fae0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
faf0: 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  ktype > NO_LOCK)
fb00: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
fb10: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
fb20: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
fb30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
fb40: 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
fb50: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
fb60: 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70 46   .  if (flock(pF
fb70: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
fb80: 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
fb90: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
fba0: 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
fbb0: 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
fbc0: 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
fbd0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
fbe0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
fbf0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
fc00: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
fc10: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
fc20: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
fc30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
fc40: 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
fc50: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
fc60: 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
fc70: 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
fc80: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   */.    pFile->l
fc90: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
fca0: 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  pe;.  }.  OSTRAC
fcb0: 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E4("LOCK    %d %
fcc0: 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %s\n", pFile->
fcd0: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
fce0: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
fcf0: 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
fd00: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
fd10: 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
fd20: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
fd30: 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
fd40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fd50: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
fd60: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fd70: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fd80: 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
fd90: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
fda0: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
fdb0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
fdc0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
fdd0: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
fde0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
fdf0: 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
fe00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
fe10: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
fe20: 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
fe30: 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
fe40: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
fe50: 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
fe60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fe70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fe80: 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
fe90: 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
fea0: 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
feb0: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
fec0: 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
fed0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
fee0: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
fef0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
ff00: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
ff10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ff20: 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
ff30: 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
ff40: 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
ff50: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
ff60: 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20  ;.  if (rc) {.  
ff70: 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20    int r, tErrno 
ff80: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d  = errno;.    r =
ff90: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
ffa0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
ffb0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
ffc0: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
ffd0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ffe0: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
fff0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10000 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10010 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c  return r;.  } el
10020 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
10030 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
10040 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
10050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
10060 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
10070 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
10080 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
10090 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
100a0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
100b0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
100c0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  , NO_LOCK);.  }.
100d0 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
100e0 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
100f0 70 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d  pragma mark Old-
10100 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c  School .lock fil
10110 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a  e based locking.
10120 0a 2f 2a 20 44 6f 74 6c 6f 63 6b 2d 73 74 79 6c  ./* Dotlock-styl
10130 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
10140 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69  checking followi
10150 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
10160 6f 66 20 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b  of .** unixCheck
10170 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65  ReservedLock, se
10180 65 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52  e the unixCheckR
10190 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63  eservedLock func
101a0 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tion comments */
101b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
101c0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
101d0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
101e0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
101f0 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
10200 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
10210 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
10220 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10230 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10240 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
10250 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
10260 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
10270 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
10280 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
10290 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
102a0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
102b0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
102c0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
102d0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
102e0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
102f0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
10300 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
10310 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
10320 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
10330 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
10340 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
10350 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
10360 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10370 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
10380 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
10390 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
103a0 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20 0a 20   statBuf;.    . 
103b0 20 20 20 69 66 28 20 6c 73 74 61 74 28 7a 4c 6f     if( lstat(zLo
103c0 63 6b 46 69 6c 65 2c 20 26 73 74 61 74 42 75 66  ckFile, &statBuf
103d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
103e0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 73 6f   file exists, so
103f0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
10400 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  he lock */.     
10410 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
10420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10430 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  /* file does not
10440 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c 64   exist, we could
10450 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
10460 61 6e 74 20 69 74 20 2a 2f 0a 09 09 09 69 6e 74  ant it */....int
10470 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10480 0a 20 20 20 20 20 20 69 66 28 20 45 4e 4f 45 4e  .      if( ENOEN
10490 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T != tErrno ){. 
104a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
104b0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
104c0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
104d0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
104e0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
104f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10500 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10520 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22    }.  OSTRACE4("
10530 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
10540 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %d\n", pFile-
10550 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
10560 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
10570 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
10580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
10590 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
105a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
105b0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
105c0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
105d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
105e0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
105f0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
10600 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
10610 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
10620 78 74 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51 4c  xt;.  int rc=SQL
10630 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
10640 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
10650 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
10660 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
10670 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
10680 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
10690 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
106a0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
106b0 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
106c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
106d0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
106e0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77  .    .    /* Alw
106f0 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
10700 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
10710 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
10720 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
10730 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 63 20  , NULL);.    rc 
10740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10750 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e   goto dotlock_en
10760 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
10770 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65   /* check to see
10780 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c   if lock file al
10790 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
107a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
107b0 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74  atBuf;.  if (lst
107c0 61 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73 74  at(zLockFile,&st
107d0 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20 20  atBuf) == 0){.  
107e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
107f0 53 59 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20  SY; /* it does, 
10800 62 75 73 79 20 2a 2f 0a 20 20 20 20 67 6f 74 6f  busy */.    goto
10810 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f 63   dotlock_end_loc
10820 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  k;.  }.  .  /* g
10830 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10840 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20   lock */.  fd = 
10850 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f  open(zLockFile,O
10860 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c  _RDONLY|O_CREAT|
10870 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20  O_EXCL,0600);.  
10880 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
10890 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
108a0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
108b0 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  e, someone else 
108c0 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20  may have stolen 
108d0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
108e0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
108f0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
10900 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
10910 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10920 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
10930 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
10940 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10950 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10960 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
10970 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
10980 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10990 29 20 29 7b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73  ) ){..pFile->las
109a0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
109b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
109c0 20 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f     goto dotlock_
109d0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 20 0a 20  end_lock;.  } . 
109e0 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20   close(fd);.  . 
109f0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10a00 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10a10 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10a20 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
10a30 63 6b 74 79 70 65 3b 0a 0a 20 64 6f 74 6c 6f 63  cktype;.. dotloc
10a40 6b 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  k_end_lock:.  re
10a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
10a60 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
10a70 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10a80 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10a90 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
10aa0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10ab0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10ac0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10ad0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10ae0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
10af0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10b00 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
10b10 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
10b20 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  d pid=%d\n", pFi
10b30 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
10b40 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ..   pFile->lock
10b50 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
10b60 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10b70 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
10b80 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10b90 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10ba0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
10bb0 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
10bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10be0 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
10bf0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
10c00 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
10c10 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
10c20 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79   */.  if (lockty
10c30 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
10c40 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
10c50 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10c60 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
10c70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10c80 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
10c90 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
10ca0 20 28 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69   (unlink(zLockFi
10cb0 6c 65 29 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  le) ) {.    int 
10cc0 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
10cd0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10ce0 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10d00 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10d10 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10d20 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10d30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10d40 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10d50 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
10d60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10d70 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
10d80 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
10d90 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
10da0 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
10db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10dc0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
10dd0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
10de0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10df0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
10e00 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
10e10 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
10e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
10e40 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
10e50 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
10e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
10e70 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10e80 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
10e90 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10ea0 64 29 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f  d);.}...#endif /
10eb0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10ec0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
10ed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c 6f  ../*.** The nolo
10ee0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10ef0 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79 70 65   is void.*/.type
10f00 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c  def void nolockL
10f10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10f20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10f30 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10f40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10f50 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
10f60 74 29 20 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20  t) {.  *pResOut 
10f70 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10f80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
10f90 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
10fa0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10fb0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10fc0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ) {.  return SQL
10fd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
10fe0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
10ff0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11000 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
11010 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  e) {.  return SQ
11020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11030 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
11040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
11050 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
11060 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
11070 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
11080 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 2f 2a  File(id);.}.../*
11090 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
110a0 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
110b0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
110c0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
110d0 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
110e0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
110f0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
11100 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
11110 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
11120 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
11130 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
11140 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
11150 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
11160 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
11170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11180 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
11190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
111a0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OR;.}../*.** Ret
111b0 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
111c0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
111d0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
111e0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
111f0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
11200 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
11210 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
11220 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
11230 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
11240 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
11250 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
11260 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
11270 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
11280 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
11290 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
112a0 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
112b0 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
112c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
112d0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
112e0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
112f0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
11300 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
11310 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
11320 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
11330 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
11340 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
11350 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11360 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
11370 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
11380 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
11390 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
113a0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
113b0 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
113c0 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
113d0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
113e0 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
113f0 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
11400 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
11410 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
11420 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
11430 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11440 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
11450 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
11460 20 62 79 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20 57   by pId..**.** W
11470 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65  hen locking exte
11480 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c  nsions are enabl
11490 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68  ed, the filepath
114a0 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79   and locking sty
114b0 6c 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65  le .** are neede
114c0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
114d0 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74  he unixFile pMet
114e0 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c  hod to use for l
114f0 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
11500 73 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  s..** The lockin
11510 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g-style specific
11520 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
11530 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
11540 73 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e  s created .** an
11550 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20  d assigned here 
11560 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
11570 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
11580 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
11590 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
115a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
115b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
115c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
115d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
115e0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
115f0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
11600 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c   */.  int dirfd,
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11620 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
11630 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
11640 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
11650 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
11660 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
11670 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
11680 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11690 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
116a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
116b0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
116c0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 20 20 20  .  int noLock   
116d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d             /* Om
116e0 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72  it locking if tr
116f0 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  ue */.){.  int e
11700 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
11710 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
11720 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
11730 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
11740 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
11750 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74 68  cro to define th
11760 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  e static content
11770 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  s of an sqlite3_
11780 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 2a  io_methods .  **
11790 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61   structure for a
117a0 20 75 6e 69 78 20 62 61 63 6b 65 6e 64 20 66 69   unix backend fi
117b0 6c 65 2e 20 44 69 66 66 65 72 65 6e 74 20 6c 6f  le. Different lo
117c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 0a 20 20  cking methods.  
117d0 2a 2a 20 72 65 71 75 69 72 65 20 64 69 66 66 65  ** require diffe
117e0 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20 66  rent functions f
117f0 6f 72 20 74 68 65 20 78 43 6c 6f 73 65 2c 20 78  or the xClose, x
11800 4c 6f 63 6b 2c 20 78 55 6e 6c 6f 63 6b 20 61 6e  Lock, xUnlock an
11810 64 0a 20 20 2a 2a 20 78 43 68 65 63 6b 52 65 73  d.  ** xCheckRes
11820 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
11830 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  s..  */.  #defin
11840 65 20 49 4f 4d 45 54 48 4f 44 53 28 78 43 6c 6f  e IOMETHODS(xClo
11850 73 65 2c 20 78 4c 6f 63 6b 2c 20 78 55 6e 6c 6f  se, xLock, xUnlo
11860 63 6b 2c 20 78 43 68 65 63 6b 52 65 73 65 72 76  ck, xCheckReserv
11870 65 64 4c 6f 63 6b 29 20 7b 20 20 20 20 5c 0a 20  edLock) {    \. 
11880 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
118a0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 43          \.    xC
118d0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
118e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
118f0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 65 61     \.    unixRea
11920 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
11930 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
11960 20 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20      unixWrite,  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
119b0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
119c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
119d0 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 79      \.    unixSy
11a00 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
11a10 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
11a20 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11a40 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  .    unixFileSiz
11a50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11a60 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
11a90 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11ab0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 20 20 5c 0a 20 20 20 20 78 55 6e 6c 6f       \.    xUnlo
11ae0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
11af0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
11b00 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 5c 0a 20 20 20 20 78 43 68 65 63 6b 52 65 73 65  \.    xCheckRese
11b30 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
11b40 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
11b50 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
11b60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
11b70 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
11b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11b90 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
11bc0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
11bd0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
11be0 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 76 69 63   \.    unixDevic
11c10 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11c20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70     /* xDeviceCap
11c30 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
11c40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
11c50 7d 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  }.  static sqlit
11c60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 49  e3_io_methods aI
11c70 6f 4d 65 74 68 6f 64 5b 5d 20 3d 20 7b 0a 20 20  oMethod[] = {.  
11c80 20 20 49 4f 4d 45 54 48 4f 44 53 28 75 6e 69 78    IOMETHODS(unix
11c90 43 6c 6f 73 65 2c 20 75 6e 69 78 4c 6f 63 6b 2c  Close, unixLock,
11ca0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 75 6e 69   unixUnlock, uni
11cb0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
11cc0 63 6b 29 20 0a 20 20 20 2c 49 4f 4d 45 54 48 4f  ck) .   ,IOMETHO
11cd0 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  DS(nolockClose, 
11ce0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c 6f  nolockLock, nolo
11cf0 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63 6b  ckUnlock, nolock
11d00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11d10 6b 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  k).#ifdef SQLITE
11d20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11d30 53 54 59 4c 45 0a 20 20 20 2c 49 4f 4d 45 54 48  STYLE.   ,IOMETH
11d40 4f 44 53 28 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  ODS(dotlockClose
11d50 2c 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 64  , dotlockLock, d
11d60 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 64 6f 74  otlockUnlock,dot
11d70 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
11d80 64 4c 6f 63 6b 29 0a 20 20 20 2c 49 4f 4d 45 54  dLock).   ,IOMET
11d90 48 4f 44 53 28 66 6c 6f 63 6b 43 6c 6f 73 65 2c  HODS(flockClose,
11da0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 66 6c 6f 63   flockLock, floc
11db0 6b 55 6e 6c 6f 63 6b 2c 20 66 6c 6f 63 6b 43 68  kUnlock, flockCh
11dc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 29  eckReservedLock)
11dd0 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28 61  .   ,IOMETHODS(a
11de0 66 70 43 6c 6f 73 65 2c 20 61 66 70 4c 6f 63 6b  fpClose, afpLock
11df0 2c 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 61 66 70  , afpUnlock, afp
11e00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11e10 6b 29 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  k).#endif.  };. 
11e20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 6f 66   /* The order of
11e30 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 20 6d   the IOMETHODS m
11e40 61 63 72 6f 73 20 61 62 6f 76 65 20 69 73 20 69  acros above is i
11e50 6d 70 6f 72 74 61 6e 74 2e 20 20 49 74 20 6d 75  mportant.  It mu
11e60 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 73  st be the.  ** s
11e70 61 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68 65  ame order as the
11e80 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 6e   LOCKING_STYLE n
11e90 75 6d 62 65 72 73 0a 20 20 2a 2f 0a 20 20 61 73  umbers.  */.  as
11ea0 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54 59  sert(LOCKING_STY
11eb0 4c 45 5f 50 4f 53 49 58 3d 3d 31 29 3b 0a 20 20  LE_POSIX==1);.  
11ec0 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53  assert(LOCKING_S
11ed0 54 59 4c 45 5f 4e 4f 4e 45 3d 3d 32 29 3b 0a 20  TYLE_NONE==2);. 
11ee0 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f   assert(LOCKING_
11ef0 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 3d 3d 33  STYLE_DOTFILE==3
11f00 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43 4b  );.  assert(LOCK
11f10 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 3d  ING_STYLE_FLOCK=
11f20 3d 34 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f  =4);.  assert(LO
11f30 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50 3d  CKING_STYLE_AFP=
11f40 3d 35 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  =5);..  assert( 
11f50 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c  pNew->pLock==NUL
11f60 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  L );.  assert( p
11f70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c 4c  New->pOpen==NULL
11f80 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 33 28   );..  OSTRACE3(
11f90 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
11fa0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
11fb0 65 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d 3e  e);    .  pNew->
11fc0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64  h = h;.  pNew->d
11fd0 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20  irfd = dirfd;.  
11fe0 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65  SET_THREADID(pNe
11ff0 77 29 3b 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  w);..  if( noLoc
12000 6b 20 29 7b 0a 20 20 20 20 65 4c 6f 63 6b 69 6e  k ){.    eLockin
12010 67 53 74 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e 47  gStyle = LOCKING
12020 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20 7d  _STYLE_NONE;.  }
12030 65 6c 73 65 7b 0a 20 20 20 20 65 4c 6f 63 6b 69  else{.    eLocki
12040 6e 67 53 74 79 6c 65 20 3d 20 64 65 74 65 63 74  ngStyle = detect
12050 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 70 56 66  LockingStyle(pVf
12060 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29  s, zFilename, h)
12070 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
12080 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29   eLockingStyle )
12090 7b 0a 0a 20 20 20 20 63 61 73 65 20 4c 4f 43 4b  {..    case LOCK
120a0 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58 3a  ING_STYLE_POSIX:
120b0 20 7b 0a 20 20 20 20 20 20 65 6e 74 65 72 4d 75   {.      enterMu
120c0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
120d0 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
120e0 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
120f0 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
12100 20 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28       leaveMutex(
12110 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12120 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
12130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12140 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 63 61  ING_STYLE.    ca
12150 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  se LOCKING_STYLE
12160 5f 41 46 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _AFP: {.      /*
12170 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
12180 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
12190 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
121a0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
121b0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
121c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
121d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 70      */.      afp
121e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
121f0 70 43 74 78 3b 0a 20 20 20 20 20 20 70 4e 65 77  pCtx;.      pNew
12200 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12210 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
12220 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
12230 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 20  (*pCtx) );.     
12240 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
12250 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12260 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12280 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
12290 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
122a0 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
122b0 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
122c0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 63  ed.        ** ac
122d0 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
122e0 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
122f0 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
12300 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
12310 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
12320 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
12330 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 66 69          pCtx->fi
12340 6c 65 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  lePath = zFilena
12350 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 72 61 6e  me;.        sran
12360 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
12370 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12380 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 4c     }..    case L
12390 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54  OCKING_STYLE_DOT
123a0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  FILE: {.      /*
123b0 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
123c0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
123d0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
123e0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
123f0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  n.      ** the d
12400 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
12410 74 65 78 74 20 0a 20 20 20 20 20 20 2a 2f 0a 20  text .      */. 
12420 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b       char *zLock
12430 46 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  File;.      int 
12440 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  nFilename;.     
12450 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72   nFilename = str
12460 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
12470 20 36 3b 0a 20 20 20 20 20 20 7a 4c 6f 63 6b 46   6;.      zLockF
12480 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
12490 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
124a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
124b0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
124c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
124d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
124e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
124f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12500 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
12510 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 2e 6c 6f  LockFile, "%s.lo
12520 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ck", zFilename);
12530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12540 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
12550 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
12560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12570 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 4c 4f    }..    case LO
12580 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43  CKING_STYLE_FLOC
12590 4b 3a 20 0a 20 20 20 20 63 61 73 65 20 4c 4f 43  K: .    case LOC
125a0 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3a  KING_STYLE_NONE:
125b0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 23   .      break;.#
125c0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 70  endif.  }.  .  p
125d0 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
125e0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
125f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
12600 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
12610 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20 20  ose(dirfd);.    
12620 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73  close(h);.  }els
12630 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
12640 74 68 6f 64 20 3d 20 26 61 49 6f 4d 65 74 68 6f  thod = &aIoMetho
12650 64 5b 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2d  d[eLockingStyle-
12660 31 5d 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  1];.    OpenCoun
12670 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72  ter(+1);.  }.  r
12680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12690 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
126a0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
126b0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
126c0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
126d0 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
126e0 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
126f0 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
12700 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
12710 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
12720 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
12730 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12740 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
12750 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
12760 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
12770 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
12780 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
12790 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
127a0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ue..**.** If SQL
127b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
127c0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
127d0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
127e0 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
127f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12800 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
12810 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
12820 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
12830 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
12840 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
12850 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
12860 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
12870 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
12880 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
12890 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
128a0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
128b0 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
128c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
128d0 28 69 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e  (ii=strlen(zDirn
128e0 61 6d 65 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a  ame); ii>=0 && z
128f0 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
12900 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
12910 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
12920 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
12930 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44      fd = open(zD
12940 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
12950 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
12960 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
12970 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
12980 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66 64  C.      fcntl(fd
12990 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
129a0 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
129b0 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
129c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
129d0 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25  RACE3("OPENDIR %
129e0 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a  -3d %s\n", fd, z
129f0 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  Dirname);.    }.
12a00 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
12a10 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
12a20 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54  ?SQLITE_OK:SQLIT
12a30 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a  E_CANTOPEN);.}..
12a40 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
12a50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
12a60 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
12a70 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
12a80 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
12a90 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
12aa0 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
12ab0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
12ac0 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
12ad0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
12ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
12af0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
12b00 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
12b10 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
12b20 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
12b30 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
12b40 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
12b50 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
12b60 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
12b70 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ".",.  };.  stat
12b80 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
12b90 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
12ba0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
12bb0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
12bc0 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
12bd0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
12be0 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
12bf0 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
12c00 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
12c10 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
12c20 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a  r *zDir = ".";..
12c30 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
12c40 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
12c50 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
12c60 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
12c70 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
12c80 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
12c90 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
12ca0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
12cb0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
12cc0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
12cd0 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
12ce0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12cf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
12d00 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20  );..  azDirs[0] 
12d10 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
12d20 69 72 65 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28  irectory;.  for(
12d30 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
12d40 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
12d50 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
12d60 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d     if( azDirs[i]
12d70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12d80 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44      if( stat(azD
12d90 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20  irs[i], &buf) ) 
12da0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12db0 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
12dc0 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
12dd0 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ue;.    if( acce
12de0 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37  ss(azDirs[i], 07
12df0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12e00 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
12e10 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  i];.    break;. 
12e20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
12e30 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
12e40 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
12e50 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
12e60 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
12e70 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
12e80 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
12e90 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
12ea0 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
12eb0 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
12ec0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
12ed0 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
12ee0 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
12ef0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
12f00 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
12f10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12f20 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20  (nBuf-17, zBuf, 
12f30 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
12f40 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
12f50 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  ir);.    j = str
12f60 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
12f70 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
12f80 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
12f90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12fa0 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
12fb0 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
12fc0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
12fd0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
12fe0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
12ff0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
13000 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
13010 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63  0;.  }while( acc
13020 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
13030 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13040 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
13050 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
13060 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
13070 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
13080 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
13090 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
130a0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
130b0 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
130c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
130d0 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
130e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
130f0 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
13100 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
13110 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
13120 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
13130 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
13140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
13150 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
13160 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
13170 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
13180 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
13190 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
131a0 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
131b0 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
131c0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
131d0 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
131e0 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
131f0 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
13200 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
13210 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
13220 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
13230 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
13240 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
13250 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
13260 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
13270 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
13280 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
13290 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
132a0 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
132b0 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
132c0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
132d0 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
132e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
132f0 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
13300 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
13310 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
13320 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
13330 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
13340 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
13350 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
13360 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c 69 74 65  zPath, .  sqlite
13370 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
13380 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
13390 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
133a0 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20 20    int fd = 0;   
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
133d0 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
133e0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
133f0 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  dirfd = -1;     
13400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
13410 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
13420 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
13430 20 6f 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20   oflags = 0;    
13440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13450 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
13460 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
13470 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
13480 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
13490 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
134a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
134b0 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
134c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
134d0 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
134e0 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 0a 20 20  rimitives */..  
134f0 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
13500 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
13510 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
13520 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
13530 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
13540 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
13550 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
13560 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
13570 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
13580 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
13590 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
135a0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
135b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
135c0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
135d0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
135e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
135f0 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 20 20 2f  READWRITE);..  /
13600 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
13610 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
13620 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
13630 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
13640 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
13650 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
13660 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
13670 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
13680 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
13690 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
136a0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
136b0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
136c0 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
136d0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
136e0 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74  int isOpenDirect
136f0 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20  ory = (isCreate 
13700 26 26 20 0a 20 20 20 20 20 20 28 65 54 79 70 65  && .      (eType
13710 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
13720 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  STER_JOURNAL || 
13730 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
13740 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
13750 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  .  );..  /* If a
13760 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
13770 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
13780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13790 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
137a0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
137b0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
137c0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
137d0 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
137e0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
137f0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
13800 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e  THNAME+1];.  con
13810 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
13820 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
13830 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
13840 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
13850 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
13860 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
13870 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
13880 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
13890 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
138a0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
138b0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
138c0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
138d0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
138e0 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
138f0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
13900 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
13910 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
13920 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
13930 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
13940 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
13950 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
13960 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
13970 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
13980 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
13990 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
139a0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
139b0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
139c0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
139d0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
139e0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
139f0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
13a00 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
13a10 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
13a20 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
13a30 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
13a40 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64  ain journal, and
13a50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13a60 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61  are never automa
13a70 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c  tically.  ** del
13a80 65 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73 73 65  eted.  */.  asse
13a90 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
13aa0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
13ab0 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20  | !isDelete );. 
13ac0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
13ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
13ae0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
13af0 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65 72  elete );.  asser
13b00 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
13b10 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
13b20 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74  RNAL || !isDelet
13b30 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  e );..  /* Asser
13b40 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
13b50 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
13b60 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
13b70 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
13b80 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
13b90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
13ba0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
13bb0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
13bc0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
13bd0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
13be0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
13bf0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
13c00 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
13c10 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
13c20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
13c30 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
13c40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
13c50 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
13c60 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
13c70 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
13c80 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
13c90 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
13ca0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
13cb0 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
13cc0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
13cd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
13ce0 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
13cf0 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72   !isOpenDirector
13d00 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  y);.    rc = get
13d10 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
13d20 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
13d30 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
13d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13d50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13d60 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
13d70 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
13d80 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
13d90 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52  )  oflags |= O_R
13da0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
13db0 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61 67  eadWrite ) oflag
13dc0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
13dd0 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
13de0 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45   oflags |= O_CRE
13df0 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
13e00 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20 7c  usive ) oflags |
13e10 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
13e20 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73 20  LLOW);.  oflags 
13e30 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
13e40 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66 64  O_BINARY);..  fd
13e50 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f   = open(zName, o
13e60 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74 65 3f  flags, isDelete?
13e70 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41  0600:SQLITE_DEFA
13e80 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
13e90 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c  IONS);.  if( fd<
13ea0 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
13eb0 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
13ec0 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
13ed0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c  e ){.    /* Fail
13ee0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
13ef0 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
13f00 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
13f10 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
13f20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
13f30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13f40 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
13f50 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67 73  EATE);.    flags
13f60 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
13f70 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65  READONLY;.    re
13f80 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56  turn unixOpen(pV
13f90 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c 65  fs, zPath, pFile
13fa0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
13fb0 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  gs);.  }.  if( f
13fc0 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
13fd0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
13fe0 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44  N;.  }.  if( isD
13ff0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 75 6e 6c  elete ){.    unl
14000 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ink(zName);.  }.
14010 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
14020 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
14030 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
14040 20 20 61 73 73 65 72 74 28 66 64 21 3d 30 29 3b    assert(fd!=0);
14050 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72  .  if( isOpenDir
14060 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
14070 74 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63  t rc = openDirec
14080 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72  tory(zPath, &dir
14090 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
140a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
140b0 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20      close(fd);. 
140c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
140d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
140e0 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66  f FD_CLOEXEC.  f
140f0 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
14100 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
14110 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
14120 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  EXEC);.#endif.. 
14130 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
14140 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
14150 4e 5f 44 42 3b 0a 20 20 72 65 74 75 72 6e 20 66  N_DB;.  return f
14160 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
14170 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70  fs, fd, dirfd, p
14180 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
14190 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ock);.}../*.** D
141a0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61  elete the file a
141b0 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20  t zPath. If the 
141c0 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74  dirSync argument
141d0 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28   is true, fsync(
141e0 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  ).** the directo
141f0 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
14200 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  g the file..*/.s
14210 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
14220 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
14230 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
14240 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64  ar *zPath, int d
14250 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72  irSync){.  int r
14260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14270 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14280 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
14290 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
142a0 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20  unlink(zPath);. 
142b0 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a   if( dirSync ){.
142c0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
142d0 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f  rc = openDirecto
142e0 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
142f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
14310 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 7b 0a  f( fsync(fd) ){.
14320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14330 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
14340 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
14350 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
14360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14370 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
14380 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
14390 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
143a0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
143b0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
143c0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
143d0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
143e0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
143f0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
14400 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
14410 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
14420 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
14430 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
14440 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
14450 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
14460 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
14470 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
14480 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
14490 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
144a0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
144b0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
144c0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
144d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
144e0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
144f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
14500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
14510 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67  ath, .  int flag
14520 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f  s, .  int *pResO
14530 75 74 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  ut.){.  int amod
14540 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74  e = 0;.  Simulat
14550 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
14570 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
14580 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
14590 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
145a0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
145b0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
145c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
145d0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
145e0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
145f0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
14600 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
14610 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
14620 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
14630 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
14640 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
14650 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
14660 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
14670 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
14680 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
14690 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73  pResOut = (acces
146a0 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d  s(zPath, amode)=
146b0 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  =0);.  return SQ
146c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
146d0 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
146e0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
146f0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
14700 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
14710 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
14720 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
14730 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
14740 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
14750 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
14760 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
14770 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
14780 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
14790 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
147a0 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
147b0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
147c0 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
147d0 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
147e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
147f0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
14800 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
14810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
14820 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
14830 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
14840 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
14850 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
14860 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
14870 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
14880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14890 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
148a0 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
148b0 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
148d0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
148e0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
148f0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
14920 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
14930 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
14940 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
14950 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
14960 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
14970 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
14980 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
14990 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
149a0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
149b0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
149c0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
149d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
149e0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
149f0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
14a00 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
14a10 20 64 69 72 65 63 74 6c 79 20 68 61 73 20 62 65   directly has be
14a20 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
14a30 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
14a40 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14a50 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
14a60 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
14a70 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
14a80 48 4e 41 4d 45 20 29 3b 0a 20 20 7a 4f 75 74 5b  HNAME );.  zOut[
14a90 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
14aa0 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
14ab0 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
14ac0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
14ad0 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
14ae0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
14af0 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
14b00 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
14b10 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
14b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14b30 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
14b40 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73    }.    nCwd = s
14b50 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
14b60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14b70 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
14b80 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
14b90 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
14ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14bb0 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a  ..#if 0.  /*.  *
14bc0 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70  * Remove "/./" p
14bd0 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64  ath elements and
14be0 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22   convert "/A/./"
14bf0 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20   path elements. 
14c00 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e   ** to just "/".
14c10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
14c20 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  l ){.    int i, 
14c30 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  j;.    for(i=j=0
14c40 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29  ; zFull[i]; i++)
14c50 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  {.      if( zFul
14c60 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  l[i]=='/' ){.   
14c70 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69       if( zFull[i
14c80 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
14c90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
14ca0 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27   zFull[i+1]=='.'
14cb0 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d   && zFull[i+2]==
14cc0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
14cd0 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
14ce0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14d00 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
14d10 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
14d20 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
14d30 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
14d40 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
14d50 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d   && zFull[j-1]!=
14d60 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
14d70 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a          i += 3;.
14d80 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
14d90 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
14da0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c      }.      zFul
14db0 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69  l[j++] = zFull[i
14dc0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75  ];.    }.    zFu
14dd0 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23  ll[j] = 0;.  }.#
14de0 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64 65  endif.}...#ifnde
14df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
14e00 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
14e10 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
14e20 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
14e30 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
14e40 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
14e50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
14e60 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
14e70 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
14e80 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
14e90 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
14ea0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
14eb0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
14ec0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14ed0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
14ee0 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
14ef0 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
14f00 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
14f10 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
14f20 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
14f30 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
14f40 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
14f50 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
14f60 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
14f70 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
14f80 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
14f90 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
14fa0 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
14fb0 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
14fc0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
14fd0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
14fe0 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
14ff0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
15000 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
15010 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
15020 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
15030 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
15040 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
15050 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
15060 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
15070 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
15080 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
15090 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61  *zBufOut){.  cha
150a0 72 20 2a 7a 45 72 72 3b 0a 20 20 65 6e 74 65 72  r *zErr;.  enter
150b0 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
150c0 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
150d0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
150e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
150f0 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
15100 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
15110 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
15120 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  }.static void *u
15130 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
15140 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
15150 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
15160 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b   char *zSymbol){
15170 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79 6d 28  .  return dlsym(
15180 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c  pHandle, zSymbol
15190 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
151a0 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
151b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
151c0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
151d0 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
151e0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
151f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
15200 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
15210 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
15220 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
15230 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
15240 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
15250 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
15260 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
15270 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
15280 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
15290 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
152a0 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
152b0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
152c0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
152d0 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
152e0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
152f0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
15300 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 0a 20   char *zBuf){.. 
15310 20 61 73 73 65 72 74 28 6e 42 75 66 3e 3d 28 73   assert(nBuf>=(s
15320 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
15330 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
15340 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
15350 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
15360 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
15370 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
15380 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
15390 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
153a0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
153b0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
153c0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
153d0 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
153e0 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
153f0 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
15400 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
15410 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
15420 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
15430 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
15440 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
15450 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
15460 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
15470 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
15480 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
15490 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
154a0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
154b0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
154c0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
154d0 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
154e0 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
154f0 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
15500 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
15510 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
15520 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
15530 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
15540 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
15550 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
15560 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
15570 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
15580 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
15590 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
155a0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
155b0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
155c0 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
155d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
155e0 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
155f0 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
15600 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
15610 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
15620 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
15630 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
15640 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
15650 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
15660 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
15670 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
15680 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
15690 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
156a0 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
156b0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
156c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
156d0 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
156e0 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  f);.      close(
156f0 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  fd);.    }.  }.#
15700 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
15710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
15720 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
15730 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
15740 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
15750 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
15760 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
15770 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15780 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
15790 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
157a0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
157b0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
157c0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
157d0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
157e0 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
157f0 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
15800 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
15810 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
15820 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
15830 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
15840 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
15850 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
15860 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
15870 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
15880 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
15890 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
158a0 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
158b0 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 64 65  seconds){.#if de
158c0 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
158d0 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
158e0 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
158f0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75  seconds);.  retu
15900 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
15910 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
15920 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
15930 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
15940 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
15950 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e  conds);.  return
15960 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
15970 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15980 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
15990 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
159a0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
159b0 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68  alue, becomes th
159c0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75  e result.** retu
159d0 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
159e0 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
159f0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
15a00 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  for testing..*/.
15a10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
15a20 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
15a30 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
15a40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
15a50 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
15a60 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
15a70 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
15a80 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
15a90 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
15aa0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
15ab0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
15ac0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
15ad0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
15ae0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
15af0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
15b00 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
15b10 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
15b20 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
15b30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
15b40 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23  ouble *prNow){.#
15b50 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a  ifdef NO_GETTOD.
15b60 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
15b70 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
15b80 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
15b90 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a  440587.5;.#else.
15ba0 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
15bb0 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65   sNow;.  gettime
15bc0 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b  ofday(&sNow, 0);
15bd0 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30  .  *prNow = 2440
15be0 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f  587.5 + sNow.tv_
15bf0 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e  sec/86400.0 + sN
15c00 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30  ow.tv_usec/86400
15c10 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66  000000.0;.#endif
15c20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15c30 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
15c40 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
15c50 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73  {.    *prNow = s
15c60 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
15c70 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  ime/86400.0 + 24
15c80 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e  40587.5;.  }.#en
15c90 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  dif.  return 0;.
15ca0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  }..static int un
15cb0 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
15cc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
15cd0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
15ce0 20 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74 75 72   *zBuf){.  retur
15cf0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
15d00 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
15d10 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
15d20 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
15d30 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
15d40 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 4d 61 63  void){ .  /* Mac
15d50 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  ro to define the
15d60 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 73   static contents
15d70 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   of an sqlite3_v
15d80 66 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  fs structure for
15d90 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69 78 20 62  .  ** the unix b
15da0 61 63 6b 65 6e 64 2e 20 54 68 65 20 74 77 6f 20  ackend. The two 
15db0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
15dc0 68 65 20 76 61 6c 75 65 73 20 74 6f 20 75 73 65  he values to use
15dd0 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 73 71   for.  ** the sq
15de0 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61 6d 65 20  lite3_vfs.zName 
15df0 61 6e 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  and sqlite3_vfs.
15e00 70 41 70 70 44 61 74 61 20 66 69 65 6c 64 73 2c  pAppData fields,
15e10 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
15e20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23 64 65 66   ** .  */.  #def
15e30 69 6e 65 20 55 4e 49 58 56 46 53 28 7a 56 66 73  ine UNIXVFS(zVfs
15e40 4e 61 6d 65 2c 20 70 56 66 73 41 70 70 44 61 74  Name, pVfsAppDat
15e50 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
15e60 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20        \.    1,  
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
15eb0 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
15ec0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
15ef0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
15f00 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
15f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
15f40 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15f60 20 20 20 20 7a 56 66 73 4e 61 6d 65 2c 20 20 20      zVfsName,   
15f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
15f80 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
15f90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15fa0 20 20 28 76 6f 69 64 20 2a 29 70 56 66 73 41 70    (void *)pVfsAp
15fb0 70 44 61 74 61 2c 20 20 2f 2a 20 70 41 70 70 44  pData,  /* pAppD
15fc0 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
15fd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
15fe0 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
15ff0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
16000 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16010 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16020 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
16030 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
16040 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16050 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
16060 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
16070 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
160a0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
160b0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
160c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
160d0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
160e0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
160f0 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
16120 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
16130 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16150 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
16160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
16170 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
16180 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
16190 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
161a0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
161b0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
161c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
161d0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
161e0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
161f0 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
16200 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
16210 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
16220 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
16250 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
16260 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
16270 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
16280 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
16290 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20 20  tLastError      
162a0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
162b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
162c0 20 20 5c 0a 20 20 7d 0a 0a 20 20 73 74 61 74 69    \.  }..  stati
162d0 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 75 6e  c sqlite3_vfs un
162e0 69 78 56 66 73 20 3d 20 55 4e 49 58 56 46 53 28  ixVfs = UNIXVFS(
162f0 22 75 6e 69 78 22 2c 20 30 29 3b 0a 23 69 66 64  "unix", 0);.#ifd
16300 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16310 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
16320 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
16330 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
16340 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 55 4e 49 58  s[] = {.    UNIX
16350 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22  VFS("unix-posix"
16360 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ,   LOCKING_STYL
16370 45 5f 50 4f 53 49 58 29 2c 20 0a 20 20 20 20 55  E_POSIX), .    U
16380 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70  NIXVFS("unix-afp
16390 22 2c 20 20 20 20 20 4c 4f 43 4b 49 4e 47 5f 53  ",     LOCKING_S
163a0 54 59 4c 45 5f 41 46 50 29 2c 20 0a 20 20 20 20  TYLE_AFP), .    
163b0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c  UNIXVFS("unix-fl
163c0 6f 63 6b 22 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f  ock",   LOCKING_
163d0 53 54 59 4c 45 5f 46 4c 4f 43 4b 29 2c 20 0a 20  STYLE_FLOCK), . 
163e0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
163f0 2d 64 6f 74 66 69 6c 65 22 2c 20 4c 4f 43 4b 49  -dotfile", LOCKI
16400 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45  NG_STYLE_DOTFILE
16410 29 2c 20 0a 20 20 20 20 55 4e 49 58 56 46 53 28  ), .    UNIXVFS(
16420 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20  "unix-none",    
16430 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f  LOCKING_STYLE_NO
16440 4e 45 29 0a 20 20 7d 3b 0a 20 20 66 6f 72 28 69  NE).  };.  for(i
16450 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56  =0; i<(sizeof(aV
16460 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74  fs)/sizeof(sqlit
16470 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a  e3_vfs)); i++){.
16480 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
16490 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69  register(&aVfs[i
164a0 5d 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ], 0);.  }.#endi
164b0 66 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  f.  sqlite3_vfs_
164c0 72 65 67 69 73 74 65 72 28 26 75 6e 69 78 56 66  register(&unixVf
164d0 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 1);.  return 
164e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
164f0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
16500 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
16510 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68  em interface. Th
16520 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
16530 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  r unix..*/.int s
16540 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
16550 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
16560 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23  QLITE_OK; .}. .#
16570 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16580 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.