/ Hex Artifact Content
Login

Artifact 8f4def6a92681735908fa1b87b5cc0291ebafde6:


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 31 20 32 30 30 38 2f 30 39 2f 31 35 20 30 34  01 2008/09/15 04
01e0: 3a 32 30 3a 33 32 20 64 61 6e 69 65 6c 6b 31 39  :20:32 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 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
8620: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  e );.  OSTRACE2(
8630: 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
8640: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72  , pFile->h);.  r
8650: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
8660: 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
8670: 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
8680: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
8690: 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
86a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
86b0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
86c0: 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66  _FSYNC;.  }.  if
86d0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
86e0: 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
86f0: 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  4("DIRSYNC %-3d 
8700: 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
8710: 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
8720: 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  n", pFile->dirfd
8730: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
8740: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
8750: 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64  Fullsync);.#ifnd
8760: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
8770: 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
8780: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
8790: 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
87a0: 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
87b0: 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
87c0: 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
87d0: 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
87e0: 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
87f0: 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
8800: 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
8810: 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
8820: 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
8830: 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
8840: 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
8850: 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
8860: 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
8870: 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
8880: 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
8890: 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
88a0: 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
88b0: 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
88c0: 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
88d0: 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
88e0: 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
88f0: 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
8900: 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
8910: 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
8920: 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
8930: 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
8940: 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
8950: 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
8960: 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
8970: 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
8980: 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
8990: 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51      /* return SQ
89a0: 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20  LITE_IOERR; */. 
89b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
89c0: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
89d0: 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  fd);  /* Only ne
89e0: 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
89f0: 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69   so close the di
8a00: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70  rectory */.    p
8a10: 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31  File->dirfd = -1
8a20: 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20  ;    /* when we 
8a30: 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d  are done. */.  }
8a40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8a50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
8a60: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
8a70: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
8a80: 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
8a90: 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
8aa0: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
8ab0: 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
8ac0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
8ad0: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
8ae0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
8af0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8b00: 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
8b10: 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
8b20: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
8b30: 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
8b40: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8b50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b60: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
8b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
8b80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
8ba0: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
8bb0: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
8bc0: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
8bd0: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
8be0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
8bf0: 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
8c00: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
8c10: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
8c20: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
8c30: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
8c40: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
8c50: 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
8c60: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
8c70: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
8c80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8c90: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
8ca0: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
8cb0: 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
8cc0: 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
8cd0: 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
8ce0: 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 4c  abase, the findL
8cf0: 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  ockInfo() proced
8d00: 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
8d10: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
8d20: 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
8d30: 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
8d40: 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
8d50: 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
8d60: 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
8d70: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
8d80: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
8d90: 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
8da0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
8db0: 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
8dc0: 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
8dd0: 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
8de0: 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
8df0: 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
8e00: 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
8e10: 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
8e20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8e30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
8e40: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
8e50: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
8e60: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
8e70: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
8e80: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
8e90: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
8ea0: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
8eb0: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
8ec0: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
8ed0: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
8ee0: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
8ef0: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
8f00: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
8f10: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
8f20: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
8f30: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
8f40: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
8f50: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
8f60: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
8f70: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
8f80: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
8f90: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
8fa0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
8fb0: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
8fc0: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
8fd0: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
8fe0: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
8ff0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
9000: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
9010: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
9020: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
9030: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
9040: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
9050: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a  ror) {.  case 0:
9060: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
9070: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63  ITE_OK;.    .  c
9080: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
9090: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
90a0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
90b0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
90c0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
90d0: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
90e0: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
90f0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
9100: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
9110: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
9120: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
9130: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
9140: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
9150: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9160: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
9170: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
9180: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
9190: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
91a0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
91b0: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
91c0: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
91d0: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
91e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
91f0: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  _LOCK) || ..(sql
9200: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
9210: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
9220: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
9230: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
9240: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28  RR_RDLOCK) ||..(
9250: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
9260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
9270: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
9280: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9290: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
92a0: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
92b0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
92c0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
92d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
92e0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  ERM;.    .  case
92f0: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
9300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9310: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a  R_BLOCKED;.    .
9320: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
9330: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
9340: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
9350: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
9360: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
9370: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
9380: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
9390: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
93a0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
93b0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
93c0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
93d0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
93e0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
93f0: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
9400: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
9410: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
9420: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
9430: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
9440: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
9450: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
9460: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
9470: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
9480: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
9490: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
94a0: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
94b0: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
94c0: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
94d0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
94e0: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20    case ESTALE:. 
94f0: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
9500: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
9510: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
9520: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
9530: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
9540: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
9550: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
9560: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
9570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9580: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9590: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
95a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
95b0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
95c0: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
95d0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
95e0: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
95f0: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
9600: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
9610: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
9620: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
9630: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
9640: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
9650: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
9660: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
9670: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
9680: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
9690: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
96a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
96b0: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
96c0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
96d0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
96e0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
96f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
9700: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
9710: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
9720: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
9730: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
9740: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
9750: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
9760: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
9770: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
9780: 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65  e );.  enterMute
9790: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
97a0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
97b0: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
97c0: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
97d0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
97e0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
97f0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9800: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9810: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
9820: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
9830: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
9840: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
9850: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
9860: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9870: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
9880: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
9890: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
98a0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
98b0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
98c0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
98d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
98e0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
98f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
9900: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
9910: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
9920: 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46   (-1 == fcntl(pF
9930: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
9940: 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20   &lock)) {.     
9950: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
9960: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
9970: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
9980: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
9990: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
99a0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
99b0: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
99c0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
99d0: 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  no;.    } else i
99e0: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
99f0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
9a00: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
9a10: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65     }.  }.  .  le
9a20: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
9a30: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
9a40: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
9a50: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
9a60: 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a 70  reserved);..  *p
9a70: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
9a80: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
9a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
9aa0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
9ab0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
9ac0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
9ad0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
9ae0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
9af0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
9b00: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
9b10: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
9b20: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
9b30: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
9b40: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
9b50: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
9b60: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
9b70: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
9b80: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
9b90: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
9ba0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
9bb0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
9bc0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
9bd0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
9be0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
9bf0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
9c00: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
9c10: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
9c20: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
9c30: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
9c40: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
9c50: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
9c60: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
9c70: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
9c80: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
9c90: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
9ca0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
9cb0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
9cc0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
9cd0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
9ce0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
9cf0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
9d00: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
9d10: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
9d20: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
9d30: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
9d40: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
9d50: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
9d60: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
9d70: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
9d80: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
9d90: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
9da0: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
9db0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
9dc0: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
9dd0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
9de0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20  locktype){.  /* 
9df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
9e00: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
9e10: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9e20: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
9e30: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
9e40: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
9e50: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
9e60: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
9e70: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
9e80: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
9e90: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
9ea0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
9eb0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
9ec0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
9ed0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
9ee0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
9ef0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
9f00: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
9f10: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
9f20: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
9f30: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
9f40: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
9f50: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
9f60: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
9f70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
9f80: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
9f90: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
9fa0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
9fb0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
9fc0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
9fd0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
9fe0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
9ff0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
a000: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
a010: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a020: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
a030: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
a040: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
a050: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
a060: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a070: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
a080: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
a090: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
a0a0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
a0b0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
a0c0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
a0d0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
a0e0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
a0f0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
a100: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a110: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
a120: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
a130: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
a140: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
a150: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
a160: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
a170: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
a180: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
a190: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
a1a0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
a1b0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
a1c0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
a1d0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
a1e0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
a1f0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
a200: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
a210: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
a220: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
a230: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
a240: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
a250: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
a260: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
a270: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
a280: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
a290: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
a2a0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
a2b0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
a2c0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
a2d0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
a2e0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
a2f0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
a300: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
a310: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
a320: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
a330: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
a340: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a350: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
a360: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
a370: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
a380: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
a390: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
a3a0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
a3b0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
a3c0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
a3d0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
a3e0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
a3f0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
a400: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
a410: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
a420: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
a430: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
a440: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
a450: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a460: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
a470: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
a480: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
a490: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
a4a0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
a4b0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
a4c0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
a4d0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
a4e0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
a4f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
a500: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
a510: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
a520: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
a530: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
a540: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
a550: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
a560: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
a570: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
a580: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
a590: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
a5a0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
a5b0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
a5c0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
a5d0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
a5e0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
a5f0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
a600: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
a610: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
a620: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
a630: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a640: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
a650: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
a660: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
a670: 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  fo *pLock = pFil
a680: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  e->pLock;.  stru
a690: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
a6a0: 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72   int s;..  asser
a6b0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
a6c0: 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20  TRACE7("LOCK    
a6d0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
a6e0: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
a6f0: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c  File->h,.      l
a700: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
a710: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
a720: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
a730: 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  ype),.      lock
a740: 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e  typeName(pLock->
a750: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b  locktype), pLock
a760: 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29  ->cnt , getpid()
a770: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
a780: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
a790: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
a7a0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
a7b0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
a7c0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
a7d0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
a7e0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
a7f0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
a800: 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68  * enterMutex() h
a810: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
a820: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
a830: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a840: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
a850: 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
a860: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
a870: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
a880: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
a890: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
a8a0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
a8b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a8c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
a8d0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
a8e0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
a8f0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
a900: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
a910: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
a920: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
a930: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a940: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a950: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
a960: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
a970: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
a980: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
a990: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
a9a0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
a9b0: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
a9c0: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
a9d0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
a9e0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
a9f0: 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65    */.  enterMute
aa00: 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  x();..  /* Make 
aa10: 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  sure the current
aa20: 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65   thread owns the
aa30: 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72   pFile..  */.  r
aa40: 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  c = transferOwne
aa50: 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20  rship(pFile);.  
aa60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
aa70: 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75  K ){.    leaveMu
aa80: 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72  tex();.    retur
aa90: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63  n rc;.  }.  pLoc
aaa0: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
aab0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
aac0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
aad0: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
aae0: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
aaf0: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
ab00: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
ab10: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
ab20: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
ab30: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
ab40: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
ab50: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
ab60: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
ab70: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
ab80: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
ab90: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
aba0: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
abb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
abc0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
abd0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
abe0: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
abf0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
ac00: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
ac10: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
ac20: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
ac30: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
ac40: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
ac50: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
ac60: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
ac70: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
ac80: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
ac90: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
aca0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
acb0: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
acc0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
acd0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
ace0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
acf0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
ad00: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
ad10: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
ad20: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ad30: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
ad40: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
ad50: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
ad60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ad70: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
ad80: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
ad90: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
ada0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
adb0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
adc0: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
add0: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
ade0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
adf0: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
ae00: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
ae10: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
ae20: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
ae30: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
ae40: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
ae50: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
ae60: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
ae70: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
ae80: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
ae90: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
aea0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
aeb0: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
aec0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
aed0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
aee0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
aef0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
af00: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
af10: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
af20: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
af30: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
af40: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
af50: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
af60: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
af70: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
af80: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
af90: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69  =(-1) ){.      i
afa0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
afb0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
afc0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
afd0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
afe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
aff0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
b000: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
b010: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
b020: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b030: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
b040: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
b050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
b060: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
b070: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
b080: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
b090: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
b0a0: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
b0b0: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
b0c0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
b0d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
b0e0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
b0f0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
b100: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  nt tErrno = 0;. 
b110: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
b120: 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ->cnt==0 );.    
b130: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
b140: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20  ocktype==0 );.. 
b150: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
b160: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
b170: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b180: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
b190: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b1a0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
b1b0: 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c    if( (s = fcntl
b1c0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b1d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31  LK, &lock))==(-1
b1e0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
b1f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  o = errno;.    }
b200: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
b210: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
b220: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
b230: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
b240: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
b250: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
b260: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
b270: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
b280: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
b290: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
b2a0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
b2b0: 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20  if( s != -1 ){. 
b2c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
b2d0: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
b2e0: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
b2f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72   */.        tErr
b300: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20  no = errno; .   
b310: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b320: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b330: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b340: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
b350: 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
b360: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
b370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
b380: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b390: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
b3a0: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
b3b0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
b3c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b3d0: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
b3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
b3f0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
b400: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
b410: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
b420: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
b430: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
b440: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b450: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
b460: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
b470: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
b480: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
b490: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
b4a0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
b4b0: 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  +;.      pLock->
b4c0: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  cnt = 1;.    }. 
b4d0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
b4e0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
b4f0: 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e  OCK && pLock->cn
b500: 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  t>1 ){.    /* We
b510: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
b520: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
b530: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
b540: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
b550: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
b560: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
b570: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
b580: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
b590: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
b5a0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
b5b0: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
b5c0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
b5d0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
b5e0: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
b5f0: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
b600: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
b610: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
b620: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
b630: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
b640: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
b650: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
b660: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b670: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
b680: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
b690: 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45  .      case RESE
b6a0: 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  RVED_LOCK:.     
b6b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b6c0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
b6d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b6e0: 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55        case EXCLU
b6f0: 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  SIVE_LOCK:.     
b700: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b710: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
b720: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
b730: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b740: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b750: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
b760: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30          assert(0
b770: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  );.    }.    s =
b780: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
b790: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
b7a0: 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31  ;.    if( s==(-1
b7b0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ) ){.      int t
b7c0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
b7d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b7e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b7f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b800: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
b810: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
b820: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
b830: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b840: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
b850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b860: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
b870: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b880: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b890: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
b8a0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
b8b0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
b8c0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
b8d0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
b8e0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
b8f0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
b900: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  ING_LOCK;.    pL
b910: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
b920: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
b930: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c  }..end_lock:.  l
b940: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
b950: 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
b960: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
b970: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
b980: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
b990: 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
b9a0: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
b9b0: 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
b9c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b9d0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
b9e0: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
b9f0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
ba00: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
ba10: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
ba20: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ba30: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ba40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
ba50: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ba60: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
ba70: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ba80: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ba90: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
baa0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
bab0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
bac0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
bad0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
bae0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
baf0: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73  t locktype){.  s
bb00: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
bb10: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
bb20: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
bb30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bb40: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
bb50: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
bb60: 29 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20  )id;.  int h;.. 
bb70: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
bb80: 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e  ;.  OSTRACE7("UN
bb90: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
bba0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
bbb0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
bbc0: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70  ocktype,.      p
bbd0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
bbe0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
bbf0: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
bc00: 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69  Lock->cnt, getpi
bc10: 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  d());..  assert(
bc20: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
bc30: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
bc40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
bc50: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
bc60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bc70: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45  K;.  }.  if( CHE
bc80: 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c  CK_THREADID(pFil
bc90: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
bca0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
bcb0: 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78    }.  enterMutex
bcc0: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
bcd0: 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46  >h;.  pLock = pF
bce0: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73  ile->pLock;.  as
bcf0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
bd00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
bd10: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
bd20: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
bd30: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
bd40: 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e  ocktype==pFile->
bd50: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
bd60: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
bd70: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
bd80: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
bd90: 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
bda0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
bdb0: 6e 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f  n(0);.    if( lo
bdc0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
bdd0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
bde0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
bdf0: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
be00: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
be10: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
be20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
be30: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
be40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
be50: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
be60: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
be70: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  K, &lock)==(-1) 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
be90: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
bea0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
beb0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
bec0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
bed0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
bee0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
bef0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
bf00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
bf10: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
bf20: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
bf30: 20 20 7d 0a 09 09 09 09 67 6f 74 6f 20 65 6e 64    }.....goto end
bf40: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  _unlock;.      }
bf50: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
bf60: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
bf70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
bf80: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
bf90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bfa0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
bfb0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
bfc0: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
bfd0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
bfe0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
bff0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
c000: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
c010: 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  !=(-1) ){.      
c020: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
c030: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
c040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c050: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
c060: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
c070: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c080: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c090: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
c0a0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c0b0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
c0c0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
c0d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c0e0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
c0f0: 0a 09 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c  ....goto end_unl
c100: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
c110: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
c120: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74  O_LOCK ){.    st
c130: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
c140: 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  pen;..    /* Dec
c150: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
c160: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
c170: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
c180: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
c190: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
c1a0: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
c1b0: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
c1c0: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
c1d0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
c1e0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
c1f0: 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20  Lock->cnt--;.   
c200: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d   if( pLock->cnt=
c210: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
c220: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
c230: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
c240: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c250: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c260: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
c270: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53  en = 0L;.      S
c280: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
c290: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
c2a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
c2b0: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
c2c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
c2d0: 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
c2e0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
c2f0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
c300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ) ){.        pLo
c310: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
c320: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
c330: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
c340: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c350: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c360: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c370: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c380: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
c390: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
c3a0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
c3b0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
c3c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c3d0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
c3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
c3f0: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 09 09  ock->cnt = 1;...
c400: 09 09 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63  ..goto end_unloc
c410: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c420: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
c430: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
c440: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
c450: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
c460: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
c470: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
c480: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
c490: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
c4a0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
c4b0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
c4c0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
c4d0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
c4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c4f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c500: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20  {.      pOpen = 
c510: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
c520: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
c530: 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
c540: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d  ( pOpen->nLock>=
c550: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
c560: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26  Open->nLock==0 &
c570: 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  & pOpen->nPendin
c580: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g>0 ){.        i
c590: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
c5a0: 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
c5b0: 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
c5c0: 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
c5d0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
c5e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
c5f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
c600: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
c610: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  ing);.        pO
c620: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
c630: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  0;.        pOpen
c640: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
c650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c660: 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
c670: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
c680: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c690: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  _OK ) pFile->loc
c6a0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
c6b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c6c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c6d0: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
c6e0: 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  he parts of the 
c6f0: 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65  "close file" ope
c700: 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f  ration .** commo
c710: 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
c720: 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f   schemes. It clo
c730: 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ses the director
c740: 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61  y and file.** ha
c750: 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61  ndles, if they a
c760: 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65  re valid, and se
c770: 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  ts all fields of
c780: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
c790: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e   structure to 0.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
c7b0: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
c7c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
c7d0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
c7e0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
c7f0: 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29  d;.  if( pFile )
c800: 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
c810: 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20  >dirfd>=0 ){.   
c820: 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e     close(pFile->
c830: 64 69 72 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  dirfd);.    }.  
c840: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
c850: 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 ){.      close
c860: 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  (pFile->h);.    
c870: 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 22  }.    OSTRACE2("
c880: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
c890: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
c8a0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
c8b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
c8c0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
c8d0: 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72  xFile));.  }.  r
c8e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c900: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
c910: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
c920: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c930: 29 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  ){.  if( id ){. 
c940: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
c950: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
c960: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
c970: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
c980: 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78  ;.    enterMutex
c990: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
c9a0: 65 2d 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c  e->pOpen && pFil
c9b0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  e->pOpen->nLock 
c9c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
c9d0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
c9e0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
c9f0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
ca00: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
ca10: 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
ca20: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
ca30: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
ca40: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
ca50: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
ca60: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
ca70: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
ca80: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
ca90: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
caa0: 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
cab0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
cac0: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
cad0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   */.      int *a
cae0: 4e 65 77 3b 0a 20 20 20 20 20 20 73 74 72 75 63  New;.      struc
caf0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
cb00: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
cb10: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71  .      aNew = sq
cb20: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4f  lite3_realloc(pO
cb30: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28  pen->aPending, (
cb40: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
cb50: 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  1)*sizeof(int) )
cb60: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
cb70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
cb80: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
cb90: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
cba0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
cbb0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  or */.      }els
cbc0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  e{.        pOpen
cbd0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
cbe0: 77 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e  w;.        pOpen
cbf0: 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e  ->aPending[pOpen
cc00: 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70 46  ->nPending] = pF
cc10: 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 20 20  ile->h;.        
cc20: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
cc30: 2b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  +;.        pFile
cc40: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ->h = -1;.      
cc50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  }.    }.    rele
cc60: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
cc70: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
cc80: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
cc90: 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  ile->pOpen);.   
cca0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
ccb0: 64 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74  d);.    leaveMut
ccc0: 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ex();.  }.  retu
ccd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cce0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ccf0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
cd00: 54 59 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61 72  TYLE.#pragma mar
cd10: 6b 20 41 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f  k AFP Support../
cd20: 2a 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  *. ** The afpLoc
cd30: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
cd40: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
cd50: 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
cd60: 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74  ific state. */.t
cd70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
cd80: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
cd90: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
cda0: 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
cdb0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
cdc0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
cdd0: 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
cde0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
cdf0: 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73  *filePath;.};..s
ce00: 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
ce10: 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
ce20: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
ce30: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
ce40: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
ce50: 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
ce60: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
ce70: 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
ce80: 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
ce90: 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
cea0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
ceb0: 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
cec0: 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
ced0: 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
cee0: 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
cef0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
cf00: 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
cf10: 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
cf20: 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
cf30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
cf40: 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
cf50: 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
cf60: 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
cf70: 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
cf80: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
cfb0: 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
cfc0: 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
cfd0: 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
cfe0: 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
cff0: 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
d000: 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
d010: 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20  ngeLockPB2)../* 
d020: 0a 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  . ** Return SQLI
d030: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d040: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
d050: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 2f 0a 73 74   failure.. */.st
d060: 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53  atic int _AFPFSS
d070: 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
d080: 63 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 75  char *path, .  u
d090: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
d0a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
d0b0: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20   long offset, . 
d0c0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
d0d0: 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69  ong length, .  i
d0e0: 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29  nt setLockFlag.)
d0f0: 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
d100: 61 6e 67 65 4c 6f 63 6b 50 42 32 20 20 20 20 20  angeLockPB2     
d110: 20 20 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20    pb;.  int     
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
d140: 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
d150: 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
d160: 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
d170: 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
d180: 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
d190: 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
d1a0: 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
d1b0: 6c 65 2d 3e 68 3b 0a 20 20 4f 53 54 52 41 43 45  le->h;.  OSTRACE
d1c0: 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69  5("AFPLOCK setti
d1d0: 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25  ng lock %s for %
d1e0: 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  d in range %llx:
d1f0: 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
d200: 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
d210: 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
d220: 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68  , offset, length
d230: 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
d240: 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
d250: 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
d260: 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
d270: 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
d280: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
d290: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d2a0: 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 41  .    OSTRACE4("A
d2b0: 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  FPLOCK failed to
d2c0: 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
d2d0: 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20 74 45   %s\n", path, tE
d2e0: 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
d2f0: 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20  Errno));.    rc 
d300: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
d310: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
d320: 6e 6f 2c 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  no, setLockFlag 
d330: 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
d340: 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
d350: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 2f 2a 20 65  RR_UNLOCK); /* e
d360: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
d370: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d380: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
d390: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d3a0: 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
d3b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
d3c0: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
d3d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d3e0: 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20  }../* AFP-style 
d3f0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 63 68  reserved lock ch
d400: 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ecking following
d410: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
d420: 20 0a 2a 2a 20 75 6e 69 78 43 68 65 63 6b 52 65   .** unixCheckRe
d430: 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73 65 65 20  servedLock, see 
d440: 74 68 65 20 75 6e 69 78 43 68 65 63 6b 52 65 73  the unixCheckRes
d450: 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e 63 74 69  ervedLock functi
d460: 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 73  on comments */.s
d470: 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
d480: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
d490: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d4a0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
d4b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d4c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
d4d0: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
d4e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d4f0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
d500: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d510: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
d520: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
d530: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
d540: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
d550: 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  );.  afpLockingC
d560: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d570: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d580: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d590: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d5a0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
d5b0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d5c0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d5d0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d5e0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d5f0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d600: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
d610: 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
d620: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
d630: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
d640: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
d650: 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
d660: 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
d670: 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
d680: 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
d690: 20 6c 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74   lrc = _AFPFSSet
d6a0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
d6b0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  lePath, pFile, R
d6c0: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
d6d0: 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
d6e0: 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
d6f0: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
d700: 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
d710: 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
d720: 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
d730: 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
d740: 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
d750: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
d760: 6c 72 63 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  lrc = _AFPFSSetL
d770: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
d780: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  ePath, pFile, RE
d790: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
d7a0: 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
d7b0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
d7c0: 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
d7d0: 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
d7e0: 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
d7f0: 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
d800: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
d810: 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
d820: 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
d830: 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
d840: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 4f 53     }.  }.  .  OS
d850: 54 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d  TRACE4("TEST WR-
d860: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 5c 6e 22  LOCK %d %d %d\n"
d870: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
d880: 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20  reserved);.  .  
d890: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
d8a0: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
d8b0: 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c  ;.}../* AFP-styl
d8c0: 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77  e locking follow
d8d0: 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72  ing the behavior
d8e0: 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65   of unixLock, se
d8f0: 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a  e the unixLock .
d900: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d  ** function comm
d910: 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73  ents for details
d920: 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d   of lock managem
d930: 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  ent. */.static i
d940: 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
d950: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d960: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
d970: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d980: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d990: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d9a0: 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  )id;.  afpLockin
d9b0: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
d9c0: 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
d9d0: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
d9e0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
d9f0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
da00: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
da10: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  5("LOCK    %d %s
da20: 20 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e   was %s pid=%d\n
da30: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
da40: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
da50: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f  me(locktype), lo
da60: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
da70: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74  ->locktype), get
da80: 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
da90: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
daa0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
dab0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
dac0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
dad0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
dae0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
daf0: 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
db00: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
db10: 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72  h, as.  ** enter
db20: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
db30: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
db40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
db50: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
db60: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
db70: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
db80: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
db90: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
dba0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
dbb0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
dbc0: 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75  type));.    retu
dbd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
dbe0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
dbf0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
dc00: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
dc10: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
dc20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
dc30: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
dc40: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
dc50: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
dc60: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
dc70: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
dc80: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
dc90: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
dca0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
dcb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
dcc0: 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
dcd0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
dce0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
dcf0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
dd00: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
dd10: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a   enterMutex();..
dd20: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
dd30: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
dd40: 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
dd50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
dd60: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
dd70: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
dd80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dd90: 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
dda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
ddb0: 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
ddc0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
ddd0: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
dde0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
ddf0: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
de00: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
de10: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
de20: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
de30: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
de40: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
de50: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
de60: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
de70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
de80: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
de90: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dea0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
deb0: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
dec0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
ded0: 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
dee0: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
def0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
df00: 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
df10: 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
df20: 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
df30: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
df40: 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
df50: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
df60: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
df70: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
df80: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
df90: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
dfa0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
dfb0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
dfc0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
dfd0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
dfe0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ck..  */.  if( l
dff0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
e000: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
e010: 6c 6b 2c 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  lk, lrc1, lrc2, 
e020: 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 0a  lrc1Errno;.    .
e030: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
e040: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
e050: 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
e060: 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
e070: 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
e080: 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
e090: 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
e0a0: 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
e0b0: 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63  random(); .    c
e0c0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e0d0: 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30  ckByte = (lk & 0
e0e0: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
e0f0: 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
e100: 20 20 6c 72 63 31 20 3d 20 5f 41 46 50 46 53 53    lrc1 = _AFPFSS
e110: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
e120: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
e130: 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
e140: 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78 74  ED_FIRST+context
e150: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
e160: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
e170: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
e180: 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
e190: 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
e1a0: 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
e1b0: 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
e1c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
e1d0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
e1e0: 6c 72 63 32 20 3d 20 5f 41 46 50 46 53 53 65 74  lrc2 = _AFPFSSet
e1f0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e200: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  lePath, pFile, P
e210: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
e220: 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
e230: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
e240: 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70  rc1) ) {.      p
e250: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e260: 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  = lrc1Errno;.   
e270: 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
e280: 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
e290: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
e2a0: 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
e2b0: 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
e2c0: 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
e2d0: 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
e2e0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
e2f0: 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
e300: 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
e310: 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
e320: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e330: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e340: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e350: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e360: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
e370: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
e380: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
e390: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
e3a0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
e3b0: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
e3c0: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
e3d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
e3e0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
e3f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
e400: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
e410: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
e420: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
e430: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
e440: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
e450: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
e460: 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
e470: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
e480: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
e490: 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
e4a0: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
e4b0: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
e4c0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
e4d0: 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
e4e0: 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20  E, 1,1);.    }. 
e4f0: 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
e500: 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58  & locktype == EX
e510: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
e520: 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
e530: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
e540: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
e550: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
e560: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
e570: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
e580: 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
e590: 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
e5a0: 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
e5b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
e5c0: 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
e5d0: 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
e5e0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21    */.      if (!
e5f0: 28 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53  (failed = _AFPFS
e600: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
e610: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
e620: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
e630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e640: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
e650: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
e660: 65 2c 20 31 2c 20 30 29 29 29 20 7b 0a 20 20 20  e, 1, 0))) {.   
e670: 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
e680: 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
e690: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
e6a0: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
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 2c 20 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 20 20 20 20 20 20 53                 S
e710: 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a  HARED_SIZE, 1);.
e720: 20 20 20 20 20 20 20 20 69 66 20 28 66 61 69 6c          if (fail
e730: 65 64 20 26 26 20 28 66 61 69 6c 65 64 20 3d 20  ed && (failed = 
e740: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e750: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e760: 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63  SHARED_FIRST + c
e790: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e7a0: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 29 20  ckByte, 1, 1))) 
e7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
e7c0: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
e7d0: 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
e7e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
e7f0: 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
e800: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
e810: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
e820: 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
e830: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
e840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e850: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
e860: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
e870: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
e880: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
e890: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
e8a0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
e8b0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
e8c0: 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
e8d0: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
e8e0: 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b    OSTRACE4("LOCK
e8f0: 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
e900: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
e910: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
e920: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
e930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
e940: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
e950: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e960: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
e970: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
e980: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e990: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
e9a0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
e9b0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e9c0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e9d0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e9e0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e9f0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
ea00: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
ea10: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
ea20: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
ea30: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
ea40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ea50: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
ea60: 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
ea70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ea80: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
ea90: 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
eaa0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
eab0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
eac0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
ead0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
eae0: 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
eaf0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
eb00: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
eb10: 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
eb20: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
eb30: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
eb40: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
eb50: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
eb60: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
eb70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
eb80: 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b  type, getpid());
eb90: 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
eba0: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
ebb0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ebc0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
ebd0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
ebe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ebf0: 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
ec00: 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
ec10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ec20: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
ec30: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
ec40: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 53 51   int failed = SQ
ec50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
ec60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
ec70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ec80: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ec90: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a  SHARED_LOCK ){..
eca0: 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
ecb0: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61  the exclusive ra
ecc0: 6e 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73  nge - then re-es
ecd0: 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
ece0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
ecf0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
ed00: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
ed10: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
ed20: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
ed30: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
ed40: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
ed50: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
ed90: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66  ;.        if (!f
eda0: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ailed) {.       
edb0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c     /* successful
edc0: 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65  ly removed the e
edd0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
ede0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28  .          if ((
edf0: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
ee00: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
ee10: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2c  filePath, pFile,
ee20: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 0a 20   SHARED_FIRST+. 
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65             conte
ee50: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
ee60: 74 65 2c 20 31 2c 20 31 29 29 29 20 7b 0a 20 20  te, 1, 1))) {.  
ee70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69            /* fai
ee80: 6c 65 64 20 74 6f 20 72 65 2d 65 73 74 61 62 6c  led to re-establ
ee90: 69 73 68 20 6f 75 72 20 73 68 61 72 65 64 20 6c  ish our shared l
eea0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ock */.         
eeb0: 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
eec0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eed0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
eee0: 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
eef0: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ed;.        } . 
ef00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ef10: 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54   if (rc == SQLIT
ef20: 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  E_OK && pFile->l
ef30: 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  ocktype>=PENDING
ef40: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 69  _LOCK) {.      i
ef50: 66 20 28 28 66 61 69 6c 65 64 20 3d 20 5f 41 46  f ((failed = _AF
ef60: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
ef70: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
ef80: 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
efb0: 42 59 54 45 2c 20 31 2c 20 30 29 29 29 7b 0a 20  BYTE, 1, 0))){. 
efc0: 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64         /* failed
efd0: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
efe0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
eff0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
f000: 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
f010: 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63 20    } .    if (rc 
f020: 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  == SQLITE_OK && 
f030: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
f040: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
f050: 7b 0a 20 20 20 20 20 20 69 66 20 28 28 66 61 69  {.      if ((fai
f060: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f070: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f080: 65 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  ePath, pFile, . 
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
f0c0: 31 2c 20 30 29 29 29 20 7b 0a 20 20 20 20 20 20  1, 0))) {.      
f0d0: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
f0e0: 65 6c 65 61 73 65 20 74 68 65 20 72 65 73 65 72  elease the reser
f0f0: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ved lock */.    
f100: 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
f110: 20 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d    .      }.    }
f120: 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b   .  }.  if( lock
f130: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
f140: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
f150: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
f160: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
f170: 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
f1a0: 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74  _FIRST + context
f1b0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
f1c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  , 1, 0);.    if 
f1d0: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
f1e0: 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 20 0a   rc = failed;  .
f1f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28      }.  }.  if (
f200: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  rc == SQLITE_OK)
f210: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
f220: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
f230: 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
f240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f250: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
f260: 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
f270: 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
f280: 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
f290: 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
f2a0: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f2b0: 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
f2c0: 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
f2d0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f2e0: 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55  le*)id;.    afpU
f2f0: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
f300: 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
f310: 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
f320: 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
f330: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
f340: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
f350: 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c  .#pragma mark fl
f360: 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b  ock() style lock
f370: 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ing../*.** The f
f380: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f390: 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 2a  xt is not used.*
f3a0: 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 66  /.typedef void f
f3b0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f3c0: 78 74 3b 0a 0a 2f 2a 20 66 6c 6f 63 6b 2d 73 74  xt;../* flock-st
f3d0: 79 6c 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  yle reserved loc
f3e0: 6b 20 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f  k checking follo
f3f0: 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f  wing the behavio
f400: 72 20 6f 66 20 0a 20 2a 2a 20 75 6e 69 78 43 68  r of . ** unixCh
f410: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
f420: 20 73 65 65 20 74 68 65 20 75 6e 69 78 43 68 65   see the unixChe
f430: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 66  ckReservedLock f
f440: 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  unction comments
f450: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
f460: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
f470: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f480: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f490: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
f4a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f4b0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
f4c0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f4d0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f4e0: 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
f4f0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
f500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
f510: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
f520: 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
f530: 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
f540: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
f550: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
f560: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
f570: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
f580: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
f590: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
f5a0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
f5b0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
f5c0: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
f5d0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
f5e0: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
f5f0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
f600: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
f610: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
f620: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
f630: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f640: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
f650: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
f660: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
f670: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
f680: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
f690: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f6a0: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f6b0: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
f6c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
f6d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f6e0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
f6f0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
f700: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
f710: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f720: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f730: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f740: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
f750: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f760: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
f770: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f780: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f790: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f7a0: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
f7b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f7c0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
f7d0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
f7e0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
f7f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
f800: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
f810: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
f820: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
f830: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f840: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f850: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f860: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
f870: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f880: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
f890: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f8a0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f8b0: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
f8c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f8d0: 20 20 4f 53 54 52 41 43 45 34 28 22 54 45 53 54    OSTRACE4("TEST
f8e0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
f8f0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
f900: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
f910: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
f920: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
f930: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
f940: 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
f950: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f960: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f970: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f980: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
f990: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f9a0: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
f9b0: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
f9c0: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
f9d0: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
f9e0: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
f9f0: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
fa00: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
fa10: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
fa20: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
fa30: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
fa40: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
fa50: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
fa60: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
fa70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fa80: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
fa90: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
faa0: 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
fab0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
fac0: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
fad0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fae0: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
faf0: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
fb00: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
fb10: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fb20: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fb30: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fb40: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
fb50: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
fb60: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
fb70: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fb80: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
fb90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
fba0: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
fbb0: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
fbc0: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
fbd0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
fbe0: 79 70 65 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ype;.  }.  OSTRA
fbf0: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
fc00: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
fc10: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
fc20: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
fc30: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
fc40: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
fc50: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
fc60: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
fc70: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
fc80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fc90: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
fca0: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
fcb0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fcc0: 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
fcd0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
fce0: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20  TRACE5("UNLOCK  
fcf0: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
fd00: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
fd10: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
fd20: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
fd30: 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
fd40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
fd50: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
fd60: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
fd70: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
fd80: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fd90: 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
fda0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
fdb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fdc0: 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
fdd0: 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
fde0: 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
fdf0: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
fe00: 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
fe10: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
fe20: 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
fe30: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
fe40: 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
fe50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fe60: 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
fe70: 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
fe80: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
fe90: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
fea0: 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20  );.  if (rc) {. 
feb0: 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f     int r, tErrno
fec0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20   = errno;.    r 
fed0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
fee0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
fef0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ff00: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
ff10: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
ff20: 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  r) ){.      pFil
ff30: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
ff40: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
ff50: 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65   return r;.  } e
ff60: 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
ff70: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
ff80: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
ff90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
ffa0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
ffb0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
ffc0: 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
ffd0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
ffe0: 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
fff0: 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
10000 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
10010 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
10020 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
10030 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64  #pragma mark Old
10040 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69  -School .lock fi
10050 6c 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67  le based locking
10060 0a 0a 2f 2a 20 44 6f 74 6c 6f 63 6b 2d 73 74 79  ../* Dotlock-sty
10070 6c 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  le reserved lock
10080 20 63 68 65 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77   checking follow
10090 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72  ing the behavior
100a0 20 6f 66 20 0a 2a 2a 20 75 6e 69 78 43 68 65 63   of .** unixChec
100b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 73  kReservedLock, s
100c0 65 65 20 74 68 65 20 75 6e 69 78 43 68 65 63 6b  ee the unixCheck
100d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 66 75 6e  ReservedLock fun
100e0 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 2a  ction comments *
100f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10100 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
10110 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
10120 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
10130 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
10140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10150 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
10160 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
10170 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10180 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
10190 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
101a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
101b0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
101c0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
101d0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
101e0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
101f0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
10200 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
10210 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
10220 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
10230 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
10240 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
10250 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
10260 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
10270 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
10280 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
10290 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
102a0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
102b0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
102c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
102d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
102e0 74 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20 0a  t statBuf;.    .
102f0 20 20 20 20 69 66 28 20 6c 73 74 61 74 28 7a 4c      if( lstat(zL
10300 6f 63 6b 46 69 6c 65 2c 20 26 73 74 61 74 42 75  ockFile, &statBu
10310 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  f)==0 ){.      /
10320 2a 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 73  * file exists, s
10330 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
10340 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
10350 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
10360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10370 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f   /* file does no
10380 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c  t exist, we coul
10390 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
103a0 77 61 6e 74 20 69 74 20 2a 2f 0a 09 09 09 69 6e  want it */....in
103b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
103c0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 4e 4f 45  ;.      if( ENOE
103d0 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
103e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
103f0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10400 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
10420 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
10430 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
10440 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10450 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
10460 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
10470 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
10480 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
10490 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
104a0 64 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  d);..  *pResOut 
104b0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
104c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
104d0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
104e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
104f0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
10500 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
10510 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10520 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10530 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
10540 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
10550 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
10560 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3d 53 51  ext;.  int rc=SQ
10570 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
10580 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
10590 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
105a0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
105b0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
105c0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
105d0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
105e0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
105f0 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
10600 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10610 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10620 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c  ;.    .    /* Al
10630 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
10640 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
10650 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
10660 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
10670 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 63  e, NULL);.    rc
10680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10690 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b 5f 65    goto dotlock_e
106a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
106b0 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65    /* check to se
106c0 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61  e if lock file a
106d0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
106e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
106f0 74 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73  tatBuf;.  if (ls
10700 74 61 74 28 7a 4c 6f 63 6b 46 69 6c 65 2c 26 73  tat(zLockFile,&s
10710 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20  tatBuf) == 0){. 
10720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10730 55 53 59 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c  USY; /* it does,
10740 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 67 6f 74   busy */.    got
10750 6f 20 64 6f 74 6c 6f 63 6b 5f 65 6e 64 5f 6c 6f  o dotlock_end_lo
10760 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
10770 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
10780 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d  e lock */.  fd =
10790 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c   open(zLockFile,
107a0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
107b0 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
107c0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
107d0 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
107e0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
107f0 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
10800 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
10810 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
10820 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10830 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
10840 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
10850 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10860 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
10870 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
10880 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10890 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
108a0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
108b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
108c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
108d0 63 29 20 29 7b 0a 09 70 46 69 6c 65 2d 3e 6c 61  c) ){..pFile->la
108e0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
108f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10900 20 20 20 20 67 6f 74 6f 20 64 6f 74 6c 6f 63 6b      goto dotlock
10910 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 20 0a  _end_lock;.  } .
10920 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a    close(fd);.  .
10930 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
10940 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
10950 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
10960 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
10970 6f 63 6b 74 79 70 65 3b 0a 0a 20 64 6f 74 6c 6f  ocktype;.. dotlo
10980 63 6b 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  ck_end_lock:.  r
10990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
109a0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109b0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
109c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
109d0 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
109e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
109f0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
10a00 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
10a10 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
10a20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20  ckingContext;.. 
10a30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10a40 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
10a50 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
10a60 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
10a70 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
10a80 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ,..   pFile->loc
10a90 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
10aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
10ab0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
10ac0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
10ad0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
10ae0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
10af0 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70  ocktype==locktyp
10b00 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10b20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
10b30 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
10b40 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
10b50 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
10b60 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74  e */.  if (lockt
10b70 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
10b80 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
10b90 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
10ba0 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
10bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10bc0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
10bd0 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
10be0 66 20 28 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46  f (unlink(zLockF
10bf0 69 6c 65 29 20 29 20 7b 0a 20 20 20 20 69 6e 74  ile) ) {.    int
10c00 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
10c10 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
10c20 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
10c30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10c40 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
10c50 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
10c60 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
10c70 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  K);.    }.    if
10c80 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10c90 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
10ca0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10cb0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
10cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
10cd0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
10ce0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
10cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10d00 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
10d10 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
10d20 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
10d30 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
10d40 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
10d50 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10d60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10d70 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10d80 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
10d90 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
10da0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
10db0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
10dc0 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xt);.  }.  retur
10dd0 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
10de0 69 64 29 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20  id);.}...#endif 
10df0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10e00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
10e10 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c  /../*.** The nol
10e20 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10e30 74 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79 70  t is void.*/.typ
10e40 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b  edef void nolock
10e50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
10e60 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10e70 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10e80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10e90 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
10ea0 75 74 29 20 7b 0a 20 20 2a 70 52 65 73 4f 75 74  ut) {.  *pResOut
10eb0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
10ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
10ed0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10ee0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10ef0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
10f00 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  e) {.  return SQ
10f10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
10f20 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
10f30 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10f40 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10f50 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53  pe) {.  return S
10f60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10f70 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
10f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10f90 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
10fa0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10fb0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
10fc0 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 0a 2f  xFile(id);.}.../
10fd0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
10fe0 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
10ff0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
11000 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
11010 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
11020 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
11030 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
11040 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
11050 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
11060 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
11070 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
11080 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
11090 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
110a0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
110b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
110c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
110d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
110e0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
110f0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
11100 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
11110 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
11120 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
11130 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
11140 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
11150 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
11160 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
11170 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
11180 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
11190 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
111a0 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
111b0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
111c0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
111d0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
111e0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
111f0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
11200 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
11210 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
11220 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
11230 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
11240 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
11250 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
11260 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
11270 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
11280 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
11290 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
112a0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
112b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
112c0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
112d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
112e0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
112f0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
11300 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  e. This is alway
11310 73 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 0..*/.static i
11320 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
11330 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
11340 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11350 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11360 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
11370 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
11380 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
11390 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
113a0 6f 20 62 79 20 70 49 64 2e 0a 2a 2a 0a 2a 2a 20  o by pId..**.** 
113b0 57 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74  When locking ext
113c0 65 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62  ensions are enab
113d0 6c 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74  led, the filepat
113e0 68 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74  h and locking st
113f0 79 6c 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64  yle .** are need
11400 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11410 74 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65  the unixFile pMe
11420 74 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20  thod to use for 
11430 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
11440 6e 73 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ns..** The locki
11450 6e 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng-style specifi
11460 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  c lockingContext
11470 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
11480 69 73 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61  is created .** a
11490 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65  nd assigned here
114a0 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
114b0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
114c0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
114d0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
114e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
114f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
11500 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
11510 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
11520 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
11530 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
11540 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
11550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11560 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
11570 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
11580 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
11590 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
115a0 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
115b0 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
115c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
115d0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
115e0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
115f0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
11600 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 20 20  /.  int noLock  
11610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11620 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74  mit locking if t
11630 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
11640 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  eLockingStyle;. 
11650 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
11660 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
11670 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
11680 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d  LITE_OK;..  /* M
11690 61 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74  acro to define t
116a0 68 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  he static conten
116b0 74 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  ts of an sqlite3
116c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
116d0 2a 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  * structure for 
116e0 61 20 75 6e 69 78 20 62 61 63 6b 65 6e 64 20 66  a unix backend f
116f0 69 6c 65 2e 20 44 69 66 66 65 72 65 6e 74 20 6c  ile. Different l
11700 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 0a 20  ocking methods. 
11710 20 2a 2a 20 72 65 71 75 69 72 65 20 64 69 66 66   ** require diff
11720 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20  erent functions 
11730 66 6f 72 20 74 68 65 20 78 43 6c 6f 73 65 2c 20  for the xClose, 
11740 78 4c 6f 63 6b 2c 20 78 55 6e 6c 6f 63 6b 20 61  xLock, xUnlock a
11750 6e 64 0a 20 20 2a 2a 20 78 43 68 65 63 6b 52 65  nd.  ** xCheckRe
11760 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
11770 64 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69  ds..  */.  #defi
11780 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 78 43 6c  ne IOMETHODS(xCl
11790 6f 73 65 2c 20 78 4c 6f 63 6b 2c 20 78 55 6e 6c  ose, xLock, xUnl
117a0 6f 63 6b 2c 20 78 43 68 65 63 6b 52 65 73 65 72  ock, xCheckReser
117b0 76 65 64 4c 6f 63 6b 29 20 7b 20 20 20 20 5c 0a  vedLock) {    \.
117c0 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78           \.    x
11810 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
11820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
11830 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 65      \.    unixRe
11860 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
11870 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
11880 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
118a0 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  .    unixWrite, 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
118f0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
11900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11910 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53       \.    unixS
11940 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
11950 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
11960 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 5c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69  \.    unixFileSi
11990 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
119a0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
119b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
119c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
119d0 20 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20   xLock,         
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119f0 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 20 5c 0a 20 20 20 20 78 55 6e 6c        \.    xUnl
11a20 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
11a30 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
11a40 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 5c 0a 20 20 20 20 78 43 68 65 63 6b 52 65 73   \.    xCheckRes
11a70 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
11a80 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
11a90 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
11ab0 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
11ac0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
11ad0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
11b00 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
11b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
11b20 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 76 69    \.    unixDevi
11b50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11b60 73 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s   /* xDeviceCa
11b70 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
11b90 20 7d 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69   }.  static sqli
11ba0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
11bb0 49 6f 4d 65 74 68 6f 64 5b 5d 20 3d 20 7b 0a 20  IoMethod[] = {. 
11bc0 20 20 20 49 4f 4d 45 54 48 4f 44 53 28 75 6e 69     IOMETHODS(uni
11bd0 78 43 6c 6f 73 65 2c 20 75 6e 69 78 4c 6f 63 6b  xClose, unixLock
11be0 2c 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 75 6e  , unixUnlock, un
11bf0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
11c00 6f 63 6b 29 20 0a 20 20 20 2c 49 4f 4d 45 54 48  ock) .   ,IOMETH
11c10 4f 44 53 28 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  ODS(nolockClose,
11c20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 6e 6f 6c   nolockLock, nol
11c30 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 6e 6f 6c 6f 63  ockUnlock, noloc
11c40 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
11c50 63 6b 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ck).#ifdef SQLIT
11c60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
11c70 5f 53 54 59 4c 45 0a 20 20 20 2c 49 4f 4d 45 54  _STYLE.   ,IOMET
11c80 48 4f 44 53 28 64 6f 74 6c 6f 63 6b 43 6c 6f 73  HODS(dotlockClos
11c90 65 2c 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  e, dotlockLock, 
11ca0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 64 6f  dotlockUnlock,do
11cb0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11cc0 65 64 4c 6f 63 6b 29 0a 20 20 20 2c 49 4f 4d 45  edLock).   ,IOME
11cd0 54 48 4f 44 53 28 66 6c 6f 63 6b 43 6c 6f 73 65  THODS(flockClose
11ce0 2c 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 66 6c 6f  , flockLock, flo
11cf0 63 6b 55 6e 6c 6f 63 6b 2c 20 66 6c 6f 63 6b 43  ckUnlock, flockC
11d00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11d10 29 0a 20 20 20 2c 49 4f 4d 45 54 48 4f 44 53 28  ).   ,IOMETHODS(
11d20 61 66 70 43 6c 6f 73 65 2c 20 61 66 70 4c 6f 63  afpClose, afpLoc
11d30 6b 2c 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 61 66  k, afpUnlock, af
11d40 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
11d50 63 6b 29 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a  ck).#endif.  };.
11d60 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 6f    /* The order o
11d70 66 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 20  f the IOMETHODS 
11d80 6d 61 63 72 6f 73 20 61 62 6f 76 65 20 69 73 20  macros above is 
11d90 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 74 20 6d  important.  It m
11da0 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20  ust be the.  ** 
11db0 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68  same order as th
11dc0 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  e LOCKING_STYLE 
11dd0 6e 75 6d 62 65 72 73 0a 20 20 2a 2f 0a 20 20 61  numbers.  */.  a
11de0 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f 53 54  ssert(LOCKING_ST
11df0 59 4c 45 5f 50 4f 53 49 58 3d 3d 31 29 3b 0a 20  YLE_POSIX==1);. 
11e00 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47 5f   assert(LOCKING_
11e10 53 54 59 4c 45 5f 4e 4f 4e 45 3d 3d 32 29 3b 0a  STYLE_NONE==2);.
11e20 20 20 61 73 73 65 72 74 28 4c 4f 43 4b 49 4e 47    assert(LOCKING
11e30 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c 45 3d 3d  _STYLE_DOTFILE==
11e40 33 29 3b 0a 20 20 61 73 73 65 72 74 28 4c 4f 43  3);.  assert(LOC
11e50 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b  KING_STYLE_FLOCK
11e60 3d 3d 34 29 3b 0a 20 20 61 73 73 65 72 74 28 4c  ==4);.  assert(L
11e70 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 41 46 50  OCKING_STYLE_AFP
11e80 3d 3d 35 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ==5);..  assert(
11e90 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 3d 3d 4e 55   pNew->pLock==NU
11ea0 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
11eb0 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d 3d 4e 55 4c  pNew->pOpen==NUL
11ec0 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 33  L );..  OSTRACE3
11ed0 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
11ee0 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
11ef0 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65 77 2d  me);    .  pNew-
11f00 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
11f10 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20  dirfd = dirfd;. 
11f20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e   SET_THREADID(pN
11f30 65 77 29 3b 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f  ew);..  if( noLo
11f40 63 6b 20 29 7b 0a 20 20 20 20 65 4c 6f 63 6b 69  ck ){.    eLocki
11f50 6e 67 53 74 79 6c 65 20 3d 20 4c 4f 43 4b 49 4e  ngStyle = LOCKIN
11f60 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45 3b 0a 20 20  G_STYLE_NONE;.  
11f70 7d 65 6c 73 65 7b 0a 20 20 20 20 65 4c 6f 63 6b  }else{.    eLock
11f80 69 6e 67 53 74 79 6c 65 20 3d 20 64 65 74 65 63  ingStyle = detec
11f90 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 70 56  tLockingStyle(pV
11fa0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 68  fs, zFilename, h
11fb0 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
11fc0 28 20 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( eLockingStyle 
11fd0 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 4c 4f 43  ){..    case LOC
11fe0 4b 49 4e 47 5f 53 54 59 4c 45 5f 50 4f 53 49 58  KING_STYLE_POSIX
11ff0 3a 20 7b 0a 20 20 20 20 20 20 65 6e 74 65 72 4d  : {.      enterM
12000 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
12010 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
12020 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c  h, &pNew->pLock,
12030 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a   &pNew->pOpen);.
12040 20 20 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78        leaveMutex
12050 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
12060 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
12070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
12080 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 63  KING_STYLE.    c
12090 61 73 65 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  ase LOCKING_STYL
120a0 45 5f 41 46 50 3a 20 7b 0a 20 20 20 20 20 20 2f  E_AFP: {.      /
120b0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
120c0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
120d0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
120e0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
120f0 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c       ** the afpL
12100 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
12110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
12120 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12130 2a 70 43 74 78 3b 0a 20 20 20 20 20 20 70 4e 65  *pCtx;.      pNe
12140 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12150 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
12160 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
12170 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
12180 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
12190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
121a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
121b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
121c0 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
121d0 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
121e0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
121f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
12200 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sed.        ** a
12210 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
12220 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
12230 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
12240 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
12250 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
12260 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
12270 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 66  .        pCtx->f
12280 69 6c 65 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ilePath = zFilen
12290 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 72 61  ame;.        sra
122a0 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
122b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
122c0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
122d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 44 4f  LOCKING_STYLE_DO
122e0 54 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 2f  TFILE: {.      /
122f0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
12300 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
12310 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
12320 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
12330 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  in.      ** the 
12340 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
12350 6e 74 65 78 74 20 0a 20 20 20 20 20 20 2a 2f 0a  ntext .      */.
12360 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63        char *zLoc
12370 6b 46 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  kFile;.      int
12380 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
12390 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74    nFilename = st
123a0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
123b0 2b 20 36 3b 0a 20 20 20 20 20 20 7a 4c 6f 63 6b  + 6;.      zLock
123c0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
123d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46  qlite3_malloc(nF
123e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
123f0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
12400 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12430 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12440 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
12450 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 2e 6c  zLockFile, "%s.l
12460 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ock", zFilename)
12470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12480 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
12490 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
124a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
124b0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 4c     }..    case L
124c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 46 4c 4f  OCKING_STYLE_FLO
124d0 43 4b 3a 20 0a 20 20 20 20 63 61 73 65 20 4c 4f  CK: .    case LO
124e0 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e 4f 4e 45  CKING_STYLE_NONE
124f0 3a 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  : .      break;.
12500 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
12510 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
12520 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
12530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12540 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
12550 6c 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20  lose(dirfd);.   
12560 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c   close(h);.  }el
12570 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
12580 65 74 68 6f 64 20 3d 20 26 61 49 6f 4d 65 74 68  ethod = &aIoMeth
12590 6f 64 5b 65 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  od[eLockingStyle
125a0 2d 31 5d 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  -1];.    OpenCou
125b0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20  nter(+1);.  }.  
125c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
125d0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
125e0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
125f0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
12600 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
12610 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
12620 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
12630 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
12640 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
12650 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
12660 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
12670 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12680 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
12690 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
126a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
126b0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
126c0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
126d0 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
126e0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  lue..**.** If SQ
126f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
12700 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
12710 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
12720 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
12730 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12740 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
12750 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
12760 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
12770 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
12780 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
12790 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
127a0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
127b0 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
127c0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
127d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
127e0 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
127f0 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
12800 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
12810 72 28 69 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72  r(ii=strlen(zDir
12820 6e 61 6d 65 29 3b 20 69 69 3e 3d 30 20 26 26 20  name); ii>=0 && 
12830 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
12840 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
12850 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
12860 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
12870 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
12880 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
12890 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
128a0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
128b0 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
128c0 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
128d0 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
128e0 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
128f0 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
12900 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
12910 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
12920 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
12930 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  zDirname);.    }
12940 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
12950 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
12960 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
12970 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a  TE_CANTOPEN);.}.
12980 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
12990 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
129a0 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
129b0 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  uf must be alloc
129c0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
129d0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61  alling process a
129e0 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  nd must be big e
129f0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74  nough to hold at
12a00 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e   least.** pVfs->
12a10 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
12a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12a30 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  getTempname(int 
12a40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
12a50 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
12a60 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
12a70 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
12a80 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
12a90 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
12aa0 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
12ab0 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
12ac0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
12ad0 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
12ae0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
12af0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
12b00 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
12b10 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
12b20 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
12b30 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20  6789";.  int i, 
12b40 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
12b50 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
12b60 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
12b70 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
12b80 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
12b90 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
12ba0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
12bb0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
12bc0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
12bd0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
12be0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
12bf0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
12c00 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
12c10 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
12c20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
12c30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12c40 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   );..  azDirs[0]
12c50 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
12c60 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 66 6f 72  directory;.  for
12c70 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
12c80 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
12c90 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Dirs[0]); i++){.
12ca0 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69      if( azDirs[i
12cb0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
12cc0 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a  .    if( stat(az
12cd0 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29  Dirs[i], &buf) )
12ce0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
12cf0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
12d00 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
12d10 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63  nue;.    if( acc
12d20 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30  ess(azDirs[i], 0
12d30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
12d40 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
12d50 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  [i];.    break;.
12d60 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
12d70 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
12d80 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
12d90 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
12da0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
12db0 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
12dc0 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
12dd0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
12de0 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
12df0 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
12e00 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
12e10 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
12e20 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74   nBuf ){.    ret
12e30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12e40 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
12e50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
12e60 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c  f(nBuf-17, zBuf,
12e70 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
12e80 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
12e90 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  Dir);.    j = st
12ea0 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
12eb0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
12ec0 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
12ed0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12ee0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
12ef0 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
12f00 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
12f10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
12f20 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
12f30 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
12f40 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
12f50 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63   0;.  }while( ac
12f60 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
12f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12f80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12f90 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
12fa0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
12fb0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
12fc0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
12fd0 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
12fe0 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
12ff0 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
13000 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
13010 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
13020 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
13030 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
13040 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
13050 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
13060 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
13070 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
13080 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
13090 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
130a0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
130b0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
130c0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
130d0 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
130e0 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
130f0 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
13100 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
13110 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
13120 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
13130 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
13140 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
13150 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
13160 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
13170 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
13180 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
13190 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
131a0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
131b0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
131c0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
131d0 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
131e0 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
131f0 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
13200 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
13210 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
13220 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
13230 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
13240 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
13250 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
13260 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
13270 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
13280 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13290 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
132a0 2a 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c 69 74  *zPath, .  sqlit
132b0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a  e3_file *pFile,.
132c0 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69    int flags,.  i
132d0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
132e0 0a 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20  .  int fd = 0;  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
13310 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
13320 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
13330 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20   dirfd = -1;    
13340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13350 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
13360 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
13370 74 20 6f 66 6c 61 67 73 20 3d 20 30 3b 20 20 20  t oflags = 0;   
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13390 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
133a0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
133b0 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
133c0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
133d0 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
133e0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
133f0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
13400 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13410 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
13420 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 0a 20  primitives */.. 
13430 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
13440 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
13450 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
13460 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
13470 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
13480 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
13490 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
134a0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
134b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
134c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
134d0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
134e0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
134f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13500 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
13510 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
13520 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13530 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 20 20  _READWRITE);..  
13540 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
13550 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
13560 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
13570 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
13580 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
13590 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
135a0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
135b0 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
135c0 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
135d0 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
135e0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
135f0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
13600 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
13610 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
13620 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63   int isOpenDirec
13630 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74 65  tory = (isCreate
13640 20 26 26 20 0a 20 20 20 20 20 20 28 65 54 79 70   && .      (eTyp
13650 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
13660 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  ASTER_JOURNAL ||
13670 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
13680 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
13690 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ).  );..  /* If 
136a0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
136b0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
136c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
136d0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
136e0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
136f0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
13700 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
13710 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
13720 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
13730 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
13740 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f  ATHNAME+1];.  co
13750 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
13760 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
13770 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
13780 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
13790 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
137a0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
137b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
137c0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
137d0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
137e0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
137f0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
13800 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
13810 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
13820 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
13830 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
13840 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
13850 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
13860 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
13870 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
13880 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
13890 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
138a0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
138b0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
138c0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
138d0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
138e0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
138f0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
13900 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
13910 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
13920 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
13930 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
13940 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
13950 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
13960 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
13970 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
13980 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e  main journal, an
13990 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
139a0 20 61 72 65 20 6e 65 76 65 72 20 61 75 74 6f 6d   are never autom
139b0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65  atically.  ** de
139c0 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20 61 73 73  leted.  */.  ass
139d0 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
139e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
139f0 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
13a00 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
13a10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
13a20 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73  N_JOURNAL || !is
13a30 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65  Delete );.  asse
13a40 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
13a50 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
13a60 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65  URNAL || !isDele
13a70 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  te );..  /* Asse
13a80 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
13a90 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
13aa0 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
13ab0 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
13ac0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
13ad0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
13ae0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
13af0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
13b00 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
13b10 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
13b20 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
13b30 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
13b40 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
13b50 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
13b60 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
13b70 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
13b80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
13b90 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
13ba0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
13bb0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
13bc0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
13bd0 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  B.  );..  memset
13be0 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
13bf0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
13c00 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
13c10 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
13c20 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
13c30 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  & !isOpenDirecto
13c40 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ry);.    rc = ge
13c50 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
13c60 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61  THNAME+1, zTmpna
13c70 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
13c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13ca0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
13cb0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
13cc0 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
13cd0 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f   )  oflags |= O_
13ce0 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
13cf0 52 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61  ReadWrite ) ofla
13d00 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
13d10 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
13d20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52    oflags |= O_CR
13d30 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
13d40 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20  lusive ) oflags 
13d50 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
13d60 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73  OLLOW);.  oflags
13d70 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
13d80 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 66  |O_BINARY);..  f
13d90 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
13da0 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74 65  oflags, isDelete
13db0 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46  ?0600:SQLITE_DEF
13dc0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
13dd0 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64  SIONS);.  if( fd
13de0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
13df0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
13e00 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
13e10 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  ve ){.    /* Fai
13e20 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
13e30 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
13e40 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
13e50 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
13e60 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
13e70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13e80 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
13e90 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61 67  REATE);.    flag
13ea0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
13eb0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 72  _READONLY;.    r
13ec0 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28 70  eturn unixOpen(p
13ed0 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69 6c  Vfs, zPath, pFil
13ee0 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  e, flags, pOutFl
13ef0 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ags);.  }.  if( 
13f00 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
13f10 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
13f20 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EN;.  }.  if( is
13f30 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 75 6e  Delete ){.    un
13f40 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  link(zName);.  }
13f50 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
13f60 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
13f70 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
13f80 0a 20 20 61 73 73 65 72 74 28 66 64 21 3d 30 29  .  assert(fd!=0)
13f90 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69  ;.  if( isOpenDi
13fa0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
13fb0 6e 74 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65  nt rc = openDire
13fc0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69  ctory(zPath, &di
13fd0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
13fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13ff0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
14000 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14010 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
14020 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
14030 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
14040 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  D, fcntl(fd, F_G
14050 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
14060 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
14070 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
14080 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
14090 49 4e 5f 44 42 3b 0a 20 20 72 65 74 75 72 6e 20  IN_DB;.  return 
140a0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
140b0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
140c0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
140d0 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
140e0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
140f0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
14100 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
14110 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
14120 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
14130 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
14140 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
14150 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
14160 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66  elete(sqlite3_vf
14170 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
14180 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
14190 64 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20  dirSync){.  int 
141a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
141b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
141c0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
141d0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
141e0 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a   unlink(zPath);.
141f0 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b    if( dirSync ){
14200 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
14210 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
14220 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b  ory(zPath, &fd);
14230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14250 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 7b  if( fsync(fd) ){
14260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14270 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
14280 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SYNC;.      }.  
14290 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20      close(fd);. 
142a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
142b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
142c0 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
142d0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
142e0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
142f0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
14300 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
14310 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
14320 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
14330 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
14340 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
14350 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
14360 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
14370 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
14380 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
14390 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
143a0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
143b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
143c0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
143d0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
143e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
143f0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
14400 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
14410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
14420 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
14430 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14450 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61  Path, .  int fla
14460 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73  gs, .  int *pRes
14470 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f  Out.){.  int amo
14480 64 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  de = 0;.  Simula
14490 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
144a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
144b0 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
144c0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
144d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
144e0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
144f0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
14500 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14510 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
14520 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
14530 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
14540 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
14550 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
14560 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
14570 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
14580 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
14590 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
145a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
145b0 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
145c0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
145d0 2a 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63 65  *pResOut = (acce
145e0 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
145f0 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ==0);.  return S
14600 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
14610 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
14620 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
14630 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
14640 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
14650 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
14660 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
14670 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
14680 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
14690 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
146a0 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
146b0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
146c0 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
146d0 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
146e0 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
146f0 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
14700 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
14710 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
14720 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
14730 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
14740 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
14750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
14760 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
14770 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
14780 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
14790 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
147a0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
147b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
147c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
147d0 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
147e0 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
147f0 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14810 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
14820 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
14830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
14860 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
14870 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
14880 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
14890 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
148a0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
148b0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
148c0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
148d0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
148e0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
148f0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
14900 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
14910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
14920 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
14930 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
14940 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
14950 67 20 64 69 72 65 63 74 6c 79 20 68 61 73 20 62  g directly has b
14960 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
14970 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
14980 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14990 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
149a0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
149b0 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
149c0 54 48 4e 41 4d 45 20 29 3b 0a 20 20 7a 4f 75 74  THNAME );.  zOut
149d0 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
149e0 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
149f0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
14a00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
14a10 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
14a20 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
14a30 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
14a40 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75    if( getcwd(zOu
14a50 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
14a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14a70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
14a80 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
14a90 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
14aa0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14ab0 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
14ac0 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
14ad0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
14ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14af0 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20  ;..#if 0.  /*.  
14b00 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20  ** Remove "/./" 
14b10 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e  path elements an
14b20 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f  d convert "/A/./
14b30 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a  " path elements.
14b40 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22    ** to just "/"
14b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
14b60 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  ll ){.    int i,
14b70 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   j;.    for(i=j=
14b80 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b  0; zFull[i]; i++
14b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  ){.      if( zFu
14ba0 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ll[i]=='/' ){.  
14bb0 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
14bc0 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
14bd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
14be0 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e  ( zFull[i+1]=='.
14bf0 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d  ' && zFull[i+2]=
14c00 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
14c10 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
14c20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14c40 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
14c50 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32  '.' && zFull[i+2
14c60 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
14c70 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
14c80 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
14c90 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21  0 && zFull[j-1]!
14ca0 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
14cb0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b           i += 3;
14cc0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
14cd0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
14ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75       }.      zFu
14cf0 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b  ll[j++] = zFull[
14d00 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i];.    }.    zF
14d10 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ull[j] = 0;.  }.
14d20 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64  #endif.}...#ifnd
14d30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
14d40 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
14d50 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
14d60 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
14d70 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
14d80 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
14d90 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
14da0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
14db0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
14dc0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
14dd0 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
14de0 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
14df0 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
14e00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14e10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
14e20 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
14e30 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
14e40 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
14e50 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
14e60 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
14e70 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
14e80 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
14e90 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
14ea0 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
14eb0 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
14ec0 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
14ed0 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
14ee0 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
14ef0 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
14f00 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
14f10 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
14f20 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
14f30 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
14f40 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
14f50 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
14f60 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
14f70 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
14f80 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
14f90 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
14fa0 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
14fb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
14fc0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
14fd0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68   *zBufOut){.  ch
14fe0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 65 6e 74 65  ar *zErr;.  ente
14ff0 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
15000 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
15010 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
15020 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
15030 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
15040 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
15050 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
15060 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  .}.static void *
15070 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
15080 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
15090 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
150a0 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
150b0 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79 6d  {.  return dlsym
150c0 28 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  (pHandle, zSymbo
150d0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
150e0 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
150f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
15100 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
15110 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
15120 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
15130 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
15140 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
15150 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
15160 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
15170 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
15180 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
15190 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
151a0 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
151b0 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
151c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
151d0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
151e0 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
151f0 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
15200 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
15210 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
15220 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
15230 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
15240 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 0a  , char *zBuf){..
15250 20 20 61 73 73 65 72 74 28 6e 42 75 66 3e 3d 28    assert(nBuf>=(
15260 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
15270 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
15280 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
15290 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
152a0 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
152b0 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
152c0 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
152d0 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
152e0 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
152f0 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
15300 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
15310 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
15320 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
15330 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
15340 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
15350 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
15360 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
15370 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
15380 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
15390 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
153a0 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
153b0 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
153c0 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
153d0 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
153e0 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
153f0 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
15400 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
15410 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
15420 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
15430 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
15440 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
15450 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
15460 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
15470 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
15480 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
15490 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
154a0 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
154b0 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
154c0 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
154d0 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
154e0 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
154f0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
15500 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
15510 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
15520 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
15530 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
15540 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  = open("/dev/ura
15550 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  ndom", O_RDONLY)
15560 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
15570 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
15580 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
15590 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
155a0 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
155b0 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
155c0 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
155d0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
155e0 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
155f0 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
15600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
15610 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
15620 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  uf);.      close
15630 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
15640 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
15650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
15660 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
15670 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
15680 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
15690 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
156a0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
156b0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
156c0 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
156d0 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
156e0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
156f0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
15700 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
15710 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
15720 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
15730 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
15740 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
15750 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
15760 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
15770 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
15780 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
15790 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
157a0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
157b0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
157c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
157d0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
157e0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
157f0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 64  oseconds){.#if d
15800 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
15810 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
15820 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
15830 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74  oseconds);.  ret
15840 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
15850 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
15860 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
15870 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
15880 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
15890 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72  econds);.  retur
158a0 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
158b0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
158c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
158d0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
158e0 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
158f0 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74  value, becomes t
15900 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74  he result.** ret
15910 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  urned from sqlit
15920 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
15930 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  ).  This is used
15940 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
15950 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15960 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
15970 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
15980 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
15990 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
159a0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
159b0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
159c0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
159d0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
159e0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
159f0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
15a00 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
15a10 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
15a20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
15a30 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
15a40 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
15a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
15a60 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
15a70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
15a80 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
15a90 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44  #ifdef NO_GETTOD
15aa0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
15ab0 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f  ime(&t);.  *prNo
15ac0 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20  w = t/86400.0 + 
15ad0 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65  2440587.5;.#else
15ae0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
15af0 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
15b00 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
15b10 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
15b20 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
15b30 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
15b40 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30  Now.tv_usec/8640
15b50 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69  0000000.0;.#endi
15b60 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
15b70 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
15b80 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
15b90 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
15ba0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
15bb0 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32  time/86400.0 + 2
15bc0 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65  440587.5;.  }.#e
15bd0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b  ndif.  return 0;
15be0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
15bf0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
15c00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15c10 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
15c20 72 20 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74 75  r *zBuf){.  retu
15c30 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
15c40 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
15c50 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
15c60 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
15c70 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
15c80 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 4d 61  (void){ .  /* Ma
15c90 63 72 6f 20 74 6f 20 64 65 66 69 6e 65 20 74 68  cro to define th
15ca0 65 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  e static content
15cb0 73 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  s of an sqlite3_
15cc0 76 66 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  vfs structure fo
15cd0 72 0a 20 20 2a 2a 20 74 68 65 20 75 6e 69 78 20  r.  ** the unix 
15ce0 62 61 63 6b 65 6e 64 2e 20 54 68 65 20 74 77 6f  backend. The two
15cf0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
15d00 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 75 73  the values to us
15d10 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 73  e for.  ** the s
15d20 71 6c 69 74 65 33 5f 76 66 73 2e 7a 4e 61 6d 65  qlite3_vfs.zName
15d30 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 76 66 73   and sqlite3_vfs
15d40 2e 70 41 70 70 44 61 74 61 20 66 69 65 6c 64 73  .pAppData fields
15d50 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
15d60 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 23 64 65    ** .  */.  #de
15d70 66 69 6e 65 20 55 4e 49 58 56 46 53 28 7a 56 66  fine UNIXVFS(zVf
15d80 73 4e 61 6d 65 2c 20 70 56 66 73 41 70 70 44 61  sName, pVfsAppDa
15d90 74 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ta) {           
15da0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31 2c 20         \.    1, 
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
15dd0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
15de0 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f       \.    sizeo
15df0 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20  f(unixFile),    
15e00 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20   /* szOsFile */ 
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54     \.    MAX_PAT
15e30 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f  HNAME,         /
15e40 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20  * mxPathname */ 
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   \.    0,       
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e80 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20  pNext */        
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15ea0 0a 20 20 20 20 7a 56 66 73 4e 61 6d 65 2c 20 20  .    zVfsName,  
15eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
15ec0 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15ee0 20 20 20 28 76 6f 69 64 20 2a 29 70 56 66 73 41     (void *)pVfsA
15ef0 70 70 44 61 74 61 2c 20 20 2f 2a 20 70 41 70 70  ppData,  /* pApp
15f00 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20  Data */         
15f10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15f20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20   unixOpen,      
15f30 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
15f40 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
15f50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
15f60 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20  nixDelete,      
15f70 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
15f80 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
15f90 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
15fa0 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  xAccess,        
15fb0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46       \.    unixF
15fe0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
15ff0 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
16000 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
16010 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f     \.    unixDlO
16020 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
16030 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20  * xDlOpen */    
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72   \.    unixDlErr
16060 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
16070 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  xDlError */     
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16090 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
160a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
160b0 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20  lSym */         
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
160d0 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20     unixDlClose, 
160e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
160f0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
16100 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
16110 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
16120 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
16130 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  mness */        
16140 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
16150 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20  nixSleep,       
16160 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
16170 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
16180 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
16190 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  xCurrentTime,   
161a0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
161b0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
161c0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
161d0 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20 20 20  etLastError     
161e0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
161f0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
16200 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 73 74 61 74     \.  }..  stat
16210 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 75  ic sqlite3_vfs u
16220 6e 69 78 56 66 73 20 3d 20 55 4e 49 58 56 46 53  nixVfs = UNIXVFS
16230 28 22 75 6e 69 78 22 2c 20 30 29 3b 0a 23 69 66  ("unix", 0);.#if
16240 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16250 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
16260 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
16270 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56  c sqlite3_vfs aV
16280 66 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 55 4e 49  fs[] = {.    UNI
16290 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78  XVFS("unix-posix
162a0 22 2c 20 20 20 4c 4f 43 4b 49 4e 47 5f 53 54 59  ",   LOCKING_STY
162b0 4c 45 5f 50 4f 53 49 58 29 2c 20 0a 20 20 20 20  LE_POSIX), .    
162c0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66  UNIXVFS("unix-af
162d0 70 22 2c 20 20 20 20 20 4c 4f 43 4b 49 4e 47 5f  p",     LOCKING_
162e0 53 54 59 4c 45 5f 41 46 50 29 2c 20 0a 20 20 20  STYLE_AFP), .   
162f0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
16300 6c 6f 63 6b 22 2c 20 20 20 4c 4f 43 4b 49 4e 47  lock",   LOCKING
16310 5f 53 54 59 4c 45 5f 46 4c 4f 43 4b 29 2c 20 0a  _STYLE_FLOCK), .
16320 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
16330 78 2d 64 6f 74 66 69 6c 65 22 2c 20 4c 4f 43 4b  x-dotfile", LOCK
16340 49 4e 47 5f 53 54 59 4c 45 5f 44 4f 54 46 49 4c  ING_STYLE_DOTFIL
16350 45 29 2c 20 0a 20 20 20 20 55 4e 49 58 56 46 53  E), .    UNIXVFS
16360 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20  ("unix-none",   
16370 20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 5f 4e   LOCKING_STYLE_N
16380 4f 4e 45 29 0a 20 20 7d 3b 0a 20 20 66 6f 72 28  ONE).  };.  for(
16390 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
163a0 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
163b0 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
163c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
163d0 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
163e0 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  i], 0);.  }.#end
163f0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  if.  sqlite3_vfs
16400 5f 72 65 67 69 73 74 65 72 28 26 75 6e 69 78 56  _register(&unixV
16410 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  fs, 1);.  return
16420 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
16430 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
16440 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
16450 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 20 54  tem interface. T
16460 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
16470 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20  or unix..*/.int 
16480 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
16490 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20  oid){ .  return 
164a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a  SQLITE_OK; .}. .
164b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
164c0 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a              _OS_UNIX */.