/ Hex Artifact Content
Login

Artifact 8b5116abc14013f059b6bb736b765db6fe1d51e0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  tems..**.** $Id:
01c0: 20 6f 73 5f 75 6e 69 78 2e 63 2c 76 20 31 2e 31   os_unix.c,v 1.1
01d0: 39 30 20 32 30 30 38 2f 30 36 2f 32 36 20 31 30  90 2008/06/26 10
01e0: 3a 34 31 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39  :41:19 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 20 23 64 65 66  only */../* #def
0260: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0270: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0280: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  0 */../*.** Thes
0290: 65 20 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c  e #defines shoul
02a0: 64 20 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69  d enable >2GB fi
02b0: 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f  le support on Po
02c0: 73 69 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e  six if the.** un
02d0: 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
02e0: 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
02f0: 74 73 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f  ts it.  If the O
0300: 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65  S lacks.** large
0310: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74   file support, t
0320: 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  hese should be n
0330: 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72  o-ops..**.** Lar
0340: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
0350: 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20  can be disabled 
0360: 75 73 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49  using the -DSQLI
0370: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73  TE_DISABLE_LFS s
0380: 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20  witch.** on the 
0390: 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64  compiler command
03a0: 20 6c 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20   line.  This is 
03b0: 6e 65 63 65 73 73 61 72 79 20 69 66 20 79 6f 75  necessary if you
03c0: 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a   are compiling.*
03d0: 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61  * on a recent ma
03e0: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
03f0: 74 20 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77  t 7.2) but you w
0400: 61 6e 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f  ant your code to
0410: 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f   work.** on an o
0420: 6c 64 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78  lder machine (ex
0430: 3a 20 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20  : RedHat 6.0).  
0440: 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f  If you compile o
0450: 6e 20 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20  n RedHat 7.2.** 
0460: 77 69 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74  without this opt
0470: 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62  ion, LFS is enab
0480: 6c 65 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65  le.  But LFS doe
0490: 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74  s not exist in t
04a0: 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20  he kernel.** in 
04b0: 52 65 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74  RedHat 6.0, so t
04c0: 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f  he code won't wo
04d0: 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20  rk.  Hence, for 
04e0: 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a  maximum binary.*
04f0: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f  * portability yo
0500: 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46  u should omit LF
0510: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0520: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0530: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
0540: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
0550: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
0560: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
0570: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
0580: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
0590: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
05a0: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
05b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
05c0: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
05d0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
05e0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
05f0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0600: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
0610: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
0620: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0630: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
0640: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
0650: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
0660: 6e 6f 2e 68 3e 0a 23 69 66 64 65 66 20 53 51 4c  no.h>.#ifdef SQL
0670: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0680: 4e 47 5f 53 54 59 4c 45 0a 23 69 6e 63 6c 75 64  NG_STYLE.#includ
0690: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
06a0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61  #include <sys/pa
06b0: 72 61 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ram.h>.#include 
06c0: 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65  <sys/mount.h>.#e
06d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
06e0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
06f0: 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  YLE */../*.** If
0700: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
0710: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
0720: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
0730: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
0740: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
0750: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
0760: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
0770: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
0780: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
0790: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
07a0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
07b0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
07c0: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
07d0: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
07e0: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
07f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
0800: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
0810: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
0820: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0830: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
0840: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
0850: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
0860: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
0870: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
0880: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
0890: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46  ./*.** The unixF
08a0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
08b0: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
08c0: 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66  ite3_file specif
08d0: 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a  ic for the unix.
08e0: 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c  ** protability l
08f0: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
0900: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
0910: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
0920: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
0930: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
0940: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
0950: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
0960: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
0970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0980: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
0990: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
09a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
09b0: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
09c0: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
09d0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
09e0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
09f0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
0a00: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
0a10: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
0a20: 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75  ];.#endif.  stru
0a30: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
0a40: 6e 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62  n;    /* Info ab
0a50: 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27  out all open fd'
0a60: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
0a70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  */.  struct lock
0a80: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f  Info *pLock;   /
0a90: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
0aa0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
0ab0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
0ac0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0ad0: 5f 53 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c  _STYLE.  void *l
0ae0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
0af0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
0b00: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
0b10: 74 65 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  te */.#endif /* 
0b20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0b30: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20  CKING_STYLE */. 
0b40: 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
0b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0b60: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
0b70: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
0b80: 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20  char locktype;  
0b90: 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20   /* The type of 
0ba0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69  lock held on thi
0bb0: 73 20 66 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  s fd */.  int di
0bc0: 72 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  rfd;            
0bd0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
0be0: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64  riptor for the d
0bf0: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 23 69 66 20  irectory */.#if 
0c00: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0c10: 45 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69  E.  pthread_t ti
0c20: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
0c30: 20 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74   The thread that
0c40: 20 22 6f 77 6e 73 22 20 74 68 69 73 20 75 6e 69   "owns" this uni
0c50: 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  xFile */.#endif.
0c60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  };../*.** Includ
0c70: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0c80: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0c90: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0ca0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0cb0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
0cc0: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
0cd0: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
0ce0: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
0cf0: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
0d00: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
0d10: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
0d20: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
0d30: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
0d40: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
0d50: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
0d60: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
0d70: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
0d80: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
0d90: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
0da0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
0db0: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
0dc0: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
0dd0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  f../*.** The DJG
0de0: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
0df0: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
0e00: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
0e10: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
0e20: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
0e30: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
0e40: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
0e50: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
0e60: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
0e70: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
0e80: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
0e90: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
0ea0: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
0eb0: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
0ec0: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
0ed0: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
0ee0: 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e  _DJGPP__.# defin
0ef0: 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30  e fcntl(A,B,C) 0
0f00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0f10: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
0f20: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
0f30: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
0f40: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
0f50: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
0f60: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
0f70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
0f80: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
0f90: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
0fa0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
0fb0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
0fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
0fd0: 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 75  t or check the u
0fe0: 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69 65 6c  nixFile.tid fiel
0ff0: 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69  d.  This field i
1000: 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20 75 6e  s set when an un
1010: 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72  ixFile.** is fir
1020: 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20  st opened.  All 
1030: 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73 20  subsequent uses 
1040: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
1050: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a  verify that the.
1060: 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69  ** same thread i
1070: 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74  s operating on t
1080: 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20 53 6f  he unixFile.  So
1090: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
10a0: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
10b0: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
10c0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
10d0: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
10e0: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
10f0: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
1100: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
1110: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
1120: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
1130: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
1140: 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c  another.  This l
1150: 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20  ogic makes sure 
1160: 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  a user does not 
1170: 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a  try to do that.*
1180: 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a  * by mistake..**
1190: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
11a0: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
11b0: 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20 62 65   unixFile can be
11c0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20   moved from one 
11d0: 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f  thread to.** ano
11e0: 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20  ther as long as 
11f0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
1200: 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20  n a system that 
1210: 73 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73  supports threads
1220: 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65  .** overriding e
1230: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
1240: 20 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20   (which now the 
1250: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61  most common beha
1260: 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e  vior).** or if n
1270: 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  o locks are held
1280: 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69 78 46  .  But the unixF
1290: 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20  ile.pLock field 
12a0: 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72  needs to be.** r
12b0: 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75 73  ecomputed becaus
12c0: 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75 64  e its key includ
12d0: 65 73 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  es the thread-id
12e0: 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20 74  .  See the .** t
12f0: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
1300: 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f  () function belo
1310: 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  w for additional
1320: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a   information.*/.
1330: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
1340: 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20 53  DSAFE.# define S
1350: 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20  ET_THREADID(X)  
1360: 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72   (X)->tid = pthr
1370: 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66  ead_self().# def
1380: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
1390: 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f 76  ID(X) (threadsOv
13a0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
13b0: 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20  Locks==0 && \.  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72 65            !pthre
13e0: 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74 69  ad_equal((X)->ti
13f0: 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  d, pthread_self(
1400: 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ))).#else.# defi
1410: 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  ne SET_THREADID(
1420: 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  X).# define CHEC
1430: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30 0a  K_THREADID(X) 0.
1440: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65  #endif../*.** He
1450: 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20 6f  re is the dirt o
1460: 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  n POSIX advisory
1470: 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53 54   locks:  ANSI ST
1480: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
1490: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
14a0: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
14b0: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
14c0: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
14d0: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
14e0: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
14f0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
1500: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
1510: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
1520: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
1530: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
1540: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
1550: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
1560: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
1570: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
1580: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
1590: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
15a0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
15b0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
15c0: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
15d0: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
15e0: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
15f0: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
1600: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
1610: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
1620: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
1630: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
1640: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
1650: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
1660: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
1670: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
1680: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
1690: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
16a0: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
16b0: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
16c0: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
16d0: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
16e0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
16f0: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
1700: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1710: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
1720: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
1730: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
1740: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
1750: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
1760: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
1770: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
1780: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
1790: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
17a0: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
17b0: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
17c0: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
17d0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
17e0: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
17f0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
1800: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
1810: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
1820: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
1830: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
1840: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d  names..**.** Bum
1850: 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73 6b  mer.  If you ask
1860: 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72 6f   me, this is bro
1870: 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b  ken.  Badly brok
1880: 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a  en.  It means.**
1890: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
18a0: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
18b0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
18c0: 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e 67  ile access among
18d0: 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  .** competing th
18e0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
18f0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
1900: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
1910: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
1920: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
1930: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
1940: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
1950: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
1960: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
1970: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
1980: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
1990: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
19a0: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
19b0: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
19c0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
19d0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
19e0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
19f0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
1a00: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
1a10: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
1a20: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
1a30: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
1a40: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
1a50: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
1a60: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
1a70: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
1a80: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
1a90: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
1aa0: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
1ab0: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
1ac0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
1ad0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
1ae0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
1af0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
1b00: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
1b10: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
1b20: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
1b30: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
1b40: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
1b50: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
1b60: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
1b70: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
1b80: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  node..**.** The 
1b90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
1ba0: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
1bb0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
1bc0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
1bd0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
1be0: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
1bf0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
1c00: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
1c10: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1c20: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
1c30: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
1c40: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1c50: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
1c60: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
1c70: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
1c80: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
1c90: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
1ca0: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
1cb0: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
1cc0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
1cd0: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
1ce0: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
1cf0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
1d00: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
1d10: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
1d20: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1d30: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
1d40: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
1d50: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
1d60: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
1d70: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
1d80: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
1d90: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
1da0: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
1db0: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
1dc0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
1dd0: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
1de0: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
1df0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
1e00: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
1e10: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
1e20: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
1e30: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
1e40: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
1e50: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
1e60: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
1e70: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
1e80: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
1e90: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
1ea0: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
1eb0: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
1ec0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
1ed0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
1ee0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
1ef0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
1f00: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
1f10: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
1f20: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
1f30: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
1f40: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
1f50: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
1f60: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
1f70: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
1f80: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
1f90: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
1fa0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
1fb0: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
1fc0: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
1fd0: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
1fe0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
1ff0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
2000: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
2010: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
2020: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
2030: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
2040: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
2050: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2060: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2070: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2080: 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  m, each unixFile
2090: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
20a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
20b0: 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73   to an openCnt s
20c0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
20d0: 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20   is one openCnt 
20e0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
20f0: 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69   open inode, whi
2100: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75  ch means that mu
2110: 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20  ltiple unixFile 
2120: 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  can point to a s
2130: 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74  ingle.** openCnt
2140: 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  .  When an attem
2150: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
2160: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
2170: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
2180: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
2190: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
21a0: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
21b0: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
21c0: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
21d0: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
21e0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
21f0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
2200: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
2210: 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43  ar..** The openC
2220: 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  nt structure kee
2230: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
2240: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
2250: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
2260: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
2270: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
2280: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
2290: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
22a0: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
22b0: 2a 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c  * First, under L
22c0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65  inux threads, be
22d0: 63 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61  cause each threa
22e0: 64 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65  d has a separate
22f0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20  .** process ID, 
2300: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  lock operations 
2310: 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f  in one thread do
2320: 20 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f   not override lo
2330: 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61  cks.** to the sa
2340: 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72  me file in other
2350: 20 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78   threads.  Linux
2360: 20 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20   threads behave 
2370: 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65  like.** separate
2380: 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68   processes in th
2390: 69 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74  is respect.  But
23a0: 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  , if you close a
23b0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
23c0: 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72  tor in linux thr
23d0: 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20  eads, all locks 
23e0: 61 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65  are cleared, eve
23f0: 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74  n locks.** on ot
2400: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
2410: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
2420: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61  other threads ha
2430: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
2440: 70 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69  process IDs.  Li
2450: 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69  nux threads is i
2460: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74  nconsistent in t
2470: 68 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20  his respect..** 
2480: 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74  (I'm beginning t
2490: 6f 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e  o think that lin
24a0: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e  ux threads is an
24b0: 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f   abomination too
24c0: 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71  .).** The conseq
24d0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c  uence of this al
24e0: 6c 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61  l is that the ha
24f0: 73 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  sh table for the
2500: 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72   lockInfo.** str
2510: 75 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e  ucture has to in
2520: 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73  clude the proces
2530: 73 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20  s id as part of 
2540: 69 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a  its key because.
2550: 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66  ** locks in diff
2560: 65 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72  erent threads ar
2570: 65 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73  e treated as dis
2580: 74 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20  tinct.  But the 
2590: 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  .** openCnt stru
25a0: 63 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74  cture should not
25b0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
25c0: 63 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a  cess id in its.*
25d0: 2a 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c  * key because cl
25e0: 6f 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63  ose() clears loc
25f0: 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  k on all threads
2600: 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63  , not just the c
2610: 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  urrent.** thread
2620: 2e 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66  .  Were it not f
2630: 6f 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73  or this goofines
2640: 73 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61  s in linux threa
2650: 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20  ds, we could.** 
2660: 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b  combine the lock
2670: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
2680: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f   structures into
2690: 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74   a single struct
26a0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ure..**.** 2004-
26b0: 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73 6f  Jun-28:.** On so
26c0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  me versions of l
26d0: 69 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63 61  inux, threads ca
26e0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
26f0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
2700: 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e 20   On others not. 
2710: 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20 63   Sometimes you c
2720: 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62 65  an change the be
2730: 68 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73 61  havior on the sa
2740: 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79 20  me.** system by 
2750: 73 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f 41  setting the LD_A
2760: 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e 76  SSUME_KERNEL env
2770: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
2780: 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49 58  e.  The.** POSIX
2790: 20 73 74 61 6e 64 61 72 64 20 69 73 20 73 69 6c   standard is sil
27a0: 65 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 20  ent as to which 
27b0: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
27c0: 65 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20 61  ect, as far.** a
27d0: 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73 6f  s I can tell, so
27e0: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20   other versions 
27f0: 6f 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73 68  of unix might sh
2800: 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 69  ow the same.** i
2810: 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54  nconsistency.  T
2820: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74 6c  here is no littl
2830: 65 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d 69  e doubt in my mi
2840: 6e 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a 2a  nd that posix.**
2850: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2860: 61 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61 64  and linux thread
2870: 73 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c 79  s are profoundly
2880: 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54   broken..**.** T
2890: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28a0: 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  e inconsistencie
28b0: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74 65  s, we have to te
28c0: 73 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a 2a  st at runtime .*
28d0: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
28e0: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
28f0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2900: 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20 74  s locks.  This t
2910: 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f 6e  est.** is run on
2920: 63 65 2c 20 74 68 65 20 66 69 72 73 74 20 74 69  ce, the first ti
2930: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
2940: 74 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74 61  ttempted.  A sta
2950: 74 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tic .** variable
2960: 20 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f 72   is set to recor
2970: 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
2980: 20 74 68 69 73 20 74 65 73 74 20 66 6f 72 20 66   this test for f
2990: 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  uture.** use..*/
29a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
29b0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
29c0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
29d0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
29e0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
29f0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
2a00: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
2a10: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
2a20: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72  de..**.** If thr
2a30: 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72  eads cannot over
2a40: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2a50: 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65 20   locks, then we 
2a60: 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 4b  set the.** lockK
2a70: 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20  ey.tid field to 
2a80: 74 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20  the thread ID.  
2a90: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  If threads can o
2aa0: 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20  verride.** each 
2ab0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
2ac0: 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20  n tid is always 
2ad0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74 69  set to zero.  ti
2ae0: 64 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20  d is omitted.** 
2af0: 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69  if we compile wi
2b00: 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67 20  thout threading 
2b10: 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74 72 75  support..*/.stru
2b20: 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20 20 64  ct lockKey {.  d
2b30: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
2b40: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
2b50: 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b   */.  ino_t ino;
2b60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
2b70: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 53 51  number */.#if SQ
2b80: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2b90: 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b    pthread_t tid;
2ba0: 20 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20     /* Thread ID 
2bb0: 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61  or zero if threa
2bc0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2bd0: 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65  each other */.#e
2be0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
2bf0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2c00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2c10: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2c20: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
2c30: 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63  .** inode on eac
2c40: 68 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20  h thread with a 
2c50: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2c60: 73 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20  s ID.  (Threads 
2c70: 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  have.** differen
2c80: 74 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e  t process IDs on
2c90: 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20   linux, but not 
2ca0: 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e  on most other un
2cb0: 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73  ixes.).**.** A s
2cc0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
2cd0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
2ce0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2cf0: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
2d00: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
2d10: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
2d20: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
2d30: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
2d40: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
2d50: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
2d60: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2d70: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
2d80: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
2d90: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20  uct lockInfo {. 
2da0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20   struct lockKey 
2db0: 6b 65 79 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  key;  /* The loo
2dc0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
2dd0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
2de0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
2df0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
2e00: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79   */.  int lockty
2e10: 70 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  pe;        /* On
2e20: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
2e30: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
2e40: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  etc. */.  int nR
2e50: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ef;            /
2e60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
2e70: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
2e80: 75 63 74 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ucture */.};../*
2e90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2ea0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2eb0: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
2ec0: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
2ed0: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
2ee0: 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70 65 6e   particular open
2ef0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69  Cnt structure gi
2f00: 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20  ven its inode.  
2f10: 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73  This.** is the s
2f20: 61 6d 65 20 61 73 20 74 68 65 20 6c 6f 63 6b 4b  ame as the lockK
2f30: 65 79 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ey except that t
2f40: 68 65 20 74 68 72 65 61 64 20 49 44 20 69 73 20  he thread ID is 
2f50: 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75  omitted..*/.stru
2f60: 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64  ct openKey {.  d
2f70: 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20 44  ev_t dev;   /* D
2f80: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
2f90: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f    ino_t ino;   /
2fa0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
2fb0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
2fc0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2fd0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2fe0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
2ff0: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
3000: 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74   inode.  This st
3010: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
3020: 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ack of the numbe
3030: 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  r of locks on th
3040: 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66  at.** inode.  If
3050: 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65   a close is atte
3060: 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e  mpted against an
3070: 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68   inode that is h
3080: 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c  olding.** locks,
3090: 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65   the close is de
30a0: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
30b0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20   locks clear by 
30c0: 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  adding the.** fi
30d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
30e0: 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68   be closed to th
30f0: 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a  e pending list..
3100: 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  */.struct openCn
3110: 74 20 7b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  t {.  struct ope
3120: 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f 2a 20 54  nKey key;   /* T
3130: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
3140: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
3150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3160: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
3170: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
3180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
3190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31a0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
31b0: 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ding locks */.  
31c0: 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20  int nPending;   
31d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31e0: 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65  of pending close
31f0: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  () operations */
3200: 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67  .  int *aPending
3210: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  ;        /* Mall
3220: 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c 64 69  oced space holdi
3230: 6e 67 20 66 64 27 73 20 61 77 61 69 74 69 6e 67  ng fd's awaiting
3240: 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b   a close() */.};
3250: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 73 65 20 68  ../* .** These h
3260: 61 73 68 20 74 61 62 6c 65 73 20 6d 61 70 20 69  ash tables map i
3270: 6e 6f 64 65 73 20 61 6e 64 20 66 69 6c 65 20 64  nodes and file d
3280: 65 73 63 72 69 70 74 6f 72 73 20 28 72 65 61 6c  escriptors (real
3290: 6c 79 2c 20 6c 6f 63 6b 4b 65 79 20 61 6e 64 0a  ly, lockKey and.
32a0: 2a 2a 20 6f 70 65 6e 4b 65 79 20 73 74 72 75 63  ** openKey struc
32b0: 74 75 72 65 73 29 20 69 6e 74 6f 20 6c 6f 63 6b  tures) into lock
32c0: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
32d0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 41 63   structures.  Ac
32e0: 63 65 73 73 20 74 6f 20 0a 2a 2a 20 74 68 65 73  cess to .** thes
32f0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 6d 75  e hash tables mu
3300: 73 74 20 62 65 20 70 72 6f 74 65 63 74 65 64 20  st be protected 
3310: 62 79 20 61 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73  by a mutex..*/.s
3320: 74 61 74 69 63 20 48 61 73 68 20 6c 6f 63 6b 48  tatic Hash lockH
3330: 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41  ash = {SQLITE_HA
3340: 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c  SH_BINARY, 0, 0,
3350: 20 30 2c 20 30 2c 20 30 7d 3b 0a 73 74 61 74 69   0, 0, 0};.stati
3360: 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73 68 20  c Hash openHash 
3370: 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  = {SQLITE_HASH_B
3380: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
3390: 30 2c 20 30 7d 3b 0a 0a 23 69 66 64 65 66 20 53  0, 0};..#ifdef S
33a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33b0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
33c0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79   The locking sty
33d0: 6c 65 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  les are associat
33e0: 65 64 20 77 69 74 68 20 74 68 65 20 64 69 66 66  ed with the diff
33f0: 65 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63 6b 69  erent file locki
3400: 6e 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69 74 69  ng.** capabiliti
3410: 65 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  es supported by 
3420: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 73  different file s
3430: 79 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  ystems.  .**.** 
3440: 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 73 74  POSIX locking st
3450: 79 6c 65 20 66 75 6c 6c 79 20 73 75 70 70 6f 72  yle fully suppor
3460: 74 73 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ts shared and ex
3470: 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
3480: 67 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41 44 50  ge locks .** ADP
3490: 20 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20 73 75   locking only su
34a0: 70 70 6f 72 74 73 20 65 78 63 6c 75 73 69 76 65  pports exclusive
34b0: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
34c0: 73 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c 79 20  s.** FLOCK only 
34d0: 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c  supports a singl
34e0: 65 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20 65 78  e file-global ex
34f0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
3500: 44 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20 61 20  DOTLOCK isn't a 
3510: 74 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  true locking sty
3520: 6c 65 2c 20 69 74 20 72 65 66 65 72 73 20 74 6f  le, it refers to
3530: 20 74 68 65 20 75 73 65 20 6f 66 20 61 20 73 70   the use of a sp
3540: 65 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c 65 20  ecial.**   file 
3550: 6e 61 6d 65 64 20 74 68 65 20 73 61 6d 65 20 61  named the same a
3560: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
3570: 69 6c 65 20 77 69 74 68 20 61 20 27 2e 6c 6f 63  ile with a '.loc
3580: 6b 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68  k' extension, th
3590: 69 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65 20 75  is.**   can be u
35a0: 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 79 73 74  sed on file syst
35b0: 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ems that do not 
35c0: 6f 66 66 65 72 20 61 6e 79 20 72 65 6c 69 61 62  offer any reliab
35d0: 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  le file locking.
35e0: 2a 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20 6d 65  ** NO locking me
35f0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b  ans that no lock
3600: 69 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65  ing will be atte
3610: 6d 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f  mpted, this is o
3620: 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
3630: 20 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65    read-only file
3640: 20 73 79 73 74 65 6d 73 20 63 75 72 72 65 6e 74   systems current
3650: 6c 79 0a 2a 2a 20 55 4e 53 55 50 50 4f 52 54 45  ly.** UNSUPPORTE
3660: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  D means that no 
3670: 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20  locking will be 
3680: 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
3690: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
36a0: 0a 2a 2a 20 20 20 66 69 6c 65 20 73 79 73 74 65  .**   file syste
36b0: 6d 73 20 74 68 61 74 20 61 72 65 20 6b 6e 6f 77  ms that are know
36c0: 6e 20 74 6f 20 62 65 20 75 6e 73 75 70 70 6f 72  n to be unsuppor
36d0: 74 65 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 65  ted.*/.typedef e
36e0: 6e 75 6d 20 7b 0a 20 20 70 6f 73 69 78 4c 6f 63  num {.  posixLoc
36f0: 6b 69 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20 20  kingStyle = 0,  
3700: 20 20 20 20 20 2f 2a 20 73 74 61 6e 64 61 72 64       /* standard
3710: 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79 20   posix-advisory 
3720: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 66 70 4c 6f  locks */.  afpLo
3730: 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20  ckingStyle,     
3740: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 61          /* use a
3750: 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 66 6c  fp locks */.  fl
3760: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c  ockLockingStyle,
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73             /* us
3780: 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a 20 20 64  e flock() */.  d
3790: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
37a0: 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 75  le,         /* u
37b0: 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20 66  se <file>.lock f
37c0: 69 6c 65 73 20 2a 2f 0a 20 20 6e 6f 4c 6f 63 6b  iles */.  noLock
37d0: 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20  ingStyle,       
37e0: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75 6c         /* useful
37f0: 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 66   for read-only f
3800: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  ile system */.  
3810: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
3820: 6e 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20  ngStyle      /* 
3830: 69 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70  indicates unsupp
3840: 6f 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65  orted file syste
3850: 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f  m */.} sqlite3Lo
3860: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64  ckingStyle;.#end
3870: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
3880: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3890: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  E */../*.** Help
38a0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
38b0: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
38c0: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
38d0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
38e0: 63 20 76 6f 69 64 20 65 6e 74 65 72 4d 75 74 65  c void enterMute
38f0: 78 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  x(){.  sqlite3_m
3900: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
3910: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
3920: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
3930: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
3940: 74 69 63 20 76 6f 69 64 20 6c 65 61 76 65 4d 75  tic void leaveMu
3950: 74 65 78 28 29 7b 0a 20 20 73 71 6c 69 74 65 33  tex(){.  sqlite3
3960: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
3970: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
3980: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
3990: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a  IC_MASTER));.}..
39a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
39b0: 44 53 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DSAFE./*.** This
39c0: 20 76 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64   variable record
39d0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
39e0: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
39f0: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3a00: 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  s.** locks..**.*
3a10: 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68  *    0:  No.  Th
3a20: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
3a30: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
3a40: 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31  s locks..**    1
3a50: 3a 20 20 59 65 73 2e 20 20 54 68 72 65 61 64 73  :  Yes.  Threads
3a60: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
3a70: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
3a80: 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f  .**   -1:  We do
3a90: 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a  n't know yet..**
3aa0: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  .** On some syst
3ab0: 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20  ems, we know at 
3ac0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20  compile-time if 
3ad0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
3ae0: 72 69 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68  ride each.** oth
3af0: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74  ers locks.  On t
3b00: 68 6f 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68  hose systems, th
3b10: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3b20: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61  OVERRIDE_LOCK ma
3b30: 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  cro.** will be s
3b40: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
3b50: 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74  .  On other syst
3b60: 65 6d 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ems, we have to 
3b70: 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74  check at.** runt
3b80: 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c  ime.  On these l
3b90: 61 74 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53  atter systems, S
3ba0: 51 4c 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLTIE_THREAD_OVE
3bb0: 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a  RRIDE_LOCK is.**
3bc0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
3bd0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
3be0: 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c  normally has fil
3bf0: 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42  e scope only.  B
3c00: 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ut during testin
3c10: 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74  g, we make.** it
3c20: 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61   a global so tha
3c30: 74 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20  t the test code 
3c40: 63 61 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76  can change its v
3c50: 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  alue in order to
3c60: 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20   verify.** that 
3c70: 74 68 65 20 72 69 67 68 74 20 73 74 75 66 66 20  the right stuff 
3c80: 68 61 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65  happens in eithe
3c90: 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  r case..*/.#ifnd
3ca0: 65 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ef SQLITE_THREAD
3cb0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23  _OVERRIDE_LOCK.#
3cc0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
3cd0: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3ce0: 4f 43 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69  OCK -1.#endif.#i
3cf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3d00: 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72  .int threadsOver
3d10: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
3d20: 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52  cks = SQLITE_THR
3d30: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3d40: 4b 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  K;.#else.static 
3d50: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
3d60: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
3d70: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
3d80: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3d90: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
3da0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  This structure h
3db0: 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  olds information
3dc0: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64   passed into ind
3dd0: 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20  ividual test.** 
3de0: 74 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74  threads by the t
3df0: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
3e00: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
3e10: 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68  ne..*/.struct th
3e20: 72 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20  readTestData {. 
3e30: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3e50: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
3e60: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
3e70: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ock;     /* The 
3e80: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
3e90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  n */.  int resul
3ea0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3eb0: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c   Result of the l
3ec0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
3ed0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53   */.};..#ifdef S
3ee0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
3ef0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
3f00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
3f10: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
3f20: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
3f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3f40: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
3f50: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
3f60: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
3f70: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
3f80: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
3f90: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
3fa0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
3fb0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
3fc0: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
3fd0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
3fe0: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
3ff0: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
4000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
4010: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
4020: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
4030: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
4040: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
4050: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
4060: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
4070: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
4080: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
4090: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
40a0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
40b0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
40c0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
40d0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  se{.    s = fcnt
40e0: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
40f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4100: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
4110: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
4120: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
4130: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
4140: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
4150: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
4160: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4170: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
4180: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
4190: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
41a0: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
41b0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
41c0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
41d0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
41e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
41f0: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
4200: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
4210: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
4220: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
4230: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
4240: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
4250: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4260: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
4270: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
4280: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
4290: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
42a0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
42b0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
42c0: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
42d0: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
42e0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
42f0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
4300: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
4310: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
4320: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
4330: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4340: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
4350: 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
4360: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
4370: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4380: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
4390: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
43a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
43b0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
43c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
43d0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
43e0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
43f0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4400: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4410: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
4420: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
4430: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
4440: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4450: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
4460: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
4470: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
4480: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
4490: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
44a0: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
44b0: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
44c0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
44d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
44e0: 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f  #define fcntl lo
44f0: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
4500: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
4510: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ACE */../*.** Th
4520: 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  e testThreadLock
4530: 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f  ingBehavior() ro
4540: 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74  utine launches t
4550: 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74  wo separate.** t
4560: 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72  hreads on this r
4570: 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f  outine.  This ro
4580: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
4590: 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a  o lock a file.**
45a0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
45b0: 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73   returns.  The s
45c0: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
45d0: 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70  e of that attemp
45e0: 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20  t.** allows the 
45f0: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4600: 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63  gBehavior() proc
4610: 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69  edure to determi
4620: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
4630: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
4640: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
4650: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  thers locks..*/.
4660: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72  static void *thr
4670: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76  eadLockingTest(v
4680: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74  oid *pArg){.  st
4690: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
46a0: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74  ata *pData = (st
46b0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
46c0: 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61  ata*)pArg;.  pDa
46d0: 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e  ta->result = fcn
46e0: 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f  tl(pData->fd, F_
46f0: 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c  SETLK, &pData->l
4700: 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ock);.  return p
4710: 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
4720: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74 74  is procedure att
4730: 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
4740: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
4750: 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e  t 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 20 74 68 65 6e  thers locks then
4780: 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68   sets the .** th
4790: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
47a0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72  hOthersLocks var
47b0: 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74  iable appropriat
47c0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
47d0: 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f  oid testThreadLo
47e0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e  ckingBehavior(in
47f0: 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e  t fd_orig){.  in
4800: 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74  t fd;.  struct t
4810: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 5b  hreadTestData d[
4820: 32 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  2];.  pthread_t 
4830: 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75  t[2];..  fd = du
4840: 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66  p(fd_orig);.  if
4850: 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b  ( fd<0 ) return;
4860: 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20  .  memset(d, 0, 
4870: 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b  sizeof(d));.  d[
4880: 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b  0].fd = fd;.  d[
4890: 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d  0].lock.l_type =
48a0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d   F_RDLCK;.  d[0]
48b0: 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  .lock.l_len = 1;
48c0: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73  .  d[0].lock.l_s
48d0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d  tart = 0;.  d[0]
48e0: 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d  .lock.l_whence =
48f0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31   SEEK_SET;.  d[1
4900: 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d  ] = d[0];.  d[1]
4910: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4920: 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61  _WRLCK;.  pthrea
4930: 64 5f 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20  d_create(&t[0], 
4940: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
4950: 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20  Test, &d[0]);.  
4960: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26  pthread_create(&
4970: 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c  t[1], 0, threadL
4980: 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31  ockingTest, &d[1
4990: 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f  ]);.  pthread_jo
49a0: 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70  in(t[0], 0);.  p
49b0: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d  thread_join(t[1]
49c0: 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64  , 0);.  close(fd
49d0: 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72  );.  threadsOver
49e0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
49f0: 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75  cks =  d[0].resu
4a00: 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65  lt==0 && d[1].re
4a10: 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  sult==0;.}.#endi
4a20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
4a30: 41 44 53 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ADSAFE */../*.**
4a40: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49   Release a lockI
4a50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
4a60: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4a70: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4a80: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4a90: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
4aa0: 49 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b  Info(struct lock
4ab0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  Info *pLock){.  
4ac0: 69 66 20 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c  if (pLock == NUL
4ad0: 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  L).    return;. 
4ae0: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a   pLock->nRef--;.
4af0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
4b00: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
4b10: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
4b20: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
4b30: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f  >key, sizeof(pLo
4b40: 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20  ck->key), 0);.  
4b50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4b60: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Lock);.  }.}../*
4b70: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70  .** Release a op
4b80: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
4b90: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
4ba0: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b  ated by findLock
4bb0: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
4bc0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70  c void releaseOp
4bd0: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65  enCnt(struct ope
4be0: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20  nCnt *pOpen){.  
4bf0: 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c  if (pOpen == NUL
4c00: 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  L).    return;. 
4c10: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a   pOpen->nRef--;.
4c20: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65    if( pOpen->nRe
4c30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
4c40: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f  te3HashInsert(&o
4c50: 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d  penHash, &pOpen-
4c60: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70  >key, sizeof(pOp
4c70: 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20  en->key), 0);.  
4c80: 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50    free(pOpen->aP
4c90: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  ending);.    sql
4ca0: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29  ite3_free(pOpen)
4cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
4cc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
4cd0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
4ce0: 2a 20 54 65 73 74 73 20 61 20 62 79 74 65 2d 72  * Tests a byte-r
4cf0: 61 6e 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65  ange locking que
4d00: 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 79 74  ry to see if byt
4d10: 65 20 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e range locks ar
4d20: 65 20 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c  e .** supported,
4d30: 20 69 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20   if not we fall 
4d40: 62 61 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c  back to dotlockL
4d50: 6f 63 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a  ockingStyle..*/.
4d60: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f  static sqlite3Lo
4d70: 63 6b 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74  ckingStyle sqlit
4d80: 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79  e3TestLockingSty
4d90: 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le(.  const char
4da0: 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69   *filePath, .  i
4db0: 6e 74 20 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65  nt fd.){.  /* te
4dc0: 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
4dd0: 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a  ck using fcntl *
4de0: 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
4df0: 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20   lockInfo;.  .  
4e00: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
4e10: 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
4e20: 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
4e30: 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
4e40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
4e50: 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
4e60: 46 5f 52 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66  F_RDLCK;.  .  if
4e70: 28 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  ( fcntl(fd, F_GE
4e80: 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
4e90: 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
4ea0: 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53  rn posixLockingS
4eb0: 74 79 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  tyle;.  } .  .  
4ec0: 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66  /* testing for f
4ed0: 6c 6f 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61  lock can give fa
4ee0: 6c 73 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20  lse positives.  
4ef0: 53 6f 20 69 66 20 69 66 20 74 68 65 20 61 62 6f  So if if the abo
4f00: 76 65 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69  ve test.  ** fai
4f10: 6c 73 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c  ls, then we fall
4f20: 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64   back to using d
4f30: 6f 74 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f  ot-lock style lo
4f40: 63 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20  cking..  */  .  
4f50: 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f  return dotlockLo
4f60: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f  ckingStyle;.}../
4f70: 2a 20 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74  * .** Examines t
4f80: 68 65 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20  he f_fstypename 
4f90: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61  entry in the sta
4fa0: 74 66 73 20 73 74 72 75 63 74 75 72 65 20 61 73  tfs structure as
4fb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a   returned by .**
4fc0: 20 73 74 61 74 28 29 20 66 6f 72 20 74 68 65 20   stat() for the 
4fd0: 66 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74  file system host
4fe0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
4ff0: 20 66 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74   file, assigns t
5000: 68 65 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  he .** appropria
5010: 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  te locking style
5020: 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 76 61   based on its va
5030: 6c 75 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75  lue.  These valu
5040: 65 73 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67  es and .** assig
5050: 6e 6d 65 6e 74 73 20 61 72 65 20 62 61 73 65 64  nments are based
5060: 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62   on Darwin/OSX b
5070: 65 68 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65  ehavior and have
5080: 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64   not been tested
5090: 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79   on .** other sy
50a0: 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stems..*/.static
50b0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
50c0: 74 79 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65  tyle sqlite3Dete
50d0: 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a  ctLockingStyle(.
50e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
50f0: 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  lePath, .  int f
5100: 64 0a 29 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d.){..#ifdef SQL
5110: 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e  ITE_FIXED_LOCKIN
5120: 47 5f 53 54 59 4c 45 0a 20 20 72 65 74 75 72 6e  G_STYLE.  return
5130: 20 28 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67   (sqlite3Locking
5140: 53 74 79 6c 65 29 53 51 4c 49 54 45 5f 46 49 58  Style)SQLITE_FIX
5150: 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ED_LOCKING_STYLE
5160: 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
5170: 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
5180: 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
5190: 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
51a0: 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 65   == -1 ){.    re
51b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
51c0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
51d0: 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 7d 0a  ePath, fd);.  }.
51e0: 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
51f0: 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
5200: 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y ){.    return 
5210: 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  noLockingStyle;.
5220: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
5230: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
5240: 6e 61 6d 65 2c 20 22 68 66 73 22 29 3d 3d 30 20  name, "hfs")==0 
5250: 7c 7c 0a 20 20 20 20 20 20 73 74 72 63 6d 70 28  ||.      strcmp(
5260: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
5270: 61 6d 65 2c 20 22 75 66 73 22 29 3d 3d 30 20 29  ame, "ufs")==0 )
5280: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73  {.    return pos
5290: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  ixLockingStyle;.
52a0: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
52b0: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
52c0: 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 3d 3d  name, "afpfs")==
52d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
52e0: 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  afpLockingStyle;
52f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d  .  }.  if( strcm
5300: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5310: 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
5320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
5330: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5340: 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c  gStyle(filePath,
5350: 20 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   fd);.  }.  if( 
5360: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
5370: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62  fstypename, "smb
5380: 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  fs")==0 ){.    r
5390: 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69  eturn flockLocki
53a0: 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69  ngStyle;.  }.  i
53b0: 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
53c0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
53d0: 6d 73 64 6f 73 22 29 3d 3d 30 20 29 7b 0a 20 20  msdos")==0 ){.  
53e0: 20 20 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b    return dotlock
53f0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5400: 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 66  }.  if( strcmp(f
5410: 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
5420: 6d 65 2c 20 22 77 65 62 64 61 76 22 29 3d 3d 30  me, "webdav")==0
5430: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75   ){.    return u
5440: 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e  nsupportedLockin
5450: 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 72 65  gStyle;.  }.  re
5460: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
5470: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
5480: 65 50 61 74 68 2c 20 66 64 29 3b 20 20 0a 23 65  ePath, fd);  .#e
5490: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 46  ndif /* SQLITE_F
54a0: 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  IXED_LOCKING_STY
54b0: 4c 45 20 2a 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20  LE */.}..#endif 
54c0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
54d0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
54e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
54f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5500: 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66  , locate lockInf
5510: 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74  o and openCnt st
5520: 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a  ructures that.**
5530: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
5540: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
5550: 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65    Create new one
5560: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
5570: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
5580: 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20 75  alues might be u
5590: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
55a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
55b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
55c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
55d0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
55e0: 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  ic int findLockI
55f0: 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  nfo(.  int fd,  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
5620: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
5630: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
5640: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5650: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
5660: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
5670: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
5680: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
5690: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
56a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
56b0: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
56c0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ture here */.){.
56d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
56e0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
56f0: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
5700: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
5710: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
5720: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
5730: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
5740: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
5750: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66  ;.  rc = fstat(f
5760: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
5770: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 23 69 66  if( rc!=0 ){.#if
5780: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
5790: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4f 56    if( errno==EOV
57a0: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
57b0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
57c0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
57d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
57e0: 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79  }..  memset(&key
57f0: 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  1, 0, sizeof(key
5800: 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20  1));.  key1.dev 
5810: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
5820: 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73  ;.  key1.ino = s
5830: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
5840: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
5850: 53 41 46 45 0a 20 20 69 66 28 20 74 68 72 65 61  SAFE.  if( threa
5860: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
5870: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
5880: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
5890: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
58a0: 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64  ;.  }.  key1.tid
58b0: 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69   = threadsOverri
58c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
58d0: 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f  s ? 0 : pthread_
58e0: 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20  self();.#endif. 
58f0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30   memset(&key2, 0
5900: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
5910: 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74  .  key2.dev = st
5920: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20  atbuf.st_dev;.  
5930: 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62  key2.ino = statb
5940: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f  uf.st_ino;.  pLo
5950: 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63  ck = (struct loc
5960: 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61  kInfo*)sqlite3Ha
5970: 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68  shFind(&lockHash
5980: 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28  , &key1, sizeof(
5990: 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c  key1));.  if( pL
59a0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ock==0 ){.    st
59b0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
59c0: 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  Old;.    pLock =
59d0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
59e0: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
59f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
5a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
5a10: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5a20: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5a30: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5a40: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
5a50: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
5a60: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
5a70: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
5a80: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
5a90: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
5aa0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5ab0: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
5ac0: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
5ad0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20  , sizeof(key1), 
5ae0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  pLock);.    if( 
5af0: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
5b00: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5b10: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71  Lock );.      sq
5b20: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b  lite3_free(pLock
5b30: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
5b40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5b50: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
5b60: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a  lockinfo;.    }.
5b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
5b80: 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  ck->nRef++;.  }.
5b90: 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63    *ppLock = pLoc
5ba0: 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21  k;.  if( ppOpen!
5bb0: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20  =0 ){.    pOpen 
5bc0: 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  = (struct openCn
5bd0: 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  t*)sqlite3HashFi
5be0: 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b  nd(&openHash, &k
5bf0: 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  ey2, sizeof(key2
5c00: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65  ));.    if( pOpe
5c10: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  n==0 ){.      st
5c20: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
5c30: 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20  ld;.      pOpen 
5c40: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5c50: 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29  ( sizeof(*pOpen)
5c60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
5c70: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
5c80: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
5c90: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
5ca0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5cb0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
5cc0: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5cd0: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
5ce0: 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20     pOpen->key = 
5cf0: 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65  key2;.      pOpe
5d00: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
5d10: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20     pOpen->nLock 
5d20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
5d30: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
5d40: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
5d50: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5d60: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5d70: 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48  ashInsert(&openH
5d80: 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79  ash, &pOpen->key
5d90: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20  , sizeof(key2), 
5da0: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  pOpen);.      if
5db0: 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20  ( pOld!=0 ){.   
5dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5dd0: 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  d==pOpen );.    
5de0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5df0: 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  (pOpen);.       
5e00: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
5e10: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  (pLock);.       
5e20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
5e30: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
5e40: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
5e50: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
5e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70  }else{.      pOp
5e70: 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  en->nRef++;.    
5e80: 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20  }.    *ppOpen = 
5e90: 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74  pOpen;.  }..exit
5ea0: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20  _findlockinfo:. 
5eb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
5ec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5ed0: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
5ee0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
5ef0: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
5f00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
5f10: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
5f20: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
5f30: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
5f40: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
5f50: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
5f60: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
5f70: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
5f80: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79  nst char *lockty
5f90: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
5fa0: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
5fb0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
5fc0: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
5fd0: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
5fe0: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
5ff0: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
6000: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
6010: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
6020: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
6030: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
6040: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
6050: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
6060: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
6070: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
6080: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
6090: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
60a0: 20 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65   If we are curre
60b0: 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72  ntly in a differ
60c0: 65 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20  ent thread than 
60d0: 74 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  the thread that 
60e0: 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20  the.** unixFile 
60f0: 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73  argument belongs
6100: 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66   to, then transf
6110: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
6120: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
6130: 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72  over to the curr
6140: 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ent thread..**.*
6150: 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20  * A unixFile is 
6160: 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20  only owned by a 
6170: 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d  thread on system
6180: 73 20 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65  s where one thre
6190: 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ad is.** unable 
61a0: 74 6f 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  to override lock
61b0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 64  s created by a d
61c0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e  ifferent thread.
61d0: 20 20 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20    RedHat9 is.** 
61e0: 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75  an example of su
61f0: 63 68 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a  ch a system..**.
6200: 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  ** Ownership tra
6210: 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c  nsfer is only al
6220: 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75 6e 69  lowed if the uni
6230: 78 46 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74  xFile is current
6240: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20  ly unlocked..** 
6250: 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  If the unixFile 
6260: 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e  is locked and an
6270: 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20 77 72   ownership is wr
6280: 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ong, then return
6290: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  .** SQLITE_MISUS
62a0: 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  E.  SQLITE_OK is
62b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
62c0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a  rything works..*
62d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
62e0: 45 41 44 53 41 46 45 0a 73 74 61 74 69 63 20 69  EADSAFE.static i
62f0: 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  nt transferOwner
6300: 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70  ship(unixFile *p
6310: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
6320: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65  .  pthread_t hSe
6330: 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64  lf;.  if( thread
6340: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
6350: 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20  ersLocks ){.    
6360: 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  /* Ownership tra
6370: 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65  nsfers not neede
6380: 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d  d on this system
6390: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
63a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
63b0: 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f  hSelf = pthread_
63c0: 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74  self();.  if( pt
63d0: 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c  hread_equal(pFil
63e0: 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29  e->tid, hSelf) )
63f0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
6400: 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d  still in the sam
6410: 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20  e thread */.    
6420: 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61  OSTRACE1("No-tra
6430: 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65  nsfer, same thre
6440: 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  ad\n");.    retu
6450: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6460: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  }.  if( pFile->l
6470: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
6480: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61   ){.    /* We ca
6490: 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65  nnot change owne
64a0: 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61  rship while we a
64b0: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63  re holding a loc
64c0: 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  k! */.    return
64d0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
64e0: 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22    }.  OSTRACE4("
64f0: 54 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  Transfer ownersh
6500: 69 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64  ip of %d from %d
6510: 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
6520: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
6530: 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65   pFile->tid, hSe
6540: 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69  lf);.  pFile->ti
6550: 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20  d = hSelf;.  if 
6560: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d  (pFile->pLock !=
6570: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c   NULL) {.    rel
6580: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
6590: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  le->pLock);.    
65a0: 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
65b0: 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69  o(pFile->h, &pFi
65c0: 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20  le->pLock, 0);. 
65d0: 20 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43     OSTRACE5("LOC
65e0: 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25  K    %d is now %
65f0: 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69  s(%s,%d)\n", pFi
6600: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
6610: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
6620: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
6630: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
6640: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
6650: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29  pLock->locktype)
6660: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
6670: 63 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  cnt);.    return
6680: 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
6690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
66a0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  E_OK;.  }.}.#els
66b0: 65 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65  e.  /* On single
66c0: 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73  -threaded builds
66d0: 2c 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  , ownership tran
66e0: 73 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sfer is a no-op 
66f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e  */.# define tran
6700: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29  sferOwnership(X)
6710: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
6720: 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  f../*.** Seek to
6730: 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
6740: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6750: 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
6760: 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
6770: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
6780: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6790: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
67a0: 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
67b0: 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
67c0: 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
67d0: 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
67e0: 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
67f0: 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
6800: 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
6810: 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
6820: 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
6830: 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
6840: 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
6850: 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
6860: 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
6870: 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
6880: 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
6890: 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
68a0: 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
68b0: 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
68c0: 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
68d0: 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2f  41 and #2681..*/
68e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
68f0: 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
6900: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
6910: 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
6920: 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
6930: 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
6940: 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20  64 newOffset;.  
6950: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
6960: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
6970: 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  AD).  got = prea
6980: 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
6990: 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53  nt, offset);.  S
69a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
69b0: 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
69c0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
69d0: 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
69e0: 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
69f0: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
6a00: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6a10: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
6a20: 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
6a30: 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
6a40: 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
6a50: 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ET);.  SimulateI
6a60: 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
6a70: 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  t-- );.  if( new
6a80: 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
6a90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
6aa0: 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
6ab0: 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
6ac0: 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
6ad0: 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
6ae0: 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE5("READ    %-3
6af0: 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
6b00: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
6b10: 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
6b20: 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72  LAPSED);.  retur
6b30: 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
6b40: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
6b50: 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
6b60: 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
6b70: 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
6b80: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
6b90: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
6ba0: 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
6bb0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
6bc0: 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
6bd0: 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
6be0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
6bf0: 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
6c00: 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
6c10: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6c20: 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74   offset.){.  int
6c30: 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
6c40: 69 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65  id );.  got = se
6c50: 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
6c60: 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c  ile*)id, offset,
6c70: 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69   pBuf, amt);.  i
6c80: 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20  f( got==amt ){. 
6c90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6ca0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
6cb0: 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72 65   got<0 ){.    re
6cc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6cd0: 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
6ce0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
6cf0: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
6d00: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
6d10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d20: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
6d30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
6d40: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
6d50: 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
6d60: 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
6d70: 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
6d80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
6da0: 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
6db0: 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
6dc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6dd0: 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
6de0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
6df0: 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
6e00: 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
6e10: 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36  .  int got;.  i6
6e20: 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54  4 newOffset;.  T
6e30: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
6e40: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
6e50: 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
6e60: 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
6e70: 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
6e80: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
6e90: 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
6ea0: 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
6eb0: 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
6ec0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
6ed0: 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
6ee0: 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
6ef0: 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
6f00: 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
6f10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
6f20: 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72  ;.  }.  got = wr
6f30: 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
6f40: 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
6f50: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
6f60: 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25  RACE5("WRITE   %
6f70: 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
6f80: 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
6f90: 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
6fa0: 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65 74  _ELAPSED);.  ret
6fb0: 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
6fc0: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
6fd0: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
6fe0: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
6ff0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
7000: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
7010: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
7020: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
7030: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
7040: 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
7050: 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
7060: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
7070: 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
7080: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
7090: 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72 6f  et .){.  int wro
70a0: 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
70b0: 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
70c0: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69  ( amt>0 );.  whi
70d0: 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
70e0: 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
70f0: 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  te((unixFile*)id
7100: 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
7110: 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
7120: 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
7130: 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65   offset += wrote
7140: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
7150: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
7160: 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  e];.  }.  Simula
7170: 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
7180: 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
7190: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
71a0: 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
71b0: 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  e=0, amt=1 ));. 
71c0: 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
71d0: 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b    if( wrote<0 ){
71e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
71f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
7200: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7210: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7220: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
7230: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7240: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
7250: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
7260: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
7270: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
7280: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
7290: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
72a0: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
72b0: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
72c0: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
72d0: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
72e0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
72f0: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
7300: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
7310: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
7320: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
7330: 20 55 73 65 20 74 68 65 20 66 64 61 74 61 73 79   Use the fdatasy
7340: 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66  nc() API only if
7350: 20 74 68 65 20 48 41 56 45 5f 46 44 41 54 41 53   the HAVE_FDATAS
7360: 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
7370: 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ined..** Otherwi
7380: 73 65 20 75 73 65 20 66 73 79 6e 63 28 29 20 69  se use fsync() i
7390: 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a  n its place..*/.
73a0: 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41  #ifndef HAVE_FDA
73b0: 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
73c0: 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
73d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
73e0: 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
73f0: 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
7400: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
7410: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
7420: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
7430: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
7440: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
7450: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
7460: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
7470: 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
7480: 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
7490: 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
74a0: 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
74b0: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
74c0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
74d0: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
74e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
74f0: 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
7500: 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
7510: 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
7520: 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
7530: 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
7540: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
7550: 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
7560: 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
7570: 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
7580: 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
7590: 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
75a0: 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
75b0: 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
75c0: 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
75d0: 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
75e0: 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
75f0: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
7600: 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
7610: 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
7620: 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
7630: 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
7640: 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
7650: 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
7660: 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
7670: 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
7680: 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
7690: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
76a0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
76b0: 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
76c0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
76d0: 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
76e0: 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
76f0: 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
7700: 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
7710: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
7720: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
7730: 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
7740: 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
7750: 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
7760: 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
7770: 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
7780: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
7790: 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
77a0: 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
77b0: 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
77c0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
77d0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
77e0: 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
77f0: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
7800: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
7810: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
7820: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
7830: 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
7840: 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
7850: 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
7860: 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
7870: 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
7880: 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
7890: 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
78a0: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66  E_OK;.#else..#if
78b0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
78c0: 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
78d0: 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
78e0: 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
78f0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
7900: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
7910: 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
7920: 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
7930: 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
7940: 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
7950: 0a 20 20 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .   * It shouldn
7960: 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
7970: 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
7980: 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
7990: 6c 20 0a 20 20 20 2a 20 66 69 6c 65 20 73 79 73  l .   * file sys
79a0: 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
79b0: 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
79c0: 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
79d0: 43 0a 20 20 20 2a 20 69 73 6e 27 74 20 73 75 70  C.   * isn't sup
79e0: 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
79f0: 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
7a00: 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
7a10: 63 20 0a 20 20 20 2a 20 61 6e 64 20 28 66 6f 72  c .   * and (for
7a20: 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
7a30: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
7a40: 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
7a50: 20 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74   call.  .   * It
7a60: 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
7a70: 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
7a80: 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
7a90: 64 20 61 76 6f 69 64 20 0a 20 20 20 2a 20 74 68  d avoid .   * th
7aa0: 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
7ab0: 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
7ac0: 63 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  called..   */.  
7ad0: 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
7ae0: 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20  ync(fd);..#else 
7af0: 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20  .  if( dataOnly 
7b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74  ){.    rc = fdat
7b10: 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c  async(fd);.  }el
7b20: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79  se{.    rc = fsy
7b30: 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
7b40: 69 66 20 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46  if /* HAVE_FULLF
7b50: 53 59 4e 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  SYNC */.#endif /
7b60: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
7b70: 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20  _NO_SYNC) */..  
7b80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7b90: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
7ba0: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
7bb0: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
7bc0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
7bd0: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
7be0: 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
7bf0: 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
7c00: 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
7c10: 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
7c20: 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
7c30: 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
7c40: 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
7c50: 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
7c60: 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
7c70: 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
7c80: 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
7c90: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
7ca0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7cb0: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
7cc0: 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
7cd0: 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
7ce0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
7cf0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7d00: 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
7d10: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
7d20: 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
7d30: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
7d40: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
7d50: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
7d60: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
7d70: 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
7d80: 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
7d90: 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
7da0: 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
7db0: 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
7dc0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
7dd0: 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
7de0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
7df0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
7e00: 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
7e10: 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
7e20: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
7e30: 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
7e40: 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
7e50: 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
7e60: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
7e70: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
7e80: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
7e90: 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
7ea0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
7eb0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
7ec0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
7ed0: 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
7ee0: 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
7ef0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
7f00: 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
7f10: 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
7f20: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
7f30: 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
7f40: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
7f50: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
7f60: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
7f70: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
7f80: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
7f90: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
7fa0: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
7fb0: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
7fc0: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 61  C_FULL.  );..  a
7fd0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
7fe0: 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43    OSTRACE2("SYNC
7ff0: 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
8000: 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66  le->h);.  rc = f
8010: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
8020: 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
8030: 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
8040: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
8050: 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
8060: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8070: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
8080: 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  C;.  }.  if( pFi
8090: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a  le->dirfd>=0 ){.
80a0: 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44 49      OSTRACE4("DI
80b0: 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65  RSYNC %-3d (have
80c0: 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
80d0: 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
80e0: 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20  File->dirfd,.   
80f0: 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
8100: 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
8110: 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ync);.#ifndef SQ
8120: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
8130: 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20  SYNC.    /* The 
8140: 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
8150: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
8160: 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69   if full_fsync i
8170: 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20  s.    ** turned 
8180: 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62  off or unavailab
8190: 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66  le.  If a full_f
81a0: 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62  sync occurred ab
81b0: 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ove,.    ** then
81c0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
81d0: 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f  ync is superfluo
81e0: 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  us..    */.    i
81f0: 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53  f( (!HAVE_FULLFS
8200: 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79  YNC || !isFullsy
8210: 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e  nc) && full_fsyn
8220: 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30  c(pFile->dirfd,0
8230: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a  ,0) ){.       /*
8240: 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61  .       ** We ha
8250: 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  ve received mult
8260: 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20  iple reports of 
8270: 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e  fsync() returnin
8280: 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  g.       ** erro
8290: 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20  rs when applied 
82a0: 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f  to directories o
82b0: 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73  n certain file s
82c0: 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a  ystems..       *
82d0: 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63  * A failed direc
82e0: 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74  tory sync is not
82f0: 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f   a big deal.  So
8300: 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20   it seems.      
8310: 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67   ** better to ig
8320: 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20  nore the error. 
8330: 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20   Ticket #1657.  
8340: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f       */.       /
8350: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
8360: 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
8370: 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73 65  #endif.    close
8380: 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20  (pFile->dirfd); 
8390: 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f   /* Only need to
83a0: 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63   sync once, so c
83b0: 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74 6f  lose the directo
83c0: 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ry */.    pFile-
83d0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20  >dirfd = -1;    
83e0: 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  /* when we are d
83f0: 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  one. */.  }.  re
8400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8410: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
8420: 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
8430: 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
8440: 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
8450: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
8460: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
8470: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  i64 nByte){.  in
8480: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
8490: 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  id );.  Simulate
84a0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
84b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
84c0: 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20  NCATE );.  rc = 
84d0: 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78  ftruncate(((unix
84e0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f  File*)id)->h, (o
84f0: 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
8500: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
8510: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8520: 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c  _TRUNCATE;.  }el
8530: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
8540: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
8550: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
8560: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
8570: 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
8580: 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
8590: 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
85a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
85b0: 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
85c0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
85d0: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
85e0: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
85f0: 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
8600: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
8610: 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
8620: 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
8630: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8650: 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
8660: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
8670: 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72  st_size;.  retur
8680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8690: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
86a0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
86b0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
86c0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
86d0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
86e0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
86f0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
8700: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
8710: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
8720: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49  .** non-zero.  I
8730: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
8740: 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20  locked or holds 
8750: 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b  only SHARED lock
8760: 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  s, then.** retur
8770: 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
8780: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
8790: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
87a0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
87b0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
87c0: 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78  nt r = 0;.  unix
87d0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
87e0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
87f0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8810: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8820: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
8830: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
8840: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f   enterMutex(); /
8850: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
8860: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
8870: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
8880: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
8890: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
88a0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
88b0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
88c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f    if( pFile->pLo
88d0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  ck->locktype>SHA
88e0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
88f0: 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r = 1;.  }..  /*
8900: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
8910: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
8920: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
8930: 20 2a 2f 0a 20 20 69 66 28 20 21 72 20 29 7b 0a   */.  if( !r ){.
8940: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
8950: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
8960: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
8970: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
8980: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
8990: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
89a0: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
89b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
89c0: 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28  RLCK;.    fcntl(
89d0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
89e0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
89f0: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
8a00: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
8a10: 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20   r = 1;.    }.  
8a20: 7d 0a 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65  }.  .  leaveMute
8a30: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  x();.  OSTRACE3(
8a40: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
8a50: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
8a60: 2c 20 72 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  , r);..  *pResOu
8a70: 74 20 3d 20 72 3b 0a 20 20 72 65 74 75 72 6e 20  t = r;.  return 
8a80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8a90: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
8aa0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
8ab0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
8ac0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
8ad0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
8ae0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
8af0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
8b00: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
8b10: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
8b20: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
8b30: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
8b40: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
8b50: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
8b60: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
8b70: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
8b80: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
8b90: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
8ba0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
8bb0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
8bc0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
8bd0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
8be0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
8bf0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
8c00: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
8c10: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
8c20: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
8c30: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
8c40: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
8c50: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
8c60: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
8c70: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
8c80: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
8c90: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
8ca0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
8cb0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
8cc0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
8cd0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
8ce0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
8cf0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
8d00: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
8d10: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
8d20: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
8d30: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
8d40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8d50: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
8d60: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
8d70: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
8d80: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
8d90: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
8da0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
8db0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8dc0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
8dd0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
8de0: 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ype){.  /* The f
8df0: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
8e00: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
8e10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
8e20: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
8e30: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
8e40: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
8e50: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
8e60: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
8e70: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
8e80: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
8e90: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
8ea0: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
8eb0: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
8ec0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
8ed0: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
8ee0: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
8ef0: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
8f00: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
8f10: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
8f20: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
8f30: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
8f40: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
8f50: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
8f60: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
8f70: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
8f80: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
8f90: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
8fa0: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
8fb0: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
8fc0: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
8fd0: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
8fe0: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
8ff0: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
9000: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
9010: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
9020: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
9030: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
9040: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
9050: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
9060: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
9070: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
9080: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
9090: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
90a0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
90b0: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
90c0: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
90d0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
90e0: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
90f0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
9100: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
9110: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
9120: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
9130: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
9140: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
9150: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
9160: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
9170: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
9180: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
9190: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
91a0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
91b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
91c0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
91d0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
91e0: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
91f0: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
9200: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
9210: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
9220: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
9230: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
9240: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
9250: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
9260: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9270: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
9280: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
9290: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
92a0: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
92b0: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
92c0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
92d0: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
92e0: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
92f0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
9300: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
9310: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
9320: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
9330: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
9340: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
9350: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
9360: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
9370: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
9380: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
9390: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
93a0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
93b0: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
93c0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
93d0: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
93e0: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
93f0: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
9400: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
9410: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
9420: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
9430: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
9440: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
9450: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
9460: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
9470: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
9480: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
9490: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
94a0: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
94b0: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
94c0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
94d0: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
94e0: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
94f0: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
9500: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
9510: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
9520: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
9530: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
9540: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
9550: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
9560: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
9570: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
9580: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
9590: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
95a0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
95b0: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
95c0: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
95d0: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
95e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
95f0: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
9600: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
9610: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
9620: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
9630: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
9640: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
9650: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74  ixFile*)id;.  st
9660: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
9670: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
9680: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
9690: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
96a0: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  s;..  assert( pF
96b0: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
96c0: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
96d0: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
96e0: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
96f0: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
9700: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
9710: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
9720: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
9730: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
9740: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
9750: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
9760: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
9770: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
9780: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
9790: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
97a0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
97b0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
97c0: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
97d0: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
97e0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
97f0: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74  ath, as.  ** ent
9800: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
9810: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
9820: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
9830: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
9840: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
9850: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
9860: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
9870: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
9880: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
9890: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
98a0: 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
98b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
98c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
98d0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
98e0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
98f0: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
9900: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
9910: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
9920: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9930: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9940: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
9950: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
9960: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
9970: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
9980: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
9990: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
99a0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
99b0: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
99c0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
99d0: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
99e0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
99f0: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
9a00: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
9a10: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
9a20: 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c  ad owns the pFil
9a30: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  e..  */.  rc = t
9a40: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
9a50: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
9a60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9a70: 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
9a80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
9a90: 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  .  }.  pLock = p
9aa0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  File->pLock;..  
9ab0: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
9ac0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
9ad0: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
9ae0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
9af0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
9b00: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
9b10: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
9b20: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
9b30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
9b40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70  ile->locktype!=p
9b50: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26  Lock->locktype &
9b60: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  & .          (pL
9b70: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
9b80: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
9b90: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
9ba0: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
9bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
9bc0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
9bd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
9be0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
9bf0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
9c00: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
9c10: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
9c20: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
9c30: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
9c40: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
9c50: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
9c60: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
9c70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9c80: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  K..  */.  if( lo
9c90: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9ca0: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
9cb0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
9cc0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
9cd0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
9ce0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
9cf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f  {.    assert( lo
9d00: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9d10: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
9d20: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
9d30: 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pe==0 );.    ass
9d40: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  ert( pLock->cnt>
9d50: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
9d60: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
9d70: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  D_LOCK;.    pLoc
9d80: 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46  k->cnt++;.    pF
9d90: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
9da0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
9db0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c  d_lock;.  }..  l
9dc0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
9dd0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
9de0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20   = SEEK_SET;..  
9df0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
9e00: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
9e10: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
9e20: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
9e30: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
9e40: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
9e50: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
9e60: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
9e70: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
9e80: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
9e90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
9ea0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9eb0: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
9ec0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
9ed0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
9ee0: 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47  locktype<PENDING
9ef0: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
9f00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c  lock.l_type = (l
9f10: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9f20: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
9f30: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
9f40: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
9f50: 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20  G_BYTE;.    s = 
9f60: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
9f70: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
9f80: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9f90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28   ){.      rc = (
9fa0: 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f  errno==EINVAL) ?
9fb0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20   SQLITE_NOLFS : 
9fc0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9fd0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
9fe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
9ff0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
a000: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
a010: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
a020: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
a030: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
a040: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
a050: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
a060: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
a070: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
a080: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
a090: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
a0a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
a0b0: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
a0c0: 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  pe==0 );..    /*
a0d0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
a0e0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
a0f0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
a100: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
a110: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
a120: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d  ED_SIZE;.    s =
a130: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a140: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a150: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ;..    /* Drop t
a160: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
a170: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
a180: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a190: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
a1a0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
a1b0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
a1c0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
a1d0: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
a1e0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
a1f0: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
a200: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
a210: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20  ERR_UNLOCK;  /* 
a220: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
a230: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
a240: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
a250: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
a260: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a270: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
a280: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
a290: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
a2a0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
a2b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a2c0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
a2d0: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
a2e0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
a2f0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
a300: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
a310: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
a320: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a330: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
a340: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
a350: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
a360: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
a370: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
a380: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
a390: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
a3a0: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
a3b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
a3c0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a3d0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
a3e0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
a3f0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
a400: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
a410: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
a420: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
a430: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
a440: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
a450: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
a460: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
a470: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
a480: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
a490: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
a4a0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
a4b0: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
a4c0: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
a4d0: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
a4e0: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
a4f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
a500: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
a510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a520: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
a530: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
a540: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a550: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
a560: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
a570: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
a580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a590: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a5a0: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
a5b0: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
a5c0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a5d0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a5e0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
a5f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
a600: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
a610: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
a620: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a630: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
a640: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a650: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a660: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a670: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
a680: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a690: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
a6a0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
a6b0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
a6c0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
a6d0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
a6e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a6f0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
a700: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
a710: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
a720: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
a730: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
a740: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
a750: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
a760: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
a770: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
a780: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
a790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a7a0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
a7b0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
a7c0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
a7d0: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
a7e0: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
a7f0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
a800: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
a810: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
a820: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
a830: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a840: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
a850: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
a860: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
a870: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
a880: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
a890: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a8a0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
a8b0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
a8c0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
a8d0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
a8e0: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
a8f0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
a900: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a910: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
a920: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
a930: 2a 29 69 64 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a  *)id;.  int h;..
a940: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
a950: 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55  );.  OSTRACE7("U
a960: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
a970: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
a980: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
a990: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
a9a0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
a9b0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
a9c0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
a9d0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
a9e0: 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
a9f0: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
aa00: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
aa10: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
aa20: 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
aa30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aa40: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
aa50: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
aa60: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
aa70: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
aa80: 0a 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65  .  }.  enterMute
aa90: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
aaa0: 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  ->h;.  pLock = p
aab0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
aac0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
aad0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
aae0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
aaf0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ab00: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
ab10: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
ab20: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
ab30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ab40: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
ab50: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
ab60: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
ab70: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
ab80: 67 6e 28 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  gn(0);.    if( l
ab90: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
aba0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
abb0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
abc0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
abd0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
abe0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
abf0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
ac00: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
ac10: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
ac20: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66  D_SIZE;.      if
ac30: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
ac40: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
ac50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ac60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
ac70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
ac80: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
ac90: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
aca0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
acb0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
acc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
acd0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ace0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
acf0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
ad00: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
ad10: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
ad20: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
ad30: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
ad40: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  -1) ){.      pLo
ad50: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  ck->locktype = S
ad60: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ad70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ad80: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
ad90: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  NLOCK;.    }.  }
ada0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
adb0: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
adc0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
add0: 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44  pOpen;..    /* D
ade0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
adf0: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
ae00: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
ae10: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
ae20: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
ae30: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
ae40: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
ae50: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
ae60: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
ae70: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
ae80: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
ae90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
aea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  t==0 ){.      lo
aeb0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
aec0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
aed0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
aee0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
aef0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
af00: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
af10: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
af20: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
af30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
af40: 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
af50: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
af60: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
af70: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
af80: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
af90: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  -1) ){.        p
afa0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
afb0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
afc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
afd0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
afe0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
aff0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b   pLock->cnt = 1;
b000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
b010: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
b020: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
b030: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
b040: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
b050: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
b060: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
b070: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
b080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b090: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
b0a0: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
b0b0: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
b0c0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
b0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
b0e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b0f0: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46        pOpen = pF
b100: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20  ile->pOpen;.    
b110: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
b120: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b130: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  pOpen->nLock>=0 
b140: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
b150: 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20  en->nLock==0 && 
b160: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e  pOpen->nPending>
b170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
b180: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
b190: 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50  i=0; i<pOpen->nP
b1a0: 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  ending; i++){.  
b1b0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
b1c0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
b1d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b1e0: 20 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d       free(pOpen-
b1f0: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
b200: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
b210: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ing = 0;.       
b220: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
b230: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
b240: 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d    }.  }.  leaveM
b250: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
b260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
b270: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
b280: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
b290: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b2a0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
b2c0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
b2d0: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
b2e0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
b2f0: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
b300: 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75  f( !pFile ) retu
b310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b320: 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  unixUnlock(id, N
b330: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 70  O_LOCK);.  if( p
b340: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
b350: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
b360: 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  rfd);.  pFile->d
b370: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
b380: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66  erMutex();..  if
b390: 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  ( pFile->pOpen->
b3a0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
b3b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
b3c0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
b3d0: 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
b3e0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
b3f0: 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
b400: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
b410: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
b420: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
b430: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
b440: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
b450: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
b460: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
b470: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
b480: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74  ed when.    ** t
b490: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
b4a0: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
b4b0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
b4c0: 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e     struct openCn
b4d0: 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65  t *pOpen = pFile
b4e0: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65  ->pOpen;.    aNe
b4f0: 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70  w = realloc( pOp
b500: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70  en->aPending, (p
b510: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31  Open->nPending+1
b520: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
b530: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
b540: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b550: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20  a malloc fails, 
b560: 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69  just leak the fi
b570: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
b580: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b590: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
b5a0: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  g = aNew;.      
b5b0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
b5c0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
b5d0: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
b5e0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
b5f0: 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ng++;.    }.  }e
b600: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
b610: 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
b620: 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65  ding locks so we
b630: 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20 66   can close the f
b640: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
b650: 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 70 46 69  */.    close(pFi
b660: 6c 65 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65  le->h);.  }.  re
b670: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
b680: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72  ile->pLock);.  r
b690: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46  eleaseOpenCnt(pF
b6a0: 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20  ile->pOpen);..  
b6b0: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
b6c0: 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  OSTRACE2("CLOSE 
b6d0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
b6e0: 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
b6f0: 74 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ter(-1);.  memse
b700: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
b710: 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
b720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b730: 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  K;.}...#ifdef SQ
b740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
b750: 49 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61 67 6d  ING_STYLE.#pragm
b760: 61 20 6d 61 72 6b 20 41 46 50 20 53 75 70 70 6f  a mark AFP Suppo
b770: 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61  rt../*. ** The a
b780: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
b790: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
b7a0: 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
b7b0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
b7c0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
b7d0: 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
b7e0: 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
b7f0: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
b800: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
b810: 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f   {.  unsigned lo
b820: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
b830: 63 6b 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20  ckByte;.  const 
b840: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a  char *filePath;.
b850: 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
b860: 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
b870: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
b880: 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
b890: 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
b8a0: 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
b8b0: 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
b8c0: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
b8d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
b8e0: 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
b8f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
b900: 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
b910: 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
b920: 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
b930: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
b940: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b950: 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
b960: 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
b970: 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
b980: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b990: 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
b9a0: 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
b9b0: 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
b9c0: 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
b9d0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
ba00: 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
ba10: 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
ba20: 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
ba30: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
ba40: 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
ba50: 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
ba60: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
ba70: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ../* .** Return 
ba80: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20  0 on success, 1 
ba90: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 6f 20  on failure.  To 
baa0: 6d 61 74 63 68 20 74 68 65 20 62 65 68 61 76 69  match the behavi
bab0: 6f 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6e 6f  or of the .** no
bac0: 72 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20  rmal posix file 
bad0: 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e  locking (used in
bae0: 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78   unixLock for ex
baf0: 61 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c  ample), we shoul
bb00: 64 20 0a 2a 2a 20 70 72 6f 76 69 64 65 20 27 72  d .** provide 'r
bb10: 69 63 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f  icher' return co
bb20: 64 65 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c  des - specifical
bb30: 6c 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ly to differenti
bb40: 61 74 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 27  ate between.** '
bb50: 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64 20 27  file busy' and '
bb60: 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72 72 6f  file system erro
bb70: 72 27 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73  r' results..*/.s
bb80: 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53  tatic int _AFPFS
bb90: 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
bba0: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20   char *path, .  
bbb0: 69 6e 74 20 66 64 2c 20 0a 20 20 75 6e 73 69 67  int fd, .  unsig
bbc0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
bbd0: 66 73 65 74 2c 20 0a 20 20 75 6e 73 69 67 6e 65  fset, .  unsigne
bbe0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
bbf0: 74 68 2c 20 0a 20 20 69 6e 74 20 73 65 74 4c 6f  th, .  int setLo
bc00: 63 6b 46 6c 61 67 0a 29 7b 0a 20 20 73 74 72 75  ckFlag.){.  stru
bc10: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
bc20: 50 42 32 20 20 20 20 20 20 20 70 62 3b 0a 20 20  PB2       pb;.  
bc30: 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  int             
bc40: 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20 0a          err;.  .
bc50: 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
bc60: 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
bc70: 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
bc80: 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
bc90: 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
bca0: 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
bcb0: 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
bcc0: 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52 41  fd = fd;.  OSTRA
bcd0: 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74  CE5("AFPLOCK set
bce0: 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72  ting lock %s for
bcf0: 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c   %d in range %ll
bd00: 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
bd10: 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
bd20: 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66  ":"OFF"), fd, of
bd30: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
bd40: 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
bd50: 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
bd60: 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
bd70: 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
bd80: 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53 54  ==-1 ) {.    OST
bd90: 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66  RACE4("AFPLOCK f
bda0: 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
bdb0: 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20   '%s' %d %s\n", 
bdc0: 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20  path, errno, .  
bdd0: 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72 72      strerror(err
bde0: 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  no));.    return
bdf0: 20 31 3b 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 0a   1; /* error */.
be00: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
be10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
be20: 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74  /*. ** This rout
be30: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
be40: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
be50: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
be60: 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a  he specified. **
be70: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
be80: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
be90: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
bea0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
beb0: 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  rn. ** non-zero.
bec0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
bed0: 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c   unlocked or hol
bee0: 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c  ds only SHARED l
bef0: 6f 63 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72  ocks, then. ** r
bf00: 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  eturn zero.. */.
bf10: 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
bf20: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
bf30: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
bf40: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
bf50: 75 74 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30  ut){.  int r = 0
bf60: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
bf70: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
bf80: 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
bf90: 28 20 70 46 69 6c 65 20 29 3b 20 0a 20 20 61 66  ( pFile ); .  af
bfa0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
bfb0: 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
bfc0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
bfd0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
bfe0: 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
bff0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
c000: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
c010: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
c020: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
c030: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
c040: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c050: 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  r = 1;.  }.  .  
c060: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
c070: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
c080: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
c090: 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 20 21 72  .   */.  if ( !r
c0a0: 20 29 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b   ) {.    /* lock
c0b0: 20 74 68 65 20 62 79 74 65 20 2a 2f 0a 20 20 20   the byte */.   
c0c0: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
c0d0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
c0e0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
c0f0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
c100: 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
c110: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
c120: 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
c130: 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
c140: 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
c150: 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
c160: 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
c170: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73  r = 1;.    } els
c180: 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
c190: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
c1a0: 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
c1b0: 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
c1c0: 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
c1d0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
c1e0: 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
c1f0: 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c 6f 63      _AFPFSSetLoc
c200: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
c210: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52  ath, pFile->h, R
c220: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
c230: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
c240: 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20   OSTRACE3("TEST 
c250: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22  WR-LOCK %d %d\n"
c260: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a  , pFile->h, r);.
c270: 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
c280: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
c290: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 46 50  TE_OK;.}../* AFP
c2a0: 2d 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66  -style locking f
c2b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68  ollowing the beh
c2c0: 61 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63  avior of unixLoc
c2d0: 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 4c  k, see the unixL
c2e0: 6f 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ock .** function
c2f0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65   comments for de
c300: 74 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61  tails of lock ma
c310: 6e 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61  nagement. */.sta
c320: 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 4c  tic int afpUnixL
c330: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c340: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
c350: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
c360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
c370: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
c380: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
c390: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
c3a0: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
c3b0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
c3c0: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
c3d0: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
c3e0: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
c3f0: 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
c400: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
c410: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
c420: 20 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25   %s was %s pid=%
c430: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
c440: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
c450: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
c460: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
c470: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ile->locktype), 
c480: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
c490: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
c4a0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
c4b0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
c4c0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
c4d0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
c4e0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
c4f0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
c500: 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
c510: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e  path, as.  ** en
c520: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
c530: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
c540: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
c550: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
c560: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
c570: 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
c580: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
c590: 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
c5a0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
c5b0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
c5c0: 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
c5d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
c5f0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
c600: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
c610: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
c620: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
c630: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
c640: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
c650: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
c660: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
c670: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
c680: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
c690: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c6a0: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
c6b0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
c6c0: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
c6d0: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
c6e0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
c6f0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
c700: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
c710: 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  /.  enterMutex()
c720: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
c730: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
c740: 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
c750: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ile..  */.  rc =
c760: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
c770: 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
c780: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c790: 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78  {.    leaveMutex
c7a0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
c7b0: 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  c;.  }.    .  /*
c7c0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
c7d0: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
c7e0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
c7f0: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
c800: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
c810: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
c820: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
c830: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
c840: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
c850: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
c860: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
c870: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
c880: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
c890: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
c8a0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
c8b0: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
c8c0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
c8d0: 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
c8e0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
c8f0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
c900: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
c910: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
c920: 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
c930: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
c940: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
c950: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
c960: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
c970: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
c980: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
c990: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
c9a0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
c9b0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
c9c0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
c9d0: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
c9e0: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
c9f0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
ca00: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
ca10: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66  ){.    int lk, f
ca20: 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20 74  ailed;.    int t
ca30: 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20  ries = 0;.    . 
ca40: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
ca50: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
ca60: 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
ca70: 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
ca80: 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
ca90: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
caa0: 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
cab0: 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
cac0: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
cad0: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20  dLockByte = (lk 
cae0: 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
caf0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
cb00: 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41  .    failed = _A
cb10: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
cb20: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
cb30: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
cb40: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e  SHARED_FIRST+con
cb50: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
cb60: 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
cb70: 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68   .    /* Drop th
cb80: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
cb90: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
cba0: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
cbb0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
cbc0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
cbd0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
cbe0: 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  0)) {.      rc =
cbf0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
cc00: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
cc10: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
cc20: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  en */.      goto
cc30: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
cc40: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66     }.    .    if
cc50: 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
cc60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
cc70: 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
cc80: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
cc90: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
cca0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LOCK;.    }.  }e
ccb0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ccc0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
ccd0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
cce0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
ccf0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
cd00: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
cd10: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
cd20: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
cd30: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
cd40: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
cd50: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
cd60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
cd70: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
cd80: 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b   );.    if (lock
cd90: 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44  type >= RESERVED
cda0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
cdb0: 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52  locktype < RESER
cdc0: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
cdd0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
cde0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
cdf0: 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
ce00: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
ce10: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
ce20: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45  th, pFile->h, RE
ce30: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
ce40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
ce50: 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
ce60: 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
ce70: 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
ce80: 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
ce90: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
cea0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
ceb0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
cec0: 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
ced0: 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
cee0: 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
cef0: 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
cf00: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
cf10: 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
cf20: 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
cf30: 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  nixUnlock.      
cf40: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f 41  */.      if (!_A
cf50: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
cf60: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
cf70: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
cf80: 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
cfb0: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 29  LockByte, 1, 0))
cfc0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f   {.        /* no
cfd0: 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
cfe0: 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
cff0: 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
d000: 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f        failed = _
d010: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d020: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d030: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
d040: 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
d070: 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
d080: 20 69 66 20 28 66 61 69 6c 65 64 20 26 26 20 5f   if (failed && _
d090: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d0a0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d0b0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
d0c0: 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
d0f0: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
d100: 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20  Byte, 1, 1)) {. 
d110: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
d120: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
d130: 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c  K; /* this shoul
d140: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
d150: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
d160: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d170: 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20     /* */.       
d180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
d190: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68  RR_UNLOCK; /* th
d1a0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
d1b0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
d1c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d1d0: 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d 20  failed && rc == 
d1e0: 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
d1f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
d200: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
d210: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d220: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
d230: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
d240: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
d250: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
d260: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
d270: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
d280: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
d290: 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
d2a0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65  nd_lock:.  leave
d2b0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
d2c0: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
d2d0: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
d2e0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
d2f0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
d300: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
d310: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
d320: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
d330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
d340: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
d350: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
d360: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
d370: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
d380: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
d390: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
d3a0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
d3b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
d3c0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
d3d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
d3e0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
d3f0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
d400: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
d410: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
d420: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d440: 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  afpUnixUnlock(sq
d450: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d460: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
d470: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d480: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
d490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
d4a0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d4b0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d4c0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d4d0: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
d4e0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
d4f0: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
d500: 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
d510: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d520: 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
d530: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
d540: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
d550: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
d560: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
d570: 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
d580: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
d590: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
d5a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
d5b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
d5c0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
d5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d5e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
d5f0: 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
d600: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d610: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
d620: 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28   }.  enterMutex(
d630: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
d640: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
d650: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  LOCK ){.    if( 
d660: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
d670: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
d680: 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a  nt failed = 0;..
d690: 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
d6a0: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61  the exclusive ra
d6b0: 6e 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73  nge - then re-es
d6c0: 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
d6d0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
d6e0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
d6f0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
d700: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
d710: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
d720: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
d730: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
d740: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
d750: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d770: 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
d780: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20   0);.        if 
d790: 28 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20  (!failed) {.    
d7a0: 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
d7b0: 66 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68  fully removed th
d7c0: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
d7d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d7e0: 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28   (_AFPFSSetLock(
d7f0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d800: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
d810: 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20  RED_FIRST+.     
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
d840: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
d850: 31 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 1)) {.       
d860: 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74       /* failed t
d870: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 6f  o re-establish o
d880: 75 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ur shared lock *
d890: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
d8a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d8b0: 52 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  RDLOCK; /* This 
d8c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
d8d0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pen */.         
d8e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   }.        } els
d8f0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e {.          /*
d900: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
d910: 65 72 20 68 61 70 70 65 6e 20 2d 20 66 61 69 6c  er happen - fail
d920: 65 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ed to unlock the
d930: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
d940: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
d950: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d960: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
d970: 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  } .      }.    }
d980: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
d990: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
d9a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  e->locktype>=PEN
d9b0: 44 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  DING_LOCK) {.   
d9c0: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
d9d0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
d9e0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
d9f0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
da00: 31 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 20 20  1, 0)){.        
da10: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c  /* failed to rel
da20: 65 61 73 65 20 74 68 65 20 70 65 6e 64 69 6e 67  ease the pending
da30: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
da40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
da50: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68  RR_UNLOCK; /* Th
da60: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
da70: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
da80: 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20  }.    } .    if 
da90: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
daa0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
dab0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
dac0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
dad0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
dae0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
daf0: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
db00: 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 29  VED_BYTE, 1, 0))
db10: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61   {.        /* fa
db20: 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
db30: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
db40: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
db50: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
db60: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
db70: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
db80: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
db90: 20 20 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20     } .  }.  if( 
dba0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
dbb0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69  K ){.    int fai
dbc0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
dbd0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
dbe0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
dbf0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
dc20: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
dc30: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
dc40: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
dc50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
dc60: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
dc70: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
dc80: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
dc90: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
dca0: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
dcb0: 4b 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  K).    pFile->lo
dcc0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
dcd0: 65 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  e;.  leaveMutex(
dce0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
dcf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
dd00: 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
dd10: 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
dd20: 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
dd30: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
dd40: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
dd50: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
dd60: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
dd70: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
dd80: 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20  .  if( !pFile ) 
dd90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dda0: 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63  ;.  afpUnixUnloc
ddb0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
ddc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ddd0: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
dde0: 74 65 78 74 29 3b 0a 20 20 69 66 28 20 70 46 69  text);.  if( pFi
ddf0: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63  le->dirfd>=0 ) c
de00: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
de10: 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72  d);.  pFile->dir
de20: 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72  fd = -1;.  enter
de30: 4d 75 74 65 78 28 29 3b 0a 20 20 63 6c 6f 73 65  Mutex();.  close
de40: 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c 65  (pFile->h);.  le
de50: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
de60: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
de70: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
de80: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
de90: 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28  r(-1);.  memset(
dea0: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
deb0: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
dec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ded0: 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  .}...#pragma mar
dee0: 6b 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20  k flock() style 
def0: 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54  locking../*.** T
df00: 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  he flockLockingC
df10: 6f 6e 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73  ontext is not us
df20: 65 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f  ed.*/.typedef vo
df30: 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  id flockLockingC
df40: 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20  ontext;..static 
df50: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65  int flockUnixChe
df60: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
df70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
df80: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
df90: 20 20 69 6e 74 20 72 20 3d 20 31 3b 0a 20 20 75    int r = 1;.  u
dfa0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
dfb0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
dfc0: 20 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e    .  if (pFile->
dfd0: 6c 6f 63 6b 74 79 70 65 20 21 3d 20 52 45 53 45  locktype != RESE
dfe0: 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
dff0: 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
e000: 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
e010: 20 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63     int rc = floc
e020: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
e030: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
e040: 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
e050: 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
e060: 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
e070: 2a 2f 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70  */.      flock(p
e080: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
e090: 29 3b 0a 20 20 20 20 20 20 72 20 3d 20 30 3b 20  );.      r = 0; 
e0a0: 20 2f 2a 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69   /* no one has i
e0b0: 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
e0c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 52 65 73    }.  }..  *pRes
e0d0: 4f 75 74 20 3d 20 72 3b 0a 20 20 72 65 74 75 72  Out = r;.  retur
e0e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e0f0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
e100: 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  UnixLock(sqlite3
e110: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
e120: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
e130: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e140: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e150: 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
e160: 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
e170: 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
e180: 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
e190: 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
e1a0: 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
e1b0: 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
e1c0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
e1d0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
e1e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
e1f0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
e200: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e210: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
e220: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e230: 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  k */.  int rc = 
e240: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e250: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e260: 42 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a  B);.  if (rc) {.
e270: 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
e280: 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
e290: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
e2a0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65  LITE_BUSY;.  } e
e2b0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
e2c0: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
e2d0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
e2e0: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
e2f0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
e300: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
e310: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
e320: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
e330: 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  UnixUnlock(sqlit
e340: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
e350: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
e360: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e370: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e380: 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63    .  assert( loc
e390: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
e3a0: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
e3b0: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
e3c0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e3d0: 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
e3e0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
e3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e400: 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
e410: 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
e420: 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
e430: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
e440: 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
e450: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
e460: 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
e470: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
e480: 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
e490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e4a0: 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
e4b0: 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
e4c0: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
e4d0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
e4e0: 29 3b 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20  );.  if (rc).   
e4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
e500: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65  OERR_UNLOCK;.  e
e510: 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
e520: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
e530: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
e540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
e550: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
e560: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
e570: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f  int flockUnixClo
e580: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
e590: 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  *id) {.  unixFil
e5a0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e5b0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69  File*)id;.  .  i
e5c0: 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75  f( !pFile ) retu
e5d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e5e0: 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28  flockUnixUnlock(
e5f0: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
e600: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
e610: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70  rfd>=0 ) close(p
e620: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
e630: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
e640: 31 3b 0a 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  1;..  enterMutex
e650: 28 29 3b 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c  ();.  close(pFil
e660: 65 2d 3e 68 29 3b 20 20 0a 20 20 6c 65 61 76 65  e->h);  .  leave
e670: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
e680: 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE2("CLOSE   %-3
e690: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
e6a0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
e6b0: 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  1);.  memset(pFi
e6c0: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
e6d0: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
e6e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e6f0: 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c  .#pragma mark Ol
e700: 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66  d-School .lock f
e710: 69 6c 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e  ile based lockin
e720: 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  g../*.** The dot
e730: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e740: 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
e750: 74 61 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f 63  tains all dotloc
e760: 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a 2a  k (.lock) lock.*
e770: 2a 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  * specific state
e780: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
e790: 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ct dotlockLockin
e7a0: 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c 6f 63 6b  gContext dotlock
e7b0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
e7c0: 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f  struct dotlockLo
e7d0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
e7e0: 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3b   char *lockPath;
e7f0: 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  .};...static int
e800: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
e810: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e820: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e830: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
e840: 20 20 69 6e 74 20 72 20 3d 20 31 3b 0a 20 20 75    int r = 1;.  u
e850: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e860: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e870: 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67    dotlockLocking
e880: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
e890: 3b 0a 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  ;..  context = (
e8a0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
e8b0: 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
e8c0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
e8d0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
e8e0: 79 70 65 20 21 3d 20 52 45 53 45 52 56 45 44 5f  ype != RESERVED_
e8f0: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 73 74 72 75  LOCK) {.    stru
e900: 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
e910: 0a 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63  .    if (lstat(c
e920: 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
e930: 2c 26 73 74 61 74 42 75 66 29 20 21 3d 20 30 29  ,&statBuf) != 0)
e940: 7b 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20  {.      /* file 
e950: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
e960: 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
e970: 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
e980: 2f 0a 20 20 20 20 20 20 72 20 3d 20 30 3b 0a 20  /.      r = 0;. 
e990: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 52 65     }.  }..  *pRe
e9a0: 73 4f 75 74 20 3d 20 72 3b 0a 20 20 72 65 74 75  sOut = r;.  retu
e9b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e9c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
e9d0: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  ockUnixLock(sqli
e9e0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e9f0: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
ea00: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ea10: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ea20: 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  .  dotlockLockin
ea30: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
ea40: 74 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 0a 20 20  t;.  int fd;..  
ea50: 63 6f 6e 74 65 78 74 20 3d 20 28 64 6f 74 6c 6f  context = (dotlo
ea60: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
ea70: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
ea80: 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a  Context;.  .  /*
ea90: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
eaa0: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
eab0: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
eac0: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
ead0: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
eae0: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
eaf0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
eb00: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
eb10: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
eb20: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
eb30: 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  pe;.    .    /* 
eb40: 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
eb50: 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
eb60: 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20  he old file */. 
eb70: 20 20 20 75 74 69 6d 65 73 28 63 6f 6e 74 65 78     utimes(contex
eb80: 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c  t->lockPath,NULL
eb90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
eba0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
ebb0: 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65    /* check to se
ebc0: 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61  e if lock file a
ebd0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
ebe0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
ebf0: 74 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73  tatBuf;.  if (ls
ec00: 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63  tat(context->loc
ec10: 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66 29 20  kPath,&statBuf) 
ec20: 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72  == 0){.    retur
ec30: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f  n SQLITE_BUSY; /
ec40: 2a 20 69 74 20 64 6f 65 73 2c 20 62 75 73 79 20  * it does, busy 
ec50: 2a 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  */.  }.  .  /* g
ec60: 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
ec70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20   lock */.  fd = 
ec80: 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  open(context->lo
ec90: 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckPath,O_RDONLY|
eca0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
ecb0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
ecc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
ecd0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
ece0: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
ecf0: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
ed00: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
ed10: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
ed20: 51 4c 49 54 45 5f 42 55 53 59 3b 20 0a 20 20 7d  QLITE_BUSY; .  }
ed30: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
ed40: 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
ed50: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
ed60: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
ed70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ed80: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
ed90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
edb0: 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  ockUnixUnlock(sq
edc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
edd0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
ede0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
edf0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
ee00: 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  d;.  dotlockLock
ee10: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
ee20: 65 78 74 3b 0a 0a 20 20 63 6f 6e 74 65 78 74 20  ext;..  context 
ee30: 3d 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  = (dotlockLockin
ee40: 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
ee50: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
ee60: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  .  .  assert( lo
ee70: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
ee80: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
ee90: 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
eea0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
eeb0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
eec0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
eed0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
eee0: 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
eef0: 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
ef00: 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
ef10: 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
ef20: 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
ef30: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ef40: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
ef50: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
ef60: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ef80: 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
ef90: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
efa0: 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74 65 78 74 2d   unlink(context-
efb0: 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 70 46  >lockPath);.  pF
efc0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
efd0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
efe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
eff0: 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
f000: 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
f010: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43  int dotlockUnixC
f020: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f030: 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
f040: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f050: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
f060: 20 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65   if( !pFile ) re
f070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f080: 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c    dotlockUnixUnl
f090: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
f0a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
f0b0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
f0c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66 28 20 70  ontext);.  if( p
f0d0: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
f0e0: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
f0f0: 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  rfd);.  pFile->d
f100: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
f110: 65 72 4d 75 74 65 78 28 29 3b 20 20 0a 20 20 63  erMutex();  .  c
f120: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  lose(pFile->h);.
f130: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
f140: 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53    OSTRACE2("CLOS
f150: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
f160: 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  le->h);.  OpenCo
f170: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d  unter(-1);.  mem
f180: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
f190: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
f1a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f1b0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61  _OK;.}...#pragma
f1c0: 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67   mark No locking
f1d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6c 6f  ../*.** The nolo
f1e0: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f1f0: 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74 79 70 65   is void.*/.type
f200: 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c  def void nolockL
f210: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
f220: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f230: 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  kUnixCheckReserv
f240: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f250: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
f260: 65 73 4f 75 74 29 20 7b 0a 20 20 2a 70 52 65 73  esOut) {.  *pRes
f270: 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
f280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f290: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f2a0: 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65  kUnixLock(sqlite
f2b0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f2c0: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65  locktype) {.  re
f2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f2e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  }..static int no
f2f0: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73  lockUnixUnlock(s
f300: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f310: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
f320: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f330: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
f340: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
f350: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
f360: 55 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  UnixClose(sqlite
f370: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
f380: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f390: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f3a0: 0a 20 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65  .  .  if( !pFile
f3b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f3c0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  _OK;.  if( pFile
f3d0: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
f3e0: 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
f3f0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  ;.  pFile->dirfd
f400: 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75   = -1;.  enterMu
f410: 74 65 78 28 29 3b 0a 20 20 63 6c 6f 73 65 28 70  tex();.  close(p
f420: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c 65 61 76  File->h);.  leav
f430: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
f440: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
f450: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
f460: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
f470: 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  -1);.  memset(pF
f480: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
f490: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  nixFile));.  ret
f4a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f4b0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
f4c0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
f4d0: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a  G_STYLE */.../*.
f4e0: 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
f4f0: 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
f500: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
f510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f520: 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
f530: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f540: 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
f550: 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
f560: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
f570: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
f580: 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
f590: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
f5a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
f5b0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
f5c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f5e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f5f0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
f600: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
f610: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
f620: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
f630: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
f640: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
f650: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
f660: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
f670: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
f680: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
f690: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
f6a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
f6b0: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
f6c0: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
f6d0: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
f6e0: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
f6f0: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
f700: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
f710: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
f720: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
f730: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
f740: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
f750: 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
f760: 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
f770: 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
f780: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
f790: 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
f7a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f7b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
f7c0: 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
f7d0: 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
f7e0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
f7f0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
f800: 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
f810: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
f820: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
f830: 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
f840: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
f850: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
f860: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f870: 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
f880: 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
f890: 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
f8a0: 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71  operate on an sq
f8b0: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f  lite3_file.** fo
f8c0: 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  r unix..*/.stati
f8d0: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
f8e0: 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74  io_methods sqlit
f8f0: 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  e3UnixIoMethod =
f900: 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f920: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
f930: 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  unixClose,.  uni
f940: 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
f950: 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61  te,.  unixTrunca
f960: 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a  te,.  unixSync,.
f970: 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
f980: 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e    unixLock,.  un
f990: 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78  ixUnlock,.  unix
f9a0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f9b0: 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  k,.  unixFileCon
f9c0: 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74  trol,.  unixSect
f9d0: 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65  orSize,.  unixDe
f9e0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
f9f0: 69 63 73 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53  ics.};..#ifdef S
fa00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
fa10: 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
fa20: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
fa30: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
fa40: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
fa50: 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69  erate on an sqli
fa60: 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20  te3_file.** for 
fa70: 75 6e 69 78 20 77 69 74 68 20 41 46 50 20 73 74  unix with AFP st
fa80: 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
fa90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
faa0: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
fab0: 68 6f 64 73 20 73 71 6c 69 74 65 33 41 46 50 4c  hods sqlite3AFPL
fac0: 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
fad0: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
fb00: 2f 0a 20 20 61 66 70 55 6e 69 78 43 6c 6f 73 65  /.  afpUnixClose
fb10: 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20  ,.  unixRead,.  
fb20: 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69  unixWrite,.  uni
fb30: 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69  xTruncate,.  uni
fb40: 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c  xSync,.  unixFil
fb50: 65 53 69 7a 65 2c 0a 20 20 61 66 70 55 6e 69 78  eSize,.  afpUnix
fb60: 4c 6f 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78 55  Lock,.  afpUnixU
fb70: 6e 6c 6f 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78  nlock,.  afpUnix
fb80: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
fb90: 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  k,.  unixFileCon
fba0: 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74  trol,.  unixSect
fbb0: 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65  orSize,.  unixDe
fbc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
fbd0: 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ics.};../*.** Th
fbe0: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
fbf0: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
fc00: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
fc10: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
fc20: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
fc30: 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73  x with flock() s
fc40: 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
fc50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  g..*/.static con
fc60: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
fc70: 74 68 6f 64 73 20 73 71 6c 69 74 65 33 46 6c 6f  thods sqlite3Flo
fc80: 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
fc90: 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20  ethod = {.  1,  
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
fcc0: 6e 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 69 78  n */.  flockUnix
fcd0: 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61  Close,.  unixRea
fce0: 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  d,.  unixWrite,.
fcf0: 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
fd00: 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e    unixSync,.  un
fd10: 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 66 6c  ixFileSize,.  fl
fd20: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 66  ockUnixLock,.  f
fd30: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
fd40: 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b    flockUnixCheck
fd50: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
fd60: 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
fd70: 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  .  unixSectorSiz
fd80: 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43  e,.  unixDeviceC
fd90: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d  haracteristics.}
fda0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  ;../*.** This ve
fdb0: 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
fdc0: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
fdd0: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
fde0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   an sqlite3_file
fdf0: 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74  .** for unix wit
fe00: 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20  h dotlock style 
fe10: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  file locking..*/
fe20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
fe30: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
fe40: 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c   sqlite3DotlockL
fe50: 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
fe60: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
fe90: 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43  /.  dotlockUnixC
fea0: 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64  lose,.  unixRead
feb0: 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20  ,.  unixWrite,. 
fec0: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20   unixTruncate,. 
fed0: 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69   unixSync,.  uni
fee0: 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 64 6f 74  xFileSize,.  dot
fef0: 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20  lockUnixLock,.  
ff00: 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63  dotlockUnixUnloc
ff10: 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  k,.  dotlockUnix
ff20: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
ff30: 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  k,.  unixFileCon
ff40: 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74  trol,.  unixSect
ff50: 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65  orSize,.  unixDe
ff60: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ff70: 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ics.};../*.** Th
ff80: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
ff90: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
ffa0: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
ffb0: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
ffc0: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
ffd0: 78 20 77 69 74 68 20 6e 6f 6c 6f 63 6b 20 73 74  x with nolock st
ffe0: 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
fff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
10000 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
10010 68 6f 64 73 20 73 71 6c 69 74 65 33 4e 6f 6c 6f  hods sqlite3Nolo
10020 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
10030 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20  ethod = {.  1,  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
10060 6e 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69  n */.  nolockUni
10070 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65  xClose,.  unixRe
10080 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c  ad,.  unixWrite,
10090 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c  .  unixTruncate,
100a0 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75  .  unixSync,.  u
100b0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e  nixFileSize,.  n
100c0 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20  olockUnixLock,. 
100d0 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63   nolockUnixUnloc
100e0 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43  k,.  nolockUnixC
100f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10100 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  ,.  unixFileCont
10110 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f  rol,.  unixSecto
10120 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76  rSize,.  unixDev
10130 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
10140 63 73 0a 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  cs.};..#endif /*
10150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10160 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
10170 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
10180 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
10190 20 75 6e 69 78 46 69 6c 65 20 61 6e 64 20 69 6e   unixFile and in
101a0 69 74 69 61 6c 69 7a 65 20 74 68 61 74 20 75 6e  itialize that un
101b0 69 78 46 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65  ixFile..** Write
101c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
101d0 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 69  e new unixFile i
101e0 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20  nto *pId..** If 
101f0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
10200 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20  mory, close the 
10210 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  file and return 
10220 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66  an error..*/.#if
10230 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10240 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
10250 2f 2a 20 0a 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b  /* .** When lock
10260 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 73 20 61  ing extensions a
10270 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20  re enabled, the 
10280 66 69 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f 63  filepath and loc
10290 6b 69 6e 67 20 73 74 79 6c 65 20 0a 2a 2a 20 61  king style .** a
102a0 72 65 20 6e 65 65 64 65 64 20 74 6f 20 64 65 74  re needed to det
102b0 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 46  ermine the unixF
102c0 69 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f 20 75  ile pMethod to u
102d0 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f  se for locking o
102e0 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68  perations..** Th
102f0 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  e locking-style 
10300 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
10310 43 6f 6e 74 65 78 74 20 64 61 74 61 20 73 74 72  Context data str
10320 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
10330 64 20 0a 2a 2a 20 61 6e 64 20 61 73 73 69 67 6e  d .** and assign
10340 65 64 20 68 65 72 65 20 61 6c 73 6f 2e 0a 2a 2f  ed here also..*/
10350 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
10360 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e  InUnixFile(.  in
10370 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
10380 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
10390 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
103a0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
103b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  ed */.  int dirf
103c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
103d0 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
103e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
103f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10400 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
10410 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
10420 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
10430 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10440 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 20 2f  r *zFilename   /
10450 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
10460 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
10470 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c  */.){.  sqlite3L
10480 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b  ockingStyle lock
10490 69 6e 67 53 74 79 6c 65 20 3d 20 6e 6f 4c 6f 63  ingStyle = noLoc
104a0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
104b0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
104c0 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
104d0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
104e0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63   FD_CLOEXEC.  fc
104f0 6e 74 6c 28 68 2c 20 46 5f 53 45 54 46 44 2c 20  ntl(h, F_SETFD, 
10500 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 46 44  fcntl(h, F_GETFD
10510 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
10520 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  C);.#endif..  as
10530 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63  sert( pNew->pLoc
10540 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  k==NULL );.  ass
10550 65 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e  ert( pNew->pOpen
10560 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 69 66 28 20  ==NULL );.  if( 
10570 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  zFilename ){.   
10580 20 2f 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65   /* If zFilename
10590 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68   is NULL then th
105a0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
105b0 79 20 66 69 6c 65 2e 20 54 65 6d 70 6f 72 61 72  y file. Temporar
105c0 79 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 61  y files.    ** a
105d0 72 65 20 6e 65 76 65 72 20 6c 6f 63 6b 65 64 20  re never locked 
105e0 6f 72 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 20  or unlocked, so 
105f0 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 69  noLockingStyle i
10600 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 73 65  s used for these
10610 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6c 6f 63  ..    ** The loc
10620 6b 69 6e 67 20 73 74 79 6c 65 20 75 73 65 64 20  king style used 
10630 62 79 20 6f 74 68 65 72 20 66 69 6c 65 73 20 69  by other files i
10640 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
10650 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 44  .    ** sqlite3D
10660 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  etectLockingStyl
10670 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  e()..    */.    
10680 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 73  lockingStyle = s
10690 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b  qlite3DetectLock
106a0 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c 65 6e 61  ingStyle(zFilena
106b0 6d 65 2c 20 68 29 3b 0a 20 20 20 20 69 66 20 28  me, h);.    if (
106c0 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 3d 3d 70   lockingStyle==p
106d0 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  osixLockingStyle
106e0 20 29 7b 0a 20 20 20 20 20 20 65 6e 74 65 72 4d   ){.      enterM
106f0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
10700 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
10710 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c  h, &pNew->pLock,
10720 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a   &pNew->pOpen);.
10730 20 20 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78        leaveMutex
10740 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ();.      if( rc
10750 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10760 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
10770 28 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 20  (dirfd);.       
10780 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20   close(h);.     
10790 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
107a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
107b0 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45  .  OSTRACE3("OPE
107c0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
107d0 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20   h, zFilename); 
107e0 20 20 20 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20     .  pNew->h = 
107f0 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
10800 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f   = dirfd;.  SET_
10810 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a  THREADID(pNew);.
10820 20 20 20 20 0a 20 20 73 77 69 74 63 68 28 6c 6f      .  switch(lo
10830 63 6b 69 6e 67 53 74 79 6c 65 29 20 7b 0a 20 20  ckingStyle) {.  
10840 20 20 63 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e    case afpLockin
10850 67 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20  gStyle: {.      
10860 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75  /* afp locking u
10870 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
10880 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
10890 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
108a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70        ** the afp
108b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
108c0 2f 0a 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69  /.      afpLocki
108d0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
108e0 78 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  xt;.      pNew->
108f0 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
10900 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78  e3AFPLockingUnix
10910 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20  IoMethod;.      
10920 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
10930 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 20 3d  text = context =
10940 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
10950 20 73 69 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74   sizeof(*context
10960 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ) );.      if( c
10970 6f 6e 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20  ontext==0 ){.   
10980 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
10990 20 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64         if( dirfd
109a0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
109b0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
109c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
109d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
109e0 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
109f0 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
10a00 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
10a10 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
10a20 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
10a30 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
10a40 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
10a50 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
10a60 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
10a70 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
10a80 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
10a90 20 20 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50    context->fileP
10aa0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
10ab0 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
10ac0 76 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v();.      break
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10ae0 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79   flockLockingSty
10af0 6c 65 3a 0a 20 20 20 20 20 20 2f 2a 20 66 6c 6f  le:.      /* flo
10b00 63 6b 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e  ck locking doesn
10b10 27 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e  't need addition
10b20 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  al lockingContex
10b30 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
10b40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  .      pNew->pMe
10b50 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46  thod = &sqlite3F
10b60 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
10b70 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 62  oMethod;.      b
10b80 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 64  reak;.    case d
10b90 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
10ba0 6c 65 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 64  le: {.      /* d
10bb0 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
10bc0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
10bd0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
10be0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
10bf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74        ** the dot
10c00 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10c10 78 74 20 2a 2f 0a 20 20 20 20 20 20 64 6f 74 6c  xt */.      dotl
10c20 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10c30 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 20 20  t *context;.    
10c40 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
10c50 0a 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  .      nFilename
10c60 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e   = strlen(zFilen
10c70 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ame);.      pNew
10c80 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
10c90 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ite3DotlockLocki
10ca0 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  ngUnixIoMethod;.
10cb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
10cc0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 63 6f 6e  ingContext = con
10cd0 74 65 78 74 20 3d 20 0a 20 20 20 20 20 20 20 20  text = .        
10ce0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
10cf0 20 73 69 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74   sizeof(*context
10d00 29 20 2b 20 6e 46 69 6c 65 6e 61 6d 65 20 2b 20  ) + nFilename + 
10d10 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  6 );.      if( c
10d20 6f 6e 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20  ontext==0 ){.   
10d30 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
10d40 20 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64         if( dirfd
10d50 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
10d60 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
10d70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
10d90 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
10da0 20 3d 20 28 63 68 61 72 2a 29 26 63 6f 6e 74 65   = (char*)&conte
10db0 78 74 5b 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c  xt[1];.      sql
10dc0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
10dd0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 74 65 78 74  ilename, context
10de0 2d 3e 6c 6f 63 6b 50 61 74 68 2c 0a 20 20 20 20  ->lockPath,.    
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46     "%s.lock", zF
10e10 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
10e20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10e30 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63 6b 69   case posixLocki
10e40 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 2f  ngStyle:.      /
10e50 2a 20 70 6f 73 69 78 20 6c 6f 63 6b 69 6e 67 20  * posix locking 
10e60 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 61 64 64  doesn't need add
10e70 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43  itional lockingC
10e80 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69  ontext informati
10e90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  on */.      pNew
10ea0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
10eb0 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
10ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10ed0 20 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e     case noLockin
10ee0 67 53 74 79 6c 65 3a 0a 20 20 20 20 63 61 73 65  gStyle:.    case
10ef0 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b   unsupportedLock
10f00 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 64 65  ingStyle:.    de
10f10 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 70 4e  fault: .      pN
10f20 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
10f30 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b  qlite3NolockLock
10f40 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
10f50 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  .  }.  OpenCount
10f60 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
10f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
10f80 6c 73 65 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  lse /* SQLITE_EN
10f90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10fa0 4c 45 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  LE */.static int
10fb0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
10fc0 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
10fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
10fe0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10ff0 72 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20  r on file being 
11000 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
11010 64 69 72 66 64 2c 0a 20 20 73 71 6c 69 74 65 33  dirfd,.  sqlite3
11020 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
11030 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
11040 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
11050 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
11060 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
11070 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me  /* Name of t
11080 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
11090 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  ened */.){.  uni
110a0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
110b0 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
110c0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
110d0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63   FD_CLOEXEC.  fc
110e0 6e 74 6c 28 68 2c 20 46 5f 53 45 54 46 44 2c 20  ntl(h, F_SETFD, 
110f0 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 46 44  fcntl(h, F_GETFD
11100 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
11110 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6e  C);.#endif..  en
11120 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
11130 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
11140 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c  h, &pNew->pLock,
11150 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a   &pNew->pOpen);.
11160 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
11170 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11180 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63  if( dirfd>=0 ) c
11190 6c 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20  lose(dirfd);.   
111a0 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 72   close(h);.    r
111b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
111c0 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20   OSTRACE3("OPEN 
111d0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
111e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
111f0 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31  pNew->dirfd = -1
11200 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
11210 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
11220 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48   dirfd;.  SET_TH
11230 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20  READID(pNew);.. 
11240 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
11250 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d   &sqlite3UnixIoM
11260 65 74 68 6f 64 3b 0a 20 20 4f 70 65 6e 43 6f 75  ethod;.  OpenCou
11270 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
11280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11290 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
112a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
112b0 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
112c0 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
112d0 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
112e0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
112f0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
11300 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
11310 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
11320 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
11330 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
11340 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
11350 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11360 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11370 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
11380 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
11390 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
113a0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
113b0 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
113c0 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
113d0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
113e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
113f0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
11400 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
11410 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
11420 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
11430 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
11440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11450 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
11460 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11470 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
11480 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
11490 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
114a0 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
114b0 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
114c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
114d0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
114e0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
114f0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
11500 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  =strlen(zDirname
11510 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72  ); ii>=0 && zDir
11520 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
11530 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
11540 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
11550 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
11560 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
11570 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
11580 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
11590 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66  if( fd>=0 ){.#if
115a0 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
115b0 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46       fcntl(fd, F
115c0 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
115d0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
115e0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
115f0 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
11600 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
11610 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
11620 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  name);.    }.  }
11630 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
11640 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
11650 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
11660 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ANTOPEN);.}../*.
11670 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
11680 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
11690 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
116a0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
116b0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
116c0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
116d0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
116e0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
116f0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
11700 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
11710 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
11720 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
11730 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
11740 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
11750 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
11760 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
11770 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
11780 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
11790 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
117a0 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
117b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
117c0 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
117d0 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
117e0 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
117f0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
11800 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
11810 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
11820 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
11830 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
11840 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11850 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
11860 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
11870 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
11880 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
11890 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
118a0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
118b0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
118c0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
118d0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
118e0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
118f0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
11900 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
11910 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
11920 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
11930 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
11940 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
11950 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30  ctory;.  for(i=0
11960 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
11970 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
11980 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
11990 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30  if( azDirs[i]==0
119a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
119b0 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73   if( stat(azDirs
119c0 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  [i], &buf) ) con
119d0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
119e0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
119f0 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
11a00 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
11a10 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29  azDirs[i], 07) )
11a20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
11a30 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
11a40 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11a50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
11a60 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
11a70 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
11a80 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
11a90 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
11aa0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
11ab0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
11ac0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
11ad0 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
11ae0 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
11af0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
11b00 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e 42 75  IX) + 17) >= nBu
11b10 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
11b20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11b30 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
11b40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
11b50 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73  uf-17, zBuf, "%s
11b60 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
11b70 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
11b80 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
11b90 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
11ba0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
11bb0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
11bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
11bd0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
11be0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
11bf0 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
11c00 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
11c10 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
11c20 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
11c30 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
11c40 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
11c50 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
11c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c70 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  K;.}.../*.** Ope
11c80 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
11c90 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
11ca0 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
11cb0 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
11cc0 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
11cd0 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
11ce0 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
11cf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
11d00 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
11d10 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
11d20 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
11d30 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
11d40 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
11d50 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
11d60 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
11d70 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
11d80 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
11d90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
11da0 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
11db0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
11dc0 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
11dd0 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
11de0 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
11df0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
11e00 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
11e10 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
11e20 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
11e30 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
11e40 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
11e50 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
11e60 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
11e70 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
11e80 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
11e90 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
11ea0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
11eb0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
11ec0 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
11ed0 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
11ee0 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
11ef0 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
11f00 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
11f10 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
11f20 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
11f30 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
11f40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
11f50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11f60 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
11f70 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
11f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
11f90 74 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  th, .  sqlite3_f
11fa0 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
11fb0 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a  t flags,.  int *
11fc0 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69  pOutFlags.){.  i
11fd0 6e 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20  nt fd = 0;      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ff0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
12000 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
12010 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  n() */.  int dir
12020 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
12030 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
12040 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
12050 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  ptor */.  int of
12060 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
12070 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
12080 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
12090 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
120a0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
120b0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
120c0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
120d0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
120e0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
120f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
12100 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
12110 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
12120 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
12130 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
12140 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
12150 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
12160 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
12170 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
12180 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
12190 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
121a0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
121b0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
121c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
121d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
121e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  ;..  /* If creat
121f0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
12200 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
12210 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
12220 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
12230 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
12240 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
12250 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
12260 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
12270 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
12280 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
12290 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
122a0 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
122b0 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
122c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e   */.  int isOpen
122d0 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43  Directory = (isC
122e0 72 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20  reate && .      
122f0 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f  (eType==SQLITE_O
12300 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
12310 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
12320 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
12330 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f  URNAL).  );..  /
12340 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
12350 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
12360 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
12370 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
12380 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
12390 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
123a0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
123b0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
123c0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
123d0 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
123e0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
123f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12400 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
12410 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
12420 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
12430 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
12440 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
12450 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
12460 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
12470 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
12480 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
12490 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
124a0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
124b0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
124c0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
124d0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
124e0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
124f0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
12500 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
12510 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
12520 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
12530 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
12540 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
12550 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12560 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
12570 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
12580 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
12590 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
125a0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
125b0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
125c0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
125d0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
125e0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
125f0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
12600 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
12610 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  ;...  /* The mai
12620 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
12630 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  al, and master j
12640 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
12650 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
12660 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f   ** deleted.  */
12670 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
12680 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
12690 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65  IN_DB || !isDele
126a0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
126b0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
126c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
126d0 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
126e0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
126f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
12700 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21  TER_JOURNAL || !
12710 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  isDelete );..  /
12720 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
12730 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
12740 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
12750 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
12760 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
12770 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
12780 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
12790 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
127a0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
127b0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
127c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
127d0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
127e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
127f0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
12800 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
12810 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
12820 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
12830 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
12840 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
12850 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
12860 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
12870 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
12880 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
12890 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
128a0 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
128b0 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72   !isOpenDirector
128c0 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  y);.    rc = get
128d0 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
128e0 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
128f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
12900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12920 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
12930 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
12940 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
12950 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52  )  oflags |= O_R
12960 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
12970 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61 67  eadWrite ) oflag
12980 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
12990 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
129a0 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45   oflags |= O_CRE
129b0 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
129c0 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20 7c  usive ) oflags |
129d0 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
129e0 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73 20  LLOW);.  oflags 
129f0 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
12a00 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 6d 65  O_BINARY);..  me
12a10 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
12a20 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
12a30 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e  ;.  fd = open(zN
12a40 61 6d 65 2c 20 6f 66 6c 61 67 73 2c 20 69 73 44  ame, oflags, isD
12a50 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49 54  elete?0600:SQLIT
12a60 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
12a70 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
12a80 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
12a90 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
12aa0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
12ab0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
12ac0 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
12ad0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
12ae0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
12af0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
12b00 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  */.    flags &= 
12b10 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
12b20 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
12b30 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
12b40 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
12b50 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
12b60 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f      return unixO
12b70 70 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c  pen(pVfs, zPath,
12b80 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70   pFile, flags, p
12b90 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
12ba0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
12bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12bc0 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69  ANTOPEN;.  }.  i
12bd0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 20  f( isDelete ){. 
12be0 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29     unlink(zName)
12bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74  ;.  }.  if( pOut
12c00 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
12c10 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
12c20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 66  .  }..  assert(f
12c30 64 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73 4f  d!=0);.  if( isO
12c40 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a  penDirectory ){.
12c50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 70 65      int rc = ope
12c60 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
12c70 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
12c80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c90 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
12ca0 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fd);.      retur
12cb0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
12cc0 20 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55    return fillInU
12cd0 6e 69 78 46 69 6c 65 28 66 64 2c 20 64 69 72 66  nixFile(fd, dirf
12ce0 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 29  d, pFile, zPath)
12cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
12d00 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
12d10 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
12d20 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
12d30 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
12d40 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
12d50 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
12d60 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
12d70 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
12d80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
12d90 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
12da0 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
12db0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
12dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d  SQLITE_OK;.  Sim
12dd0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
12de0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12df0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69  _DELETE);.  unli
12e00 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20 69 66 28  nk(zPath);.  if(
12e10 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20   dirSync ){.    
12e20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
12e30 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
12e40 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
12e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12e60 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  K ){.      if( f
12e70 73 79 6e 63 28 66 64 29 20 29 7b 0a 20 20 20 20  sync(fd) ){.    
12e80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12e90 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b  IOERR_DIR_FSYNC;
12ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
12eb0 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
12ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
12ee0 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
12ef0 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
12f00 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
12f10 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
12f20 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
12f30 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
12f40 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
12f50 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
12f60 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
12f70 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
12f80 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
12f90 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
12fa0 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
12fb0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
12fc0 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
12fd0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
12fe0 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
12ff0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
13000 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
13010 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
13020 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
13030 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
13040 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
13050 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
13060 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
13070 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a   .  int flags, .
13080 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29    int *pResOut.)
13090 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
130a0 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  0;.  SimulateIOE
130b0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
130c0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
130d0 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
130e0 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
130f0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
13100 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
13110 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
13120 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13130 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
13140 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
13150 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
13160 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
13170 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13180 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
13190 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
131a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
131b0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
131c0 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
131d0 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
131e0 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
131f0 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50  Out = (access(zP
13200 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
13210 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13220 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
13230 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
13240 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
13250 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68  ull pathname. Th
13260 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a  e relative path.
13270 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ** is stored as 
13280 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
13290 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62   string in the b
132a0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
132b0 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a   by.** zPath. .*
132c0 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73  *.** zOut points
132d0 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
132e0 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33  at least sqlite3
132f0 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  _vfs.mxPathname 
13300 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68  bytes .** (in th
13310 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54  is case, MAX_PAT
13320 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68  HNAME bytes). Th
13330 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77  e full-path is w
13340 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69  ritten to.** thi
13350 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  s buffer before 
13360 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
13370 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c  atic int unixFul
13380 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
13390 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
133a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
133b0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
133c0 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
133d0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
133e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
133f0 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
13400 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
13410 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nOut,           
13420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
13430 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
13440 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
13450 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20   char *zOut     
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13470 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
13480 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73  */.){..  /* It's
13490 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
134a0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
134b0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
134c0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
134d0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
134e0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
134f0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
13500 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
13510 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
13520 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
13530 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
13540 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
13550 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
13560 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
13570 65 63 74 6c 79 20 68 61 73 20 62 65 65 6e 20 75  ectly has been u
13580 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
13590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
135a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
135b0 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
135c0 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
135d0 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
135e0 45 20 29 3b 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  E );.  zOut[nOut
135f0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
13600 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
13610 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
13620 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
13630 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
13640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13650 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
13660 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
13670 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
13680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13690 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
136a0 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65      nCwd = strle
136b0 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
136c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
136d0 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
136e0 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
136f0 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
13700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  n SQLITE_OK;..#i
13710 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  f 0.  /*.  ** Re
13720 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74 68 20  move "/./" path 
13730 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e  elements and con
13740 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74  vert "/A/./" pat
13750 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  h elements.  ** 
13760 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a  to just "/"..  *
13770 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b  /.  if( zFull ){
13780 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
13790 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46     for(i=j=0; zF
137a0 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ull[i]; i++){.  
137b0 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d      if( zFull[i]
137c0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
137d0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
137e0 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
137f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75  .        if( zFu
13800 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20  ll[i+1]=='.' && 
13810 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20  zFull[i+2]=='/' 
13820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  ){.          i +
13830 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 1;.          c
13840 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13850 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
13860 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  Full[i+1]=='.' &
13870 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e  & zFull[i+2]=='.
13880 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d  ' && zFull[i+3]=
13890 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
138a0 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
138b0 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20  zFull[j-1]!='/' 
138c0 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
138d0 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20      i += 3;.    
138e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
138f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13900 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b  }.      zFull[j+
13910 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20  +] = zFull[i];. 
13920 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a     }.    zFull[j
13930 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  ] = 0;.  }.#endi
13940 66 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  f.}...#ifndef SQ
13950 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
13960 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
13970 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
13980 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
13990 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
139a0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
139b0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
139c0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
139d0 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
139e0 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
139f0 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
13a00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
13a10 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
13a20 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
13a30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13a40 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  e){.  return dlo
13a50 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
13a60 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
13a70 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
13a80 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
13a90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
13aa0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
13ab0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
13ac0 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
13ad0 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
13ae0 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
13af0 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
13b00 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
13b10 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
13b20 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
13b30 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
13b40 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
13b50 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
13b60 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
13b70 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
13b80 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
13b90 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
13ba0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
13bb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
13bc0 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
13bd0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
13be0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
13bf0 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  fOut){.  char *z
13c00 45 72 72 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65  Err;.  enterMute
13c10 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
13c20 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
13c30 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
13c40 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
13c50 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
13c60 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65   zErr);.  }.  le
13c70 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
13c80 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
13c90 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
13ca0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
13cb0 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
13cc0 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72  r *zSymbol){.  r
13cd0 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e  eturn dlsym(pHan
13ce0 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d  dle, zSymbol);.}
13cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
13d00 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
13d10 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
13d20 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c   *pHandle){.  dl
13d30 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
13d40 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
13d50 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
13d60 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
13d70 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
13d80 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
13d90 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
13da0 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
13db0 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
13dc0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
13dd0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
13de0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
13df0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
13e00 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
13e10 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
13e20 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
13e30 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
13e40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13e50 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
13e60 72 20 2a 7a 42 75 66 29 7b 0a 0a 20 20 61 73 73  r *zBuf){..  ass
13e70 65 72 74 28 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  ert(nBuf>=(sizeo
13e80 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
13e90 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
13ea0 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
13eb0 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
13ec0 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
13ed0 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
13ee0 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
13ef0 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
13f00 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
13f10 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
13f20 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
13f30 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
13f40 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
13f50 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
13f60 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
13f70 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
13f80 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
13f90 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
13fa0 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
13fb0 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
13fc0 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
13fd0 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
13fe0 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
13ff0 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
14000 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
14010 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
14020 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
14030 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
14040 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
14050 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
14060 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
14070 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
14080 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
14090 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
140a0 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
140b0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
140c0 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
140d0 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
140e0 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
140f0 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
14100 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
14110 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
14120 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  uf);.#if !define
14130 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
14140 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20   {.    int pid, 
14150 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  fd;.    fd = ope
14160 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
14170 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20  , O_RDONLY);.   
14180 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
14190 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
141a0 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
141b0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
141c0 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
141d0 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
141e0 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
141f0 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
14200 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
14210 66 28 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c  f(pid));.    }el
14220 73 65 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66  se{.      read(f
14230 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, zBuf, nBuf);.
14240 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
14250 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14260 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
14270 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14280 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
14290 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
142a0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
142b0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
142c0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
142d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
142e0 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
142f0 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
14300 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
14310 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14320 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
14330 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
14340 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
14350 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
14360 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
14370 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
14380 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
14390 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
143a0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
143b0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
143c0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
143d0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
143e0 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
143f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14400 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  s, int microseco
14410 6e 64 73 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  nds){.#if define
14420 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
14430 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
14440 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
14450 6e 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  nds);.  return m
14460 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
14470 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
14480 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
14490 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
144a0 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
144b0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  s);.  return sec
144c0 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
144d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
144e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
144f0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
14500 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14510 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  , becomes the re
14520 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64  sult.** returned
14530 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43   from sqlite3OsC
14540 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54  urrentTime().  T
14550 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
14560 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
14570 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
14580 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
14590 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e  nt_time = 0;.#en
145a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
145b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
145c0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
145d0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
145e0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
145f0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
14600 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
14610 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
14620 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
14630 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
14640 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
14650 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
14660 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
14670 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
14680 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
14690 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
146a0 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65  e *prNow){.#ifde
146b0 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69  f NO_GETTOD.  ti
146c0 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
146d0 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
146e0 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
146f0 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74  87.5;.#else.  st
14700 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
14710 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  w;.  gettimeofda
14720 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a  y(&sNow, 0);.  *
14730 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e  prNow = 2440587.
14740 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f  5 + sNow.tv_sec/
14750 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74  86400.0 + sNow.t
14760 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30  v_usec/864000000
14770 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66  00.0;.#endif.#if
14780 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14790 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
147a0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
147b0 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74    *prNow = sqlit
147c0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f  e3_current_time/
147d0 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
147e0 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  7.5;.  }.#endif.
147f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
14800 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
14810 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
14820 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
14830 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
14840 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  uf){.  return 0;
14850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
14860 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
14870 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
14880 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
14890 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
148a0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
148b0 64 29 7b 20 0a 20 20 73 74 61 74 69 63 20 73 71  d){ .  static sq
148c0 6c 69 74 65 33 5f 76 66 73 20 75 6e 69 78 56 66  lite3_vfs unixVf
148d0 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20  s = {.    1,    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
148f0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
14900 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
14910 29 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65  ),   /* szOsFile
14920 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48   */.    MAX_PATH
14930 4e 41 4d 45 2c 20 20 20 20 20 20 20 2f 2a 20 6d  NAME,       /* m
14940 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
14950 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14960 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
14970 0a 20 20 20 20 22 75 6e 69 78 22 2c 20 20 20 20  .    "unix",    
14980 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
14990 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149b0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20  pAppData */.  . 
149c0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
149d0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
149e0 2a 2f 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74  */.    unixDelet
149f0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  e,         /* xD
14a00 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 75 6e 69  elete */.    uni
14a10 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  xAccess,        
14a20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
14a30 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e     unixFullPathn
14a40 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75 6c 6c 50  ame,   /* xFullP
14a50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 75  athname */.    u
14a60 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  nixDlOpen,      
14a70 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
14a80 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72  .    unixDlError
14a90 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45  ,        /* xDlE
14aa0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 75 6e 69 78  rror */.    unix
14ab0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
14ac0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
14ad0 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20   unixDlClose,   
14ae0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
14af0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 52 61 6e 64   */.    unixRand
14b00 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78  omness,     /* x
14b10 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
14b20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20    unixSleep,    
14b30 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
14b40 2a 2f 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65  */.    unixCurre
14b50 6e 74 54 69 6d 65 2c 20 20 20 20 2f 2a 20 78 43  ntTime,    /* xC
14b60 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
14b70 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72    unixGetLastErr
14b80 6f 72 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  or    /* xGetLas
14b90 74 45 72 72 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  tError */.  };. 
14ba0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
14bb0 69 73 74 65 72 28 26 75 6e 69 78 56 66 73 2c 20  ister(&unixVfs, 
14bc0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
14bd0 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73  ITE_OK; .}.int s
14be0 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
14bf0 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
14c00 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23  QLITE_OK; .}. .#
14c10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14c20 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.