1.1 --- a/extensions/sqlite/sqlite-source/os_unix.c Fri Aug 03 07:56:31 2012 -0400
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,2749 +0,0 @@
1.4 -/*
1.5 -** 2004 May 22
1.6 -**
1.7 -** The author disclaims copyright to this source code. In place of
1.8 -** a legal notice, here is a blessing:
1.9 -**
1.10 -** May you do good and not evil.
1.11 -** May you find forgiveness for yourself and forgive others.
1.12 -** May you share freely, never taking more than you give.
1.13 -**
1.14 -******************************************************************************
1.15 -**
1.16 -** This file contains code that is specific to Unix systems.
1.17 -*/
1.18 -#include "sqliteInt.h"
1.19 -#if OS_UNIX /* This file is used on unix only */
1.20 -
1.21 -/* #define SQLITE_ENABLE_LOCKING_STYLE 0 */
1.22 -
1.23 -/*
1.24 -** These #defines should enable >2GB file support on Posix if the
1.25 -** underlying operating system supports it. If the OS lacks
1.26 -** large file support, these should be no-ops.
1.27 -**
1.28 -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
1.29 -** on the compiler command line. This is necessary if you are compiling
1.30 -** on a recent machine (ex: RedHat 7.2) but you want your code to work
1.31 -** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2
1.32 -** without this option, LFS is enable. But LFS does not exist in the kernel
1.33 -** in RedHat 6.0, so the code won't work. Hence, for maximum binary
1.34 -** portability you should omit LFS.
1.35 -*/
1.36 -#ifndef SQLITE_DISABLE_LFS
1.37 -# define _LARGE_FILE 1
1.38 -# ifndef _FILE_OFFSET_BITS
1.39 -# define _FILE_OFFSET_BITS 64
1.40 -# endif
1.41 -# define _LARGEFILE_SOURCE 1
1.42 -#endif
1.43 -
1.44 -/*
1.45 -** standard include files.
1.46 -*/
1.47 -#include <sys/types.h>
1.48 -#include <sys/stat.h>
1.49 -#include <fcntl.h>
1.50 -#include <unistd.h>
1.51 -#include <time.h>
1.52 -#include <sys/time.h>
1.53 -#include <errno.h>
1.54 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.55 -#include <sys/ioctl.h>
1.56 -#include <sys/param.h>
1.57 -#include <sys/mount.h>
1.58 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.59 -
1.60 -/*
1.61 -** If we are to be thread-safe, include the pthreads header and define
1.62 -** the SQLITE_UNIX_THREADS macro.
1.63 -*/
1.64 -#if SQLITE_THREADSAFE
1.65 -# include <pthread.h>
1.66 -# define SQLITE_UNIX_THREADS 1
1.67 -#endif
1.68 -
1.69 -/*
1.70 -** Default permissions when creating a new file
1.71 -*/
1.72 -#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS
1.73 -# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644
1.74 -#endif
1.75 -
1.76 -/*
1.77 -** Maximum supported path-length.
1.78 -*/
1.79 -#define MAX_PATHNAME 512
1.80 -
1.81 -
1.82 -/*
1.83 -** The unixFile structure is subclass of sqlite3_file specific for the unix
1.84 -** protability layer.
1.85 -*/
1.86 -typedef struct unixFile unixFile;
1.87 -struct unixFile {
1.88 - sqlite3_io_methods const *pMethod; /* Always the first entry */
1.89 -#ifdef SQLITE_TEST
1.90 - /* In test mode, increase the size of this structure a bit so that
1.91 - ** it is larger than the struct CrashFile defined in test6.c.
1.92 - */
1.93 - char aPadding[32];
1.94 -#endif
1.95 - struct openCnt *pOpen; /* Info about all open fd's on this inode */
1.96 - struct lockInfo *pLock; /* Info about locks on this inode */
1.97 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.98 - void *lockingContext; /* Locking style specific state */
1.99 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.100 - int h; /* The file descriptor */
1.101 - unsigned char locktype; /* The type of lock held on this fd */
1.102 - int dirfd; /* File descriptor for the directory */
1.103 -#if SQLITE_THREADSAFE
1.104 - pthread_t tid; /* The thread that "owns" this unixFile */
1.105 -#endif
1.106 -};
1.107 -
1.108 -/*
1.109 -** Include code that is common to all os_*.c files
1.110 -*/
1.111 -#include "os_common.h"
1.112 -
1.113 -/*
1.114 -** Define various macros that are missing from some systems.
1.115 -*/
1.116 -#ifndef O_LARGEFILE
1.117 -# define O_LARGEFILE 0
1.118 -#endif
1.119 -#ifdef SQLITE_DISABLE_LFS
1.120 -# undef O_LARGEFILE
1.121 -# define O_LARGEFILE 0
1.122 -#endif
1.123 -#ifndef O_NOFOLLOW
1.124 -# define O_NOFOLLOW 0
1.125 -#endif
1.126 -#ifndef O_BINARY
1.127 -# define O_BINARY 0
1.128 -#endif
1.129 -
1.130 -/*
1.131 -** The DJGPP compiler environment looks mostly like Unix, but it
1.132 -** lacks the fcntl() system call. So redefine fcntl() to be something
1.133 -** that always succeeds. This means that locking does not occur under
1.134 -** DJGPP. But it's DOS - what did you expect?
1.135 -*/
1.136 -#ifdef __DJGPP__
1.137 -# define fcntl(A,B,C) 0
1.138 -#endif
1.139 -
1.140 -/*
1.141 -** The threadid macro resolves to the thread-id or to 0. Used for
1.142 -** testing and debugging only.
1.143 -*/
1.144 -#if SQLITE_THREADSAFE
1.145 -#define threadid pthread_self()
1.146 -#else
1.147 -#define threadid 0
1.148 -#endif
1.149 -
1.150 -/*
1.151 -** Set or check the unixFile.tid field. This field is set when an unixFile
1.152 -** is first opened. All subsequent uses of the unixFile verify that the
1.153 -** same thread is operating on the unixFile. Some operating systems do
1.154 -** not allow locks to be overridden by other threads and that restriction
1.155 -** means that sqlite3* database handles cannot be moved from one thread
1.156 -** to another. This logic makes sure a user does not try to do that
1.157 -** by mistake.
1.158 -**
1.159 -** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to
1.160 -** another as long as we are running on a system that supports threads
1.161 -** overriding each others locks (which now the most common behavior)
1.162 -** or if no locks are held. But the unixFile.pLock field needs to be
1.163 -** recomputed because its key includes the thread-id. See the
1.164 -** transferOwnership() function below for additional information
1.165 -*/
1.166 -#if SQLITE_THREADSAFE
1.167 -# define SET_THREADID(X) (X)->tid = pthread_self()
1.168 -# define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \
1.169 - !pthread_equal((X)->tid, pthread_self()))
1.170 -#else
1.171 -# define SET_THREADID(X)
1.172 -# define CHECK_THREADID(X) 0
1.173 -#endif
1.174 -
1.175 -/*
1.176 -** Here is the dirt on POSIX advisory locks: ANSI STD 1003.1 (1996)
1.177 -** section 6.5.2.2 lines 483 through 490 specify that when a process
1.178 -** sets or clears a lock, that operation overrides any prior locks set
1.179 -** by the same process. It does not explicitly say so, but this implies
1.180 -** that it overrides locks set by the same process using a different
1.181 -** file descriptor. Consider this test case:
1.182 -**
1.183 -** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644);
1.184 -** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644);
1.185 -**
1.186 -** Suppose ./file1 and ./file2 are really the same file (because
1.187 -** one is a hard or symbolic link to the other) then if you set
1.188 -** an exclusive lock on fd1, then try to get an exclusive lock
1.189 -** on fd2, it works. I would have expected the second lock to
1.190 -** fail since there was already a lock on the file due to fd1.
1.191 -** But not so. Since both locks came from the same process, the
1.192 -** second overrides the first, even though they were on different
1.193 -** file descriptors opened on different file names.
1.194 -**
1.195 -** Bummer. If you ask me, this is broken. Badly broken. It means
1.196 -** that we cannot use POSIX locks to synchronize file access among
1.197 -** competing threads of the same process. POSIX locks will work fine
1.198 -** to synchronize access for threads in separate processes, but not
1.199 -** threads within the same process.
1.200 -**
1.201 -** To work around the problem, SQLite has to manage file locks internally
1.202 -** on its own. Whenever a new database is opened, we have to find the
1.203 -** specific inode of the database file (the inode is determined by the
1.204 -** st_dev and st_ino fields of the stat structure that fstat() fills in)
1.205 -** and check for locks already existing on that inode. When locks are
1.206 -** created or removed, we have to look at our own internal record of the
1.207 -** locks to see if another thread has previously set a lock on that same
1.208 -** inode.
1.209 -**
1.210 -** The sqlite3_file structure for POSIX is no longer just an integer file
1.211 -** descriptor. It is now a structure that holds the integer file
1.212 -** descriptor and a pointer to a structure that describes the internal
1.213 -** locks on the corresponding inode. There is one locking structure
1.214 -** per inode, so if the same inode is opened twice, both unixFile structures
1.215 -** point to the same locking structure. The locking structure keeps
1.216 -** a reference count (so we will know when to delete it) and a "cnt"
1.217 -** field that tells us its internal lock status. cnt==0 means the
1.218 -** file is unlocked. cnt==-1 means the file has an exclusive lock.
1.219 -** cnt>0 means there are cnt shared locks on the file.
1.220 -**
1.221 -** Any attempt to lock or unlock a file first checks the locking
1.222 -** structure. The fcntl() system call is only invoked to set a
1.223 -** POSIX lock if the internal lock structure transitions between
1.224 -** a locked and an unlocked state.
1.225 -**
1.226 -** 2004-Jan-11:
1.227 -** More recent discoveries about POSIX advisory locks. (The more
1.228 -** I discover, the more I realize the a POSIX advisory locks are
1.229 -** an abomination.)
1.230 -**
1.231 -** If you close a file descriptor that points to a file that has locks,
1.232 -** all locks on that file that are owned by the current process are
1.233 -** released. To work around this problem, each unixFile structure contains
1.234 -** a pointer to an openCnt structure. There is one openCnt structure
1.235 -** per open inode, which means that multiple unixFile can point to a single
1.236 -** openCnt. When an attempt is made to close an unixFile, if there are
1.237 -** other unixFile open on the same inode that are holding locks, the call
1.238 -** to close() the file descriptor is deferred until all of the locks clear.
1.239 -** The openCnt structure keeps a list of file descriptors that need to
1.240 -** be closed and that list is walked (and cleared) when the last lock
1.241 -** clears.
1.242 -**
1.243 -** First, under Linux threads, because each thread has a separate
1.244 -** process ID, lock operations in one thread do not override locks
1.245 -** to the same file in other threads. Linux threads behave like
1.246 -** separate processes in this respect. But, if you close a file
1.247 -** descriptor in linux threads, all locks are cleared, even locks
1.248 -** on other threads and even though the other threads have different
1.249 -** process IDs. Linux threads is inconsistent in this respect.
1.250 -** (I'm beginning to think that linux threads is an abomination too.)
1.251 -** The consequence of this all is that the hash table for the lockInfo
1.252 -** structure has to include the process id as part of its key because
1.253 -** locks in different threads are treated as distinct. But the
1.254 -** openCnt structure should not include the process id in its
1.255 -** key because close() clears lock on all threads, not just the current
1.256 -** thread. Were it not for this goofiness in linux threads, we could
1.257 -** combine the lockInfo and openCnt structures into a single structure.
1.258 -**
1.259 -** 2004-Jun-28:
1.260 -** On some versions of linux, threads can override each others locks.
1.261 -** On others not. Sometimes you can change the behavior on the same
1.262 -** system by setting the LD_ASSUME_KERNEL environment variable. The
1.263 -** POSIX standard is silent as to which behavior is correct, as far
1.264 -** as I can tell, so other versions of unix might show the same
1.265 -** inconsistency. There is no little doubt in my mind that posix
1.266 -** advisory locks and linux threads are profoundly broken.
1.267 -**
1.268 -** To work around the inconsistencies, we have to test at runtime
1.269 -** whether or not threads can override each others locks. This test
1.270 -** is run once, the first time any lock is attempted. A static
1.271 -** variable is set to record the results of this test for future
1.272 -** use.
1.273 -*/
1.274 -
1.275 -/*
1.276 -** An instance of the following structure serves as the key used
1.277 -** to locate a particular lockInfo structure given its inode.
1.278 -**
1.279 -** If threads cannot override each others locks, then we set the
1.280 -** lockKey.tid field to the thread ID. If threads can override
1.281 -** each others locks then tid is always set to zero. tid is omitted
1.282 -** if we compile without threading support.
1.283 -*/
1.284 -struct lockKey {
1.285 - dev_t dev; /* Device number */
1.286 - ino_t ino; /* Inode number */
1.287 -#if SQLITE_THREADSAFE
1.288 - pthread_t tid; /* Thread ID or zero if threads can override each other */
1.289 -#endif
1.290 -};
1.291 -
1.292 -/*
1.293 -** An instance of the following structure is allocated for each open
1.294 -** inode on each thread with a different process ID. (Threads have
1.295 -** different process IDs on linux, but not on most other unixes.)
1.296 -**
1.297 -** A single inode can have multiple file descriptors, so each unixFile
1.298 -** structure contains a pointer to an instance of this object and this
1.299 -** object keeps a count of the number of unixFile pointing to it.
1.300 -*/
1.301 -struct lockInfo {
1.302 - struct lockKey key; /* The lookup key */
1.303 - int cnt; /* Number of SHARED locks held */
1.304 - int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
1.305 - int nRef; /* Number of pointers to this structure */
1.306 -};
1.307 -
1.308 -/*
1.309 -** An instance of the following structure serves as the key used
1.310 -** to locate a particular openCnt structure given its inode. This
1.311 -** is the same as the lockKey except that the thread ID is omitted.
1.312 -*/
1.313 -struct openKey {
1.314 - dev_t dev; /* Device number */
1.315 - ino_t ino; /* Inode number */
1.316 -};
1.317 -
1.318 -/*
1.319 -** An instance of the following structure is allocated for each open
1.320 -** inode. This structure keeps track of the number of locks on that
1.321 -** inode. If a close is attempted against an inode that is holding
1.322 -** locks, the close is deferred until all locks clear by adding the
1.323 -** file descriptor to be closed to the pending list.
1.324 -*/
1.325 -struct openCnt {
1.326 - struct openKey key; /* The lookup key */
1.327 - int nRef; /* Number of pointers to this structure */
1.328 - int nLock; /* Number of outstanding locks */
1.329 - int nPending; /* Number of pending close() operations */
1.330 - int *aPending; /* Malloced space holding fd's awaiting a close() */
1.331 -};
1.332 -
1.333 -/*
1.334 -** These hash tables map inodes and file descriptors (really, lockKey and
1.335 -** openKey structures) into lockInfo and openCnt structures. Access to
1.336 -** these hash tables must be protected by a mutex.
1.337 -*/
1.338 -static Hash lockHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0};
1.339 -static Hash openHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0};
1.340 -
1.341 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.342 -/*
1.343 -** The locking styles are associated with the different file locking
1.344 -** capabilities supported by different file systems.
1.345 -**
1.346 -** POSIX locking style fully supports shared and exclusive byte-range locks
1.347 -** ADP locking only supports exclusive byte-range locks
1.348 -** FLOCK only supports a single file-global exclusive lock
1.349 -** DOTLOCK isn't a true locking style, it refers to the use of a special
1.350 -** file named the same as the database file with a '.lock' extension, this
1.351 -** can be used on file systems that do not offer any reliable file locking
1.352 -** NO locking means that no locking will be attempted, this is only used for
1.353 -** read-only file systems currently
1.354 -** UNSUPPORTED means that no locking will be attempted, this is only used for
1.355 -** file systems that are known to be unsupported
1.356 -*/
1.357 -typedef enum {
1.358 - posixLockingStyle = 0, /* standard posix-advisory locks */
1.359 - afpLockingStyle, /* use afp locks */
1.360 - flockLockingStyle, /* use flock() */
1.361 - dotlockLockingStyle, /* use <file>.lock files */
1.362 - noLockingStyle, /* useful for read-only file system */
1.363 - unsupportedLockingStyle /* indicates unsupported file system */
1.364 -} sqlite3LockingStyle;
1.365 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.366 -
1.367 -/*
1.368 -** Helper functions to obtain and relinquish the global mutex.
1.369 -*/
1.370 -static void enterMutex(){
1.371 - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
1.372 -}
1.373 -static void leaveMutex(){
1.374 - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
1.375 -}
1.376 -
1.377 -#if SQLITE_THREADSAFE
1.378 -/*
1.379 -** This variable records whether or not threads can override each others
1.380 -** locks.
1.381 -**
1.382 -** 0: No. Threads cannot override each others locks.
1.383 -** 1: Yes. Threads can override each others locks.
1.384 -** -1: We don't know yet.
1.385 -**
1.386 -** On some systems, we know at compile-time if threads can override each
1.387 -** others locks. On those systems, the SQLITE_THREAD_OVERRIDE_LOCK macro
1.388 -** will be set appropriately. On other systems, we have to check at
1.389 -** runtime. On these latter systems, SQLTIE_THREAD_OVERRIDE_LOCK is
1.390 -** undefined.
1.391 -**
1.392 -** This variable normally has file scope only. But during testing, we make
1.393 -** it a global so that the test code can change its value in order to verify
1.394 -** that the right stuff happens in either case.
1.395 -*/
1.396 -#ifndef SQLITE_THREAD_OVERRIDE_LOCK
1.397 -# define SQLITE_THREAD_OVERRIDE_LOCK -1
1.398 -#endif
1.399 -#ifdef SQLITE_TEST
1.400 -int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
1.401 -#else
1.402 -static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
1.403 -#endif
1.404 -
1.405 -/*
1.406 -** This structure holds information passed into individual test
1.407 -** threads by the testThreadLockingBehavior() routine.
1.408 -*/
1.409 -struct threadTestData {
1.410 - int fd; /* File to be locked */
1.411 - struct flock lock; /* The locking operation */
1.412 - int result; /* Result of the locking operation */
1.413 -};
1.414 -
1.415 -#ifdef SQLITE_LOCK_TRACE
1.416 -/*
1.417 -** Print out information about all locking operations.
1.418 -**
1.419 -** This routine is used for troubleshooting locks on multithreaded
1.420 -** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE
1.421 -** command-line option on the compiler. This code is normally
1.422 -** turned off.
1.423 -*/
1.424 -static int lockTrace(int fd, int op, struct flock *p){
1.425 - char *zOpName, *zType;
1.426 - int s;
1.427 - int savedErrno;
1.428 - if( op==F_GETLK ){
1.429 - zOpName = "GETLK";
1.430 - }else if( op==F_SETLK ){
1.431 - zOpName = "SETLK";
1.432 - }else{
1.433 - s = fcntl(fd, op, p);
1.434 - sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s);
1.435 - return s;
1.436 - }
1.437 - if( p->l_type==F_RDLCK ){
1.438 - zType = "RDLCK";
1.439 - }else if( p->l_type==F_WRLCK ){
1.440 - zType = "WRLCK";
1.441 - }else if( p->l_type==F_UNLCK ){
1.442 - zType = "UNLCK";
1.443 - }else{
1.444 - assert( 0 );
1.445 - }
1.446 - assert( p->l_whence==SEEK_SET );
1.447 - s = fcntl(fd, op, p);
1.448 - savedErrno = errno;
1.449 - sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n",
1.450 - threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len,
1.451 - (int)p->l_pid, s);
1.452 - if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){
1.453 - struct flock l2;
1.454 - l2 = *p;
1.455 - fcntl(fd, F_GETLK, &l2);
1.456 - if( l2.l_type==F_RDLCK ){
1.457 - zType = "RDLCK";
1.458 - }else if( l2.l_type==F_WRLCK ){
1.459 - zType = "WRLCK";
1.460 - }else if( l2.l_type==F_UNLCK ){
1.461 - zType = "UNLCK";
1.462 - }else{
1.463 - assert( 0 );
1.464 - }
1.465 - sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n",
1.466 - zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid);
1.467 - }
1.468 - errno = savedErrno;
1.469 - return s;
1.470 -}
1.471 -#define fcntl lockTrace
1.472 -#endif /* SQLITE_LOCK_TRACE */
1.473 -
1.474 -/*
1.475 -** The testThreadLockingBehavior() routine launches two separate
1.476 -** threads on this routine. This routine attempts to lock a file
1.477 -** descriptor then returns. The success or failure of that attempt
1.478 -** allows the testThreadLockingBehavior() procedure to determine
1.479 -** whether or not threads can override each others locks.
1.480 -*/
1.481 -static void *threadLockingTest(void *pArg){
1.482 - struct threadTestData *pData = (struct threadTestData*)pArg;
1.483 - pData->result = fcntl(pData->fd, F_SETLK, &pData->lock);
1.484 - return pArg;
1.485 -}
1.486 -
1.487 -/*
1.488 -** This procedure attempts to determine whether or not threads
1.489 -** can override each others locks then sets the
1.490 -** threadsOverrideEachOthersLocks variable appropriately.
1.491 -*/
1.492 -static void testThreadLockingBehavior(int fd_orig){
1.493 - int fd;
1.494 - struct threadTestData d[2];
1.495 - pthread_t t[2];
1.496 -
1.497 - fd = dup(fd_orig);
1.498 - if( fd<0 ) return;
1.499 - memset(d, 0, sizeof(d));
1.500 - d[0].fd = fd;
1.501 - d[0].lock.l_type = F_RDLCK;
1.502 - d[0].lock.l_len = 1;
1.503 - d[0].lock.l_start = 0;
1.504 - d[0].lock.l_whence = SEEK_SET;
1.505 - d[1] = d[0];
1.506 - d[1].lock.l_type = F_WRLCK;
1.507 - pthread_create(&t[0], 0, threadLockingTest, &d[0]);
1.508 - pthread_create(&t[1], 0, threadLockingTest, &d[1]);
1.509 - pthread_join(t[0], 0);
1.510 - pthread_join(t[1], 0);
1.511 - close(fd);
1.512 - threadsOverrideEachOthersLocks = d[0].result==0 && d[1].result==0;
1.513 -}
1.514 -#endif /* SQLITE_THREADSAFE */
1.515 -
1.516 -/*
1.517 -** Release a lockInfo structure previously allocated by findLockInfo().
1.518 -*/
1.519 -static void releaseLockInfo(struct lockInfo *pLock){
1.520 - if (pLock == NULL)
1.521 - return;
1.522 - pLock->nRef--;
1.523 - if( pLock->nRef==0 ){
1.524 - sqlite3HashInsert(&lockHash, &pLock->key, sizeof(pLock->key), 0);
1.525 - sqlite3_free(pLock);
1.526 - }
1.527 -}
1.528 -
1.529 -/*
1.530 -** Release a openCnt structure previously allocated by findLockInfo().
1.531 -*/
1.532 -static void releaseOpenCnt(struct openCnt *pOpen){
1.533 - if (pOpen == NULL)
1.534 - return;
1.535 - pOpen->nRef--;
1.536 - if( pOpen->nRef==0 ){
1.537 - sqlite3HashInsert(&openHash, &pOpen->key, sizeof(pOpen->key), 0);
1.538 - free(pOpen->aPending);
1.539 - sqlite3_free(pOpen);
1.540 - }
1.541 -}
1.542 -
1.543 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.544 -/*
1.545 -** Tests a byte-range locking query to see if byte range locks are
1.546 -** supported, if not we fall back to dotlockLockingStyle.
1.547 -*/
1.548 -static sqlite3LockingStyle sqlite3TestLockingStyle(
1.549 - const char *filePath,
1.550 - int fd
1.551 -){
1.552 - /* test byte-range lock using fcntl */
1.553 - struct flock lockInfo;
1.554 -
1.555 - lockInfo.l_len = 1;
1.556 - lockInfo.l_start = 0;
1.557 - lockInfo.l_whence = SEEK_SET;
1.558 - lockInfo.l_type = F_RDLCK;
1.559 -
1.560 - if( fcntl(fd, F_GETLK, &lockInfo)!=-1 ) {
1.561 - return posixLockingStyle;
1.562 - }
1.563 -
1.564 - /* testing for flock can give false positives. So if if the above test
1.565 - ** fails, then we fall back to using dot-lock style locking.
1.566 - */
1.567 - return dotlockLockingStyle;
1.568 -}
1.569 -
1.570 -/*
1.571 -** Examines the f_fstypename entry in the statfs structure as returned by
1.572 -** stat() for the file system hosting the database file, assigns the
1.573 -** appropriate locking style based on it's value. These values and
1.574 -** assignments are based on Darwin/OSX behavior and have not been tested on
1.575 -** other systems.
1.576 -*/
1.577 -static sqlite3LockingStyle sqlite3DetectLockingStyle(
1.578 - const char *filePath,
1.579 - int fd
1.580 -){
1.581 -
1.582 -#ifdef SQLITE_FIXED_LOCKING_STYLE
1.583 - return (sqlite3LockingStyle)SQLITE_FIXED_LOCKING_STYLE;
1.584 -#else
1.585 - struct statfs fsInfo;
1.586 -
1.587 - if (statfs(filePath, &fsInfo) == -1)
1.588 - return sqlite3TestLockingStyle(filePath, fd);
1.589 -
1.590 - if (fsInfo.f_flags & MNT_RDONLY)
1.591 - return noLockingStyle;
1.592 -
1.593 - if( (!strcmp(fsInfo.f_fstypename, "hfs")) ||
1.594 - (!strcmp(fsInfo.f_fstypename, "ufs")) )
1.595 - return posixLockingStyle;
1.596 -
1.597 - if(!strcmp(fsInfo.f_fstypename, "afpfs"))
1.598 - return afpLockingStyle;
1.599 -
1.600 - if(!strcmp(fsInfo.f_fstypename, "nfs"))
1.601 - return sqlite3TestLockingStyle(filePath, fd);
1.602 -
1.603 - if(!strcmp(fsInfo.f_fstypename, "smbfs"))
1.604 - return flockLockingStyle;
1.605 -
1.606 - if(!strcmp(fsInfo.f_fstypename, "msdos"))
1.607 - return dotlockLockingStyle;
1.608 -
1.609 - if(!strcmp(fsInfo.f_fstypename, "webdav"))
1.610 - return unsupportedLockingStyle;
1.611 -
1.612 - return sqlite3TestLockingStyle(filePath, fd);
1.613 -#endif /* SQLITE_FIXED_LOCKING_STYLE */
1.614 -}
1.615 -
1.616 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.617 -
1.618 -/*
1.619 -** Given a file descriptor, locate lockInfo and openCnt structures that
1.620 -** describes that file descriptor. Create new ones if necessary. The
1.621 -** return values might be uninitialized if an error occurs.
1.622 -**
1.623 -** Return the number of errors.
1.624 -*/
1.625 -static int findLockInfo(
1.626 - int fd, /* The file descriptor used in the key */
1.627 - struct lockInfo **ppLock, /* Return the lockInfo structure here */
1.628 - struct openCnt **ppOpen /* Return the openCnt structure here */
1.629 -){
1.630 - int rc;
1.631 - struct lockKey key1;
1.632 - struct openKey key2;
1.633 - struct stat statbuf;
1.634 - struct lockInfo *pLock;
1.635 - struct openCnt *pOpen;
1.636 - rc = fstat(fd, &statbuf);
1.637 - if( rc!=0 ) return 1;
1.638 -
1.639 - memset(&key1, 0, sizeof(key1));
1.640 - key1.dev = statbuf.st_dev;
1.641 - key1.ino = statbuf.st_ino;
1.642 -#if SQLITE_THREADSAFE
1.643 - if( threadsOverrideEachOthersLocks<0 ){
1.644 - testThreadLockingBehavior(fd);
1.645 - }
1.646 - key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
1.647 -#endif
1.648 - memset(&key2, 0, sizeof(key2));
1.649 - key2.dev = statbuf.st_dev;
1.650 - key2.ino = statbuf.st_ino;
1.651 - pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1));
1.652 - if( pLock==0 ){
1.653 - struct lockInfo *pOld;
1.654 - pLock = sqlite3_malloc( sizeof(*pLock) );
1.655 - if( pLock==0 ){
1.656 - rc = 1;
1.657 - goto exit_findlockinfo;
1.658 - }
1.659 - pLock->key = key1;
1.660 - pLock->nRef = 1;
1.661 - pLock->cnt = 0;
1.662 - pLock->locktype = 0;
1.663 - pOld = sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock);
1.664 - if( pOld!=0 ){
1.665 - assert( pOld==pLock );
1.666 - sqlite3_free(pLock);
1.667 - rc = 1;
1.668 - goto exit_findlockinfo;
1.669 - }
1.670 - }else{
1.671 - pLock->nRef++;
1.672 - }
1.673 - *ppLock = pLock;
1.674 - if( ppOpen!=0 ){
1.675 - pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2));
1.676 - if( pOpen==0 ){
1.677 - struct openCnt *pOld;
1.678 - pOpen = sqlite3_malloc( sizeof(*pOpen) );
1.679 - if( pOpen==0 ){
1.680 - releaseLockInfo(pLock);
1.681 - rc = 1;
1.682 - goto exit_findlockinfo;
1.683 - }
1.684 - pOpen->key = key2;
1.685 - pOpen->nRef = 1;
1.686 - pOpen->nLock = 0;
1.687 - pOpen->nPending = 0;
1.688 - pOpen->aPending = 0;
1.689 - pOld = sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen);
1.690 - if( pOld!=0 ){
1.691 - assert( pOld==pOpen );
1.692 - sqlite3_free(pOpen);
1.693 - releaseLockInfo(pLock);
1.694 - rc = 1;
1.695 - goto exit_findlockinfo;
1.696 - }
1.697 - }else{
1.698 - pOpen->nRef++;
1.699 - }
1.700 - *ppOpen = pOpen;
1.701 - }
1.702 -
1.703 -exit_findlockinfo:
1.704 - return rc;
1.705 -}
1.706 -
1.707 -#ifdef SQLITE_DEBUG
1.708 -/*
1.709 -** Helper function for printing out trace information from debugging
1.710 -** binaries. This returns the string represetation of the supplied
1.711 -** integer lock-type.
1.712 -*/
1.713 -static const char *locktypeName(int locktype){
1.714 - switch( locktype ){
1.715 - case NO_LOCK: return "NONE";
1.716 - case SHARED_LOCK: return "SHARED";
1.717 - case RESERVED_LOCK: return "RESERVED";
1.718 - case PENDING_LOCK: return "PENDING";
1.719 - case EXCLUSIVE_LOCK: return "EXCLUSIVE";
1.720 - }
1.721 - return "ERROR";
1.722 -}
1.723 -#endif
1.724 -
1.725 -/*
1.726 -** If we are currently in a different thread than the thread that the
1.727 -** unixFile argument belongs to, then transfer ownership of the unixFile
1.728 -** over to the current thread.
1.729 -**
1.730 -** A unixFile is only owned by a thread on systems where one thread is
1.731 -** unable to override locks created by a different thread. RedHat9 is
1.732 -** an example of such a system.
1.733 -**
1.734 -** Ownership transfer is only allowed if the unixFile is currently unlocked.
1.735 -** If the unixFile is locked and an ownership is wrong, then return
1.736 -** SQLITE_MISUSE. SQLITE_OK is returned if everything works.
1.737 -*/
1.738 -#if SQLITE_THREADSAFE
1.739 -static int transferOwnership(unixFile *pFile){
1.740 - int rc;
1.741 - pthread_t hSelf;
1.742 - if( threadsOverrideEachOthersLocks ){
1.743 - /* Ownership transfers not needed on this system */
1.744 - return SQLITE_OK;
1.745 - }
1.746 - hSelf = pthread_self();
1.747 - if( pthread_equal(pFile->tid, hSelf) ){
1.748 - /* We are still in the same thread */
1.749 - OSTRACE1("No-transfer, same thread\n");
1.750 - return SQLITE_OK;
1.751 - }
1.752 - if( pFile->locktype!=NO_LOCK ){
1.753 - /* We cannot change ownership while we are holding a lock! */
1.754 - return SQLITE_MISUSE;
1.755 - }
1.756 - OSTRACE4("Transfer ownership of %d from %d to %d\n",
1.757 - pFile->h, pFile->tid, hSelf);
1.758 - pFile->tid = hSelf;
1.759 - if (pFile->pLock != NULL) {
1.760 - releaseLockInfo(pFile->pLock);
1.761 - rc = findLockInfo(pFile->h, &pFile->pLock, 0);
1.762 - OSTRACE5("LOCK %d is now %s(%s,%d)\n", pFile->h,
1.763 - locktypeName(pFile->locktype),
1.764 - locktypeName(pFile->pLock->locktype), pFile->pLock->cnt);
1.765 - return rc;
1.766 - } else {
1.767 - return SQLITE_OK;
1.768 - }
1.769 -}
1.770 -#else
1.771 - /* On single-threaded builds, ownership transfer is a no-op */
1.772 -# define transferOwnership(X) SQLITE_OK
1.773 -#endif
1.774 -
1.775 -/*
1.776 -** Seek to the offset passed as the second argument, then read cnt
1.777 -** bytes into pBuf. Return the number of bytes actually read.
1.778 -*/
1.779 -static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){
1.780 - int got;
1.781 - i64 newOffset;
1.782 - TIMER_START;
1.783 -#if defined(USE_PREAD)
1.784 - got = pread(id->h, pBuf, cnt, offset);
1.785 - SimulateIOError( got = -1 );
1.786 -#elif defined(USE_PREAD64)
1.787 - got = pread64(id->h, pBuf, cnt, offset);
1.788 - SimulateIOError( got = -1 );
1.789 -#else
1.790 - newOffset = lseek(id->h, offset, SEEK_SET);
1.791 - SimulateIOError( newOffset-- );
1.792 - if( newOffset!=offset ){
1.793 - return -1;
1.794 - }
1.795 - got = read(id->h, pBuf, cnt);
1.796 -#endif
1.797 - TIMER_END;
1.798 - OSTRACE5("READ %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED);
1.799 - return got;
1.800 -}
1.801 -
1.802 -/*
1.803 -** Read data from a file into a buffer. Return SQLITE_OK if all
1.804 -** bytes were read successfully and SQLITE_IOERR if anything goes
1.805 -** wrong.
1.806 -*/
1.807 -static int unixRead(
1.808 - sqlite3_file *id,
1.809 - void *pBuf,
1.810 - int amt,
1.811 - sqlite3_int64 offset
1.812 -){
1.813 - int got;
1.814 - assert( id );
1.815 - got = seekAndRead((unixFile*)id, offset, pBuf, amt);
1.816 - if( got==amt ){
1.817 - return SQLITE_OK;
1.818 - }else if( got<0 ){
1.819 - return SQLITE_IOERR_READ;
1.820 - }else{
1.821 - memset(&((char*)pBuf)[got], 0, amt-got);
1.822 - return SQLITE_IOERR_SHORT_READ;
1.823 - }
1.824 -}
1.825 -
1.826 -/*
1.827 -** Seek to the offset in id->offset then read cnt bytes into pBuf.
1.828 -** Return the number of bytes actually read. Update the offset.
1.829 -*/
1.830 -static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){
1.831 - int got;
1.832 - i64 newOffset;
1.833 - TIMER_START;
1.834 -#if defined(USE_PREAD)
1.835 - got = pwrite(id->h, pBuf, cnt, offset);
1.836 -#elif defined(USE_PREAD64)
1.837 - got = pwrite64(id->h, pBuf, cnt, offset);
1.838 -#else
1.839 - newOffset = lseek(id->h, offset, SEEK_SET);
1.840 - if( newOffset!=offset ){
1.841 - return -1;
1.842 - }
1.843 - got = write(id->h, pBuf, cnt);
1.844 -#endif
1.845 - TIMER_END;
1.846 - OSTRACE5("WRITE %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED);
1.847 - return got;
1.848 -}
1.849 -
1.850 -
1.851 -/*
1.852 -** Write data from a buffer into a file. Return SQLITE_OK on success
1.853 -** or some other error code on failure.
1.854 -*/
1.855 -static int unixWrite(
1.856 - sqlite3_file *id,
1.857 - const void *pBuf,
1.858 - int amt,
1.859 - sqlite3_int64 offset
1.860 -){
1.861 - int wrote = 0;
1.862 - assert( id );
1.863 - assert( amt>0 );
1.864 - while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){
1.865 - amt -= wrote;
1.866 - offset += wrote;
1.867 - pBuf = &((char*)pBuf)[wrote];
1.868 - }
1.869 - SimulateIOError(( wrote=(-1), amt=1 ));
1.870 - SimulateDiskfullError(( wrote=0, amt=1 ));
1.871 - if( amt>0 ){
1.872 - if( wrote<0 ){
1.873 - return SQLITE_IOERR_WRITE;
1.874 - }else{
1.875 - return SQLITE_FULL;
1.876 - }
1.877 - }
1.878 - return SQLITE_OK;
1.879 -}
1.880 -
1.881 -#ifdef SQLITE_TEST
1.882 -/*
1.883 -** Count the number of fullsyncs and normal syncs. This is used to test
1.884 -** that syncs and fullsyncs are occuring at the right times.
1.885 -*/
1.886 -int sqlite3_sync_count = 0;
1.887 -int sqlite3_fullsync_count = 0;
1.888 -#endif
1.889 -
1.890 -/*
1.891 -** Use the fdatasync() API only if the HAVE_FDATASYNC macro is defined.
1.892 -** Otherwise use fsync() in its place.
1.893 -*/
1.894 -#ifndef HAVE_FDATASYNC
1.895 -# define fdatasync fsync
1.896 -#endif
1.897 -
1.898 -/*
1.899 -** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not
1.900 -** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently
1.901 -** only available on Mac OS X. But that could change.
1.902 -*/
1.903 -#ifdef F_FULLFSYNC
1.904 -# define HAVE_FULLFSYNC 1
1.905 -#else
1.906 -# define HAVE_FULLFSYNC 0
1.907 -#endif
1.908 -
1.909 -
1.910 -/*
1.911 -** The fsync() system call does not work as advertised on many
1.912 -** unix systems. The following procedure is an attempt to make
1.913 -** it work better.
1.914 -**
1.915 -** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful
1.916 -** for testing when we want to run through the test suite quickly.
1.917 -** You are strongly advised *not* to deploy with SQLITE_NO_SYNC
1.918 -** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash
1.919 -** or power failure will likely corrupt the database file.
1.920 -*/
1.921 -static int full_fsync(int fd, int fullSync, int dataOnly){
1.922 - int rc;
1.923 -
1.924 - /* Record the number of times that we do a normal fsync() and
1.925 - ** FULLSYNC. This is used during testing to verify that this procedure
1.926 - ** gets called with the correct arguments.
1.927 - */
1.928 -#ifdef SQLITE_TEST
1.929 - if( fullSync ) sqlite3_fullsync_count++;
1.930 - sqlite3_sync_count++;
1.931 -#endif
1.932 -
1.933 - /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
1.934 - ** no-op
1.935 - */
1.936 -#ifdef SQLITE_NO_SYNC
1.937 - rc = SQLITE_OK;
1.938 -#else
1.939 -
1.940 -#if HAVE_FULLFSYNC
1.941 - if( fullSync ){
1.942 - rc = fcntl(fd, F_FULLFSYNC, 0);
1.943 - }else{
1.944 - rc = 1;
1.945 - }
1.946 - /* If the FULLFSYNC failed, fall back to attempting an fsync().
1.947 - * It shouldn't be possible for fullfsync to fail on the local
1.948 - * file system (on OSX), so failure indicates that FULLFSYNC
1.949 - * isn't supported for this file system. So, attempt an fsync
1.950 - * and (for now) ignore the overhead of a superfluous fcntl call.
1.951 - * It'd be better to detect fullfsync support once and avoid
1.952 - * the fcntl call every time sync is called.
1.953 - */
1.954 - if( rc ) rc = fsync(fd);
1.955 -
1.956 -#else
1.957 - if( dataOnly ){
1.958 - rc = fdatasync(fd);
1.959 - }else{
1.960 - rc = fsync(fd);
1.961 - }
1.962 -#endif /* HAVE_FULLFSYNC */
1.963 -#endif /* defined(SQLITE_NO_SYNC) */
1.964 -
1.965 - return rc;
1.966 -}
1.967 -
1.968 -/*
1.969 -** Make sure all writes to a particular file are committed to disk.
1.970 -**
1.971 -** If dataOnly==0 then both the file itself and its metadata (file
1.972 -** size, access time, etc) are synced. If dataOnly!=0 then only the
1.973 -** file data is synced.
1.974 -**
1.975 -** Under Unix, also make sure that the directory entry for the file
1.976 -** has been created by fsync-ing the directory that contains the file.
1.977 -** If we do not do this and we encounter a power failure, the directory
1.978 -** entry for the journal might not exist after we reboot. The next
1.979 -** SQLite to access the file will not know that the journal exists (because
1.980 -** the directory entry for the journal was never created) and the transaction
1.981 -** will not roll back - possibly leading to database corruption.
1.982 -*/
1.983 -static int unixSync(sqlite3_file *id, int flags){
1.984 - int rc;
1.985 - unixFile *pFile = (unixFile*)id;
1.986 -
1.987 - int isDataOnly = (flags&SQLITE_SYNC_DATAONLY);
1.988 - int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL;
1.989 -
1.990 - /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
1.991 - assert((flags&0x0F)==SQLITE_SYNC_NORMAL
1.992 - || (flags&0x0F)==SQLITE_SYNC_FULL
1.993 - );
1.994 -
1.995 - assert( pFile );
1.996 - OSTRACE2("SYNC %-3d\n", pFile->h);
1.997 - rc = full_fsync(pFile->h, isFullsync, isDataOnly);
1.998 - SimulateIOError( rc=1 );
1.999 - if( rc ){
1.1000 - return SQLITE_IOERR_FSYNC;
1.1001 - }
1.1002 - if( pFile->dirfd>=0 ){
1.1003 - OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
1.1004 - HAVE_FULLFSYNC, isFullsync);
1.1005 -#ifndef SQLITE_DISABLE_DIRSYNC
1.1006 - /* The directory sync is only attempted if full_fsync is
1.1007 - ** turned off or unavailable. If a full_fsync occurred above,
1.1008 - ** then the directory sync is superfluous.
1.1009 - */
1.1010 - if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){
1.1011 - /*
1.1012 - ** We have received multiple reports of fsync() returning
1.1013 - ** errors when applied to directories on certain file systems.
1.1014 - ** A failed directory sync is not a big deal. So it seems
1.1015 - ** better to ignore the error. Ticket #1657
1.1016 - */
1.1017 - /* return SQLITE_IOERR; */
1.1018 - }
1.1019 -#endif
1.1020 - close(pFile->dirfd); /* Only need to sync once, so close the directory */
1.1021 - pFile->dirfd = -1; /* when we are done. */
1.1022 - }
1.1023 - return SQLITE_OK;
1.1024 -}
1.1025 -
1.1026 -/*
1.1027 -** Truncate an open file to a specified size
1.1028 -*/
1.1029 -static int unixTruncate(sqlite3_file *id, i64 nByte){
1.1030 - int rc;
1.1031 - assert( id );
1.1032 - rc = ftruncate(((unixFile*)id)->h, (off_t)nByte);
1.1033 - SimulateIOError( rc=1 );
1.1034 - if( rc ){
1.1035 - return SQLITE_IOERR_TRUNCATE;
1.1036 - }else{
1.1037 - return SQLITE_OK;
1.1038 - }
1.1039 -}
1.1040 -
1.1041 -/*
1.1042 -** Determine the current size of a file in bytes
1.1043 -*/
1.1044 -static int unixFileSize(sqlite3_file *id, i64 *pSize){
1.1045 - int rc;
1.1046 - struct stat buf;
1.1047 - assert( id );
1.1048 - rc = fstat(((unixFile*)id)->h, &buf);
1.1049 - SimulateIOError( rc=1 );
1.1050 - if( rc!=0 ){
1.1051 - return SQLITE_IOERR_FSTAT;
1.1052 - }
1.1053 - *pSize = buf.st_size;
1.1054 - return SQLITE_OK;
1.1055 -}
1.1056 -
1.1057 -/*
1.1058 -** This routine checks if there is a RESERVED lock held on the specified
1.1059 -** file by this or any other process. If such a lock is held, return
1.1060 -** non-zero. If the file is unlocked or holds only SHARED locks, then
1.1061 -** return zero.
1.1062 -*/
1.1063 -static int unixCheckReservedLock(sqlite3_file *id){
1.1064 - int r = 0;
1.1065 - unixFile *pFile = (unixFile*)id;
1.1066 -
1.1067 - assert( pFile );
1.1068 - enterMutex(); /* Because pFile->pLock is shared across threads */
1.1069 -
1.1070 - /* Check if a thread in this process holds such a lock */
1.1071 - if( pFile->pLock->locktype>SHARED_LOCK ){
1.1072 - r = 1;
1.1073 - }
1.1074 -
1.1075 - /* Otherwise see if some other process holds it.
1.1076 - */
1.1077 - if( !r ){
1.1078 - struct flock lock;
1.1079 - lock.l_whence = SEEK_SET;
1.1080 - lock.l_start = RESERVED_BYTE;
1.1081 - lock.l_len = 1;
1.1082 - lock.l_type = F_WRLCK;
1.1083 - fcntl(pFile->h, F_GETLK, &lock);
1.1084 - if( lock.l_type!=F_UNLCK ){
1.1085 - r = 1;
1.1086 - }
1.1087 - }
1.1088 -
1.1089 - leaveMutex();
1.1090 - OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r);
1.1091 -
1.1092 - return r;
1.1093 -}
1.1094 -
1.1095 -/*
1.1096 -** Lock the file with the lock specified by parameter locktype - one
1.1097 -** of the following:
1.1098 -**
1.1099 -** (1) SHARED_LOCK
1.1100 -** (2) RESERVED_LOCK
1.1101 -** (3) PENDING_LOCK
1.1102 -** (4) EXCLUSIVE_LOCK
1.1103 -**
1.1104 -** Sometimes when requesting one lock state, additional lock states
1.1105 -** are inserted in between. The locking might fail on one of the later
1.1106 -** transitions leaving the lock state different from what it started but
1.1107 -** still short of its goal. The following chart shows the allowed
1.1108 -** transitions and the inserted intermediate states:
1.1109 -**
1.1110 -** UNLOCKED -> SHARED
1.1111 -** SHARED -> RESERVED
1.1112 -** SHARED -> (PENDING) -> EXCLUSIVE
1.1113 -** RESERVED -> (PENDING) -> EXCLUSIVE
1.1114 -** PENDING -> EXCLUSIVE
1.1115 -**
1.1116 -** This routine will only increase a lock. Use the sqlite3OsUnlock()
1.1117 -** routine to lower a locking level.
1.1118 -*/
1.1119 -static int unixLock(sqlite3_file *id, int locktype){
1.1120 - /* The following describes the implementation of the various locks and
1.1121 - ** lock transitions in terms of the POSIX advisory shared and exclusive
1.1122 - ** lock primitives (called read-locks and write-locks below, to avoid
1.1123 - ** confusion with SQLite lock names). The algorithms are complicated
1.1124 - ** slightly in order to be compatible with windows systems simultaneously
1.1125 - ** accessing the same database file, in case that is ever required.
1.1126 - **
1.1127 - ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved
1.1128 - ** byte', each single bytes at well known offsets, and the 'shared byte
1.1129 - ** range', a range of 510 bytes at a well known offset.
1.1130 - **
1.1131 - ** To obtain a SHARED lock, a read-lock is obtained on the 'pending
1.1132 - ** byte'. If this is successful, a random byte from the 'shared byte
1.1133 - ** range' is read-locked and the lock on the 'pending byte' released.
1.1134 - **
1.1135 - ** A process may only obtain a RESERVED lock after it has a SHARED lock.
1.1136 - ** A RESERVED lock is implemented by grabbing a write-lock on the
1.1137 - ** 'reserved byte'.
1.1138 - **
1.1139 - ** A process may only obtain a PENDING lock after it has obtained a
1.1140 - ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock
1.1141 - ** on the 'pending byte'. This ensures that no new SHARED locks can be
1.1142 - ** obtained, but existing SHARED locks are allowed to persist. A process
1.1143 - ** does not have to obtain a RESERVED lock on the way to a PENDING lock.
1.1144 - ** This property is used by the algorithm for rolling back a journal file
1.1145 - ** after a crash.
1.1146 - **
1.1147 - ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is
1.1148 - ** implemented by obtaining a write-lock on the entire 'shared byte
1.1149 - ** range'. Since all other locks require a read-lock on one of the bytes
1.1150 - ** within this range, this ensures that no other locks are held on the
1.1151 - ** database.
1.1152 - **
1.1153 - ** The reason a single byte cannot be used instead of the 'shared byte
1.1154 - ** range' is that some versions of windows do not support read-locks. By
1.1155 - ** locking a random byte from a range, concurrent SHARED locks may exist
1.1156 - ** even if the locking primitive used is always a write-lock.
1.1157 - */
1.1158 - int rc = SQLITE_OK;
1.1159 - unixFile *pFile = (unixFile*)id;
1.1160 - struct lockInfo *pLock = pFile->pLock;
1.1161 - struct flock lock;
1.1162 - int s;
1.1163 -
1.1164 - assert( pFile );
1.1165 - OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d\n", pFile->h,
1.1166 - locktypeName(locktype), locktypeName(pFile->locktype),
1.1167 - locktypeName(pLock->locktype), pLock->cnt , getpid());
1.1168 -
1.1169 - /* If there is already a lock of this type or more restrictive on the
1.1170 - ** unixFile, do nothing. Don't use the end_lock: exit path, as
1.1171 - ** enterMutex() hasn't been called yet.
1.1172 - */
1.1173 - if( pFile->locktype>=locktype ){
1.1174 - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h,
1.1175 - locktypeName(locktype));
1.1176 - return SQLITE_OK;
1.1177 - }
1.1178 -
1.1179 - /* Make sure the locking sequence is correct
1.1180 - */
1.1181 - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
1.1182 - assert( locktype!=PENDING_LOCK );
1.1183 - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
1.1184 -
1.1185 - /* This mutex is needed because pFile->pLock is shared across threads
1.1186 - */
1.1187 - enterMutex();
1.1188 -
1.1189 - /* Make sure the current thread owns the pFile.
1.1190 - */
1.1191 - rc = transferOwnership(pFile);
1.1192 - if( rc!=SQLITE_OK ){
1.1193 - leaveMutex();
1.1194 - return rc;
1.1195 - }
1.1196 - pLock = pFile->pLock;
1.1197 -
1.1198 - /* If some thread using this PID has a lock via a different unixFile*
1.1199 - ** handle that precludes the requested lock, return BUSY.
1.1200 - */
1.1201 - if( (pFile->locktype!=pLock->locktype &&
1.1202 - (pLock->locktype>=PENDING_LOCK || locktype>SHARED_LOCK))
1.1203 - ){
1.1204 - rc = SQLITE_BUSY;
1.1205 - goto end_lock;
1.1206 - }
1.1207 -
1.1208 - /* If a SHARED lock is requested, and some thread using this PID already
1.1209 - ** has a SHARED or RESERVED lock, then increment reference counts and
1.1210 - ** return SQLITE_OK.
1.1211 - */
1.1212 - if( locktype==SHARED_LOCK &&
1.1213 - (pLock->locktype==SHARED_LOCK || pLock->locktype==RESERVED_LOCK) ){
1.1214 - assert( locktype==SHARED_LOCK );
1.1215 - assert( pFile->locktype==0 );
1.1216 - assert( pLock->cnt>0 );
1.1217 - pFile->locktype = SHARED_LOCK;
1.1218 - pLock->cnt++;
1.1219 - pFile->pOpen->nLock++;
1.1220 - goto end_lock;
1.1221 - }
1.1222 -
1.1223 - lock.l_len = 1L;
1.1224 -
1.1225 - lock.l_whence = SEEK_SET;
1.1226 -
1.1227 - /* A PENDING lock is needed before acquiring a SHARED lock and before
1.1228 - ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
1.1229 - ** be released.
1.1230 - */
1.1231 - if( locktype==SHARED_LOCK
1.1232 - || (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
1.1233 - ){
1.1234 - lock.l_type = (locktype==SHARED_LOCK?F_RDLCK:F_WRLCK);
1.1235 - lock.l_start = PENDING_BYTE;
1.1236 - s = fcntl(pFile->h, F_SETLK, &lock);
1.1237 - if( s==(-1) ){
1.1238 - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
1.1239 - goto end_lock;
1.1240 - }
1.1241 - }
1.1242 -
1.1243 -
1.1244 - /* If control gets to this point, then actually go ahead and make
1.1245 - ** operating system calls for the specified lock.
1.1246 - */
1.1247 - if( locktype==SHARED_LOCK ){
1.1248 - assert( pLock->cnt==0 );
1.1249 - assert( pLock->locktype==0 );
1.1250 -
1.1251 - /* Now get the read-lock */
1.1252 - lock.l_start = SHARED_FIRST;
1.1253 - lock.l_len = SHARED_SIZE;
1.1254 - s = fcntl(pFile->h, F_SETLK, &lock);
1.1255 -
1.1256 - /* Drop the temporary PENDING lock */
1.1257 - lock.l_start = PENDING_BYTE;
1.1258 - lock.l_len = 1L;
1.1259 - lock.l_type = F_UNLCK;
1.1260 - if( fcntl(pFile->h, F_SETLK, &lock)!=0 ){
1.1261 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1262 - goto end_lock;
1.1263 - }
1.1264 - if( s==(-1) ){
1.1265 - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
1.1266 - }else{
1.1267 - pFile->locktype = SHARED_LOCK;
1.1268 - pFile->pOpen->nLock++;
1.1269 - pLock->cnt = 1;
1.1270 - }
1.1271 - }else if( locktype==EXCLUSIVE_LOCK && pLock->cnt>1 ){
1.1272 - /* We are trying for an exclusive lock but another thread in this
1.1273 - ** same process is still holding a shared lock. */
1.1274 - rc = SQLITE_BUSY;
1.1275 - }else{
1.1276 - /* The request was for a RESERVED or EXCLUSIVE lock. It is
1.1277 - ** assumed that there is a SHARED or greater lock on the file
1.1278 - ** already.
1.1279 - */
1.1280 - assert( 0!=pFile->locktype );
1.1281 - lock.l_type = F_WRLCK;
1.1282 - switch( locktype ){
1.1283 - case RESERVED_LOCK:
1.1284 - lock.l_start = RESERVED_BYTE;
1.1285 - break;
1.1286 - case EXCLUSIVE_LOCK:
1.1287 - lock.l_start = SHARED_FIRST;
1.1288 - lock.l_len = SHARED_SIZE;
1.1289 - break;
1.1290 - default:
1.1291 - assert(0);
1.1292 - }
1.1293 - s = fcntl(pFile->h, F_SETLK, &lock);
1.1294 - if( s==(-1) ){
1.1295 - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
1.1296 - }
1.1297 - }
1.1298 -
1.1299 - if( rc==SQLITE_OK ){
1.1300 - pFile->locktype = locktype;
1.1301 - pLock->locktype = locktype;
1.1302 - }else if( locktype==EXCLUSIVE_LOCK ){
1.1303 - pFile->locktype = PENDING_LOCK;
1.1304 - pLock->locktype = PENDING_LOCK;
1.1305 - }
1.1306 -
1.1307 -end_lock:
1.1308 - leaveMutex();
1.1309 - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype),
1.1310 - rc==SQLITE_OK ? "ok" : "failed");
1.1311 - return rc;
1.1312 -}
1.1313 -
1.1314 -/*
1.1315 -** Lower the locking level on file descriptor pFile to locktype. locktype
1.1316 -** must be either NO_LOCK or SHARED_LOCK.
1.1317 -**
1.1318 -** If the locking level of the file descriptor is already at or below
1.1319 -** the requested locking level, this routine is a no-op.
1.1320 -*/
1.1321 -static int unixUnlock(sqlite3_file *id, int locktype){
1.1322 - struct lockInfo *pLock;
1.1323 - struct flock lock;
1.1324 - int rc = SQLITE_OK;
1.1325 - unixFile *pFile = (unixFile*)id;
1.1326 -
1.1327 - assert( pFile );
1.1328 - OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d\n", pFile->h, locktype,
1.1329 - pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid());
1.1330 -
1.1331 - assert( locktype<=SHARED_LOCK );
1.1332 - if( pFile->locktype<=locktype ){
1.1333 - return SQLITE_OK;
1.1334 - }
1.1335 - if( CHECK_THREADID(pFile) ){
1.1336 - return SQLITE_MISUSE;
1.1337 - }
1.1338 - enterMutex();
1.1339 - pLock = pFile->pLock;
1.1340 - assert( pLock->cnt!=0 );
1.1341 - if( pFile->locktype>SHARED_LOCK ){
1.1342 - assert( pLock->locktype==pFile->locktype );
1.1343 - if( locktype==SHARED_LOCK ){
1.1344 - lock.l_type = F_RDLCK;
1.1345 - lock.l_whence = SEEK_SET;
1.1346 - lock.l_start = SHARED_FIRST;
1.1347 - lock.l_len = SHARED_SIZE;
1.1348 - if( fcntl(pFile->h, F_SETLK, &lock)==(-1) ){
1.1349 - /* This should never happen */
1.1350 - rc = SQLITE_IOERR_RDLOCK;
1.1351 - }
1.1352 - }
1.1353 - lock.l_type = F_UNLCK;
1.1354 - lock.l_whence = SEEK_SET;
1.1355 - lock.l_start = PENDING_BYTE;
1.1356 - lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE );
1.1357 - if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){
1.1358 - pLock->locktype = SHARED_LOCK;
1.1359 - }else{
1.1360 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1361 - }
1.1362 - }
1.1363 - if( locktype==NO_LOCK ){
1.1364 - struct openCnt *pOpen;
1.1365 -
1.1366 - /* Decrement the shared lock counter. Release the lock using an
1.1367 - ** OS call only when all threads in this same process have released
1.1368 - ** the lock.
1.1369 - */
1.1370 - pLock->cnt--;
1.1371 - if( pLock->cnt==0 ){
1.1372 - lock.l_type = F_UNLCK;
1.1373 - lock.l_whence = SEEK_SET;
1.1374 - lock.l_start = lock.l_len = 0L;
1.1375 - if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){
1.1376 - pLock->locktype = NO_LOCK;
1.1377 - }else{
1.1378 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1379 - }
1.1380 - }
1.1381 -
1.1382 - /* Decrement the count of locks against this same file. When the
1.1383 - ** count reaches zero, close any other file descriptors whose close
1.1384 - ** was deferred because of outstanding locks.
1.1385 - */
1.1386 - pOpen = pFile->pOpen;
1.1387 - pOpen->nLock--;
1.1388 - assert( pOpen->nLock>=0 );
1.1389 - if( pOpen->nLock==0 && pOpen->nPending>0 ){
1.1390 - int i;
1.1391 - for(i=0; i<pOpen->nPending; i++){
1.1392 - close(pOpen->aPending[i]);
1.1393 - }
1.1394 - free(pOpen->aPending);
1.1395 - pOpen->nPending = 0;
1.1396 - pOpen->aPending = 0;
1.1397 - }
1.1398 - }
1.1399 - leaveMutex();
1.1400 - pFile->locktype = locktype;
1.1401 - return rc;
1.1402 -}
1.1403 -
1.1404 -/*
1.1405 -** Close a file.
1.1406 -*/
1.1407 -static int unixClose(sqlite3_file *id){
1.1408 - unixFile *pFile = (unixFile *)id;
1.1409 - if( !pFile ) return SQLITE_OK;
1.1410 - unixUnlock(id, NO_LOCK);
1.1411 - if( pFile->dirfd>=0 ) close(pFile->dirfd);
1.1412 - pFile->dirfd = -1;
1.1413 - enterMutex();
1.1414 -
1.1415 - if( pFile->pOpen->nLock ){
1.1416 - /* If there are outstanding locks, do not actually close the file just
1.1417 - ** yet because that would clear those locks. Instead, add the file
1.1418 - ** descriptor to pOpen->aPending. It will be automatically closed when
1.1419 - ** the last lock is cleared.
1.1420 - */
1.1421 - int *aNew;
1.1422 - struct openCnt *pOpen = pFile->pOpen;
1.1423 - aNew = realloc( pOpen->aPending, (pOpen->nPending+1)*sizeof(int) );
1.1424 - if( aNew==0 ){
1.1425 - /* If a malloc fails, just leak the file descriptor */
1.1426 - }else{
1.1427 - pOpen->aPending = aNew;
1.1428 - pOpen->aPending[pOpen->nPending] = pFile->h;
1.1429 - pOpen->nPending++;
1.1430 - }
1.1431 - }else{
1.1432 - /* There are no outstanding locks so we can close the file immediately */
1.1433 - close(pFile->h);
1.1434 - }
1.1435 - releaseLockInfo(pFile->pLock);
1.1436 - releaseOpenCnt(pFile->pOpen);
1.1437 -
1.1438 - leaveMutex();
1.1439 - OSTRACE2("CLOSE %-3d\n", pFile->h);
1.1440 - OpenCounter(-1);
1.1441 - memset(pFile, 0, sizeof(unixFile));
1.1442 - return SQLITE_OK;
1.1443 -}
1.1444 -
1.1445 -
1.1446 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.1447 -#pragma mark AFP Support
1.1448 -
1.1449 -/*
1.1450 - ** The afpLockingContext structure contains all afp lock specific state
1.1451 - */
1.1452 -typedef struct afpLockingContext afpLockingContext;
1.1453 -struct afpLockingContext {
1.1454 - unsigned long long sharedLockByte;
1.1455 - char *filePath;
1.1456 -};
1.1457 -
1.1458 -struct ByteRangeLockPB2
1.1459 -{
1.1460 - unsigned long long offset; /* offset to first byte to lock */
1.1461 - unsigned long long length; /* nbr of bytes to lock */
1.1462 - unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */
1.1463 - unsigned char unLockFlag; /* 1 = unlock, 0 = lock */
1.1464 - unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */
1.1465 - int fd; /* file desc to assoc this lock with */
1.1466 -};
1.1467 -
1.1468 -#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2)
1.1469 -
1.1470 -/*
1.1471 -** Return 0 on success, 1 on failure. To match the behavior of the
1.1472 -** normal posix file locking (used in unixLock for example), we should
1.1473 -** provide 'richer' return codes - specifically to differentiate between
1.1474 -** 'file busy' and 'file system error' results.
1.1475 -*/
1.1476 -static int _AFPFSSetLock(
1.1477 - const char *path,
1.1478 - int fd,
1.1479 - unsigned long long offset,
1.1480 - unsigned long long length,
1.1481 - int setLockFlag
1.1482 -){
1.1483 - struct ByteRangeLockPB2 pb;
1.1484 - int err;
1.1485 -
1.1486 - pb.unLockFlag = setLockFlag ? 0 : 1;
1.1487 - pb.startEndFlag = 0;
1.1488 - pb.offset = offset;
1.1489 - pb.length = length;
1.1490 - pb.fd = fd;
1.1491 - OSTRACE5("AFPLOCK setting lock %s for %d in range %llx:%llx\n",
1.1492 - (setLockFlag?"ON":"OFF"), fd, offset, length);
1.1493 - err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0);
1.1494 - if ( err==-1 ) {
1.1495 - OSTRACE4("AFPLOCK failed to fsctl() '%s' %d %s\n", path, errno,
1.1496 - strerror(errno));
1.1497 - return 1; /* error */
1.1498 - } else {
1.1499 - return 0;
1.1500 - }
1.1501 -}
1.1502 -
1.1503 -/*
1.1504 - ** This routine checks if there is a RESERVED lock held on the specified
1.1505 - ** file by this or any other process. If such a lock is held, return
1.1506 - ** non-zero. If the file is unlocked or holds only SHARED locks, then
1.1507 - ** return zero.
1.1508 - */
1.1509 -static int afpUnixCheckReservedLock(sqlite3_file *id){
1.1510 - int r = 0;
1.1511 - unixFile *pFile = (unixFile*)id;
1.1512 -
1.1513 - assert( pFile );
1.1514 - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
1.1515 -
1.1516 - /* Check if a thread in this process holds such a lock */
1.1517 - if( pFile->locktype>SHARED_LOCK ){
1.1518 - r = 1;
1.1519 - }
1.1520 -
1.1521 - /* Otherwise see if some other process holds it.
1.1522 - */
1.1523 - if ( !r ) {
1.1524 - /* lock the byte */
1.1525 - int failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1);
1.1526 - if (failed) {
1.1527 - /* if we failed to get the lock then someone else must have it */
1.1528 - r = 1;
1.1529 - } else {
1.1530 - /* if we succeeded in taking the reserved lock, unlock it to restore
1.1531 - ** the original state */
1.1532 - _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0);
1.1533 - }
1.1534 - }
1.1535 - OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r);
1.1536 -
1.1537 - return r;
1.1538 -}
1.1539 -
1.1540 -/* AFP-style locking following the behavior of unixLock, see the unixLock
1.1541 -** function comments for details of lock management. */
1.1542 -static int afpUnixLock(sqlite3_file *id, int locktype)
1.1543 -{
1.1544 - int rc = SQLITE_OK;
1.1545 - unixFile *pFile = (unixFile*)id;
1.1546 - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
1.1547 - int gotPendingLock = 0;
1.1548 -
1.1549 - assert( pFile );
1.1550 - OSTRACE5("LOCK %d %s was %s pid=%d\n", pFile->h,
1.1551 - locktypeName(locktype), locktypeName(pFile->locktype), getpid());
1.1552 - /* If there is already a lock of this type or more restrictive on the
1.1553 - ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as
1.1554 - ** enterMutex() hasn't been called yet.
1.1555 - */
1.1556 - if( pFile->locktype>=locktype ){
1.1557 - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h,
1.1558 - locktypeName(locktype));
1.1559 - return SQLITE_OK;
1.1560 - }
1.1561 -
1.1562 - /* Make sure the locking sequence is correct
1.1563 - */
1.1564 - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
1.1565 - assert( locktype!=PENDING_LOCK );
1.1566 - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
1.1567 -
1.1568 - /* This mutex is needed because pFile->pLock is shared across threads
1.1569 - */
1.1570 - enterMutex();
1.1571 -
1.1572 - /* Make sure the current thread owns the pFile.
1.1573 - */
1.1574 - rc = transferOwnership(pFile);
1.1575 - if( rc!=SQLITE_OK ){
1.1576 - leaveMutex();
1.1577 - return rc;
1.1578 - }
1.1579 -
1.1580 - /* A PENDING lock is needed before acquiring a SHARED lock and before
1.1581 - ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
1.1582 - ** be released.
1.1583 - */
1.1584 - if( locktype==SHARED_LOCK
1.1585 - || (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
1.1586 - ){
1.1587 - int failed = _AFPFSSetLock(context->filePath, pFile->h,
1.1588 - PENDING_BYTE, 1, 1);
1.1589 - if (failed) {
1.1590 - rc = SQLITE_BUSY;
1.1591 - goto afp_end_lock;
1.1592 - }
1.1593 - }
1.1594 -
1.1595 - /* If control gets to this point, then actually go ahead and make
1.1596 - ** operating system calls for the specified lock.
1.1597 - */
1.1598 - if( locktype==SHARED_LOCK ){
1.1599 - int lk, failed;
1.1600 - int tries = 0;
1.1601 -
1.1602 - /* Now get the read-lock */
1.1603 - /* note that the quality of the randomness doesn't matter that much */
1.1604 - lk = random();
1.1605 - context->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1);
1.1606 - failed = _AFPFSSetLock(context->filePath, pFile->h,
1.1607 - SHARED_FIRST+context->sharedLockByte, 1, 1);
1.1608 -
1.1609 - /* Drop the temporary PENDING lock */
1.1610 - if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)) {
1.1611 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1612 - goto afp_end_lock;
1.1613 - }
1.1614 -
1.1615 - if( failed ){
1.1616 - rc = SQLITE_BUSY;
1.1617 - } else {
1.1618 - pFile->locktype = SHARED_LOCK;
1.1619 - }
1.1620 - }else{
1.1621 - /* The request was for a RESERVED or EXCLUSIVE lock. It is
1.1622 - ** assumed that there is a SHARED or greater lock on the file
1.1623 - ** already.
1.1624 - */
1.1625 - int failed = 0;
1.1626 - assert( 0!=pFile->locktype );
1.1627 - if (locktype >= RESERVED_LOCK && pFile->locktype < RESERVED_LOCK) {
1.1628 - /* Acquire a RESERVED lock */
1.1629 - failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1);
1.1630 - }
1.1631 - if (!failed && locktype == EXCLUSIVE_LOCK) {
1.1632 - /* Acquire an EXCLUSIVE lock */
1.1633 -
1.1634 - /* Remove the shared lock before trying the range. we'll need to
1.1635 - ** reestablish the shared lock if we can't get the afpUnixUnlock
1.1636 - */
1.1637 - if (!_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST +
1.1638 - context->sharedLockByte, 1, 0)) {
1.1639 - /* now attemmpt to get the exclusive lock range */
1.1640 - failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST,
1.1641 - SHARED_SIZE, 1);
1.1642 - if (failed && _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST +
1.1643 - context->sharedLockByte, 1, 1)) {
1.1644 - rc = SQLITE_IOERR_RDLOCK; /* this should never happen */
1.1645 - }
1.1646 - } else {
1.1647 - /* */
1.1648 - rc = SQLITE_IOERR_UNLOCK; /* this should never happen */
1.1649 - }
1.1650 - }
1.1651 - if( failed && rc == SQLITE_OK){
1.1652 - rc = SQLITE_BUSY;
1.1653 - }
1.1654 - }
1.1655 -
1.1656 - if( rc==SQLITE_OK ){
1.1657 - pFile->locktype = locktype;
1.1658 - }else if( locktype==EXCLUSIVE_LOCK ){
1.1659 - pFile->locktype = PENDING_LOCK;
1.1660 - }
1.1661 -
1.1662 -afp_end_lock:
1.1663 - leaveMutex();
1.1664 - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype),
1.1665 - rc==SQLITE_OK ? "ok" : "failed");
1.1666 - return rc;
1.1667 -}
1.1668 -
1.1669 -/*
1.1670 - ** Lower the locking level on file descriptor pFile to locktype. locktype
1.1671 - ** must be either NO_LOCK or SHARED_LOCK.
1.1672 - **
1.1673 - ** If the locking level of the file descriptor is already at or below
1.1674 - ** the requested locking level, this routine is a no-op.
1.1675 - */
1.1676 -static int afpUnixUnlock(sqlite3_file *id, int locktype) {
1.1677 - struct flock lock;
1.1678 - int rc = SQLITE_OK;
1.1679 - unixFile *pFile = (unixFile*)id;
1.1680 - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
1.1681 -
1.1682 - assert( pFile );
1.1683 - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype,
1.1684 - pFile->locktype, getpid());
1.1685 -
1.1686 - assert( locktype<=SHARED_LOCK );
1.1687 - if( pFile->locktype<=locktype ){
1.1688 - return SQLITE_OK;
1.1689 - }
1.1690 - if( CHECK_THREADID(pFile) ){
1.1691 - return SQLITE_MISUSE;
1.1692 - }
1.1693 - enterMutex();
1.1694 - if( pFile->locktype>SHARED_LOCK ){
1.1695 - if( locktype==SHARED_LOCK ){
1.1696 - int failed = 0;
1.1697 -
1.1698 - /* unlock the exclusive range - then re-establish the shared lock */
1.1699 - if (pFile->locktype==EXCLUSIVE_LOCK) {
1.1700 - failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST,
1.1701 - SHARED_SIZE, 0);
1.1702 - if (!failed) {
1.1703 - /* successfully removed the exclusive lock */
1.1704 - if (_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST+
1.1705 - context->sharedLockByte, 1, 1)) {
1.1706 - /* failed to re-establish our shared lock */
1.1707 - rc = SQLITE_IOERR_RDLOCK; /* This should never happen */
1.1708 - }
1.1709 - } else {
1.1710 - /* This should never happen - failed to unlock the exclusive range */
1.1711 - rc = SQLITE_IOERR_UNLOCK;
1.1712 - }
1.1713 - }
1.1714 - }
1.1715 - if (rc == SQLITE_OK && pFile->locktype>=PENDING_LOCK) {
1.1716 - if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)){
1.1717 - /* failed to release the pending lock */
1.1718 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1719 - }
1.1720 - }
1.1721 - if (rc == SQLITE_OK && pFile->locktype>=RESERVED_LOCK) {
1.1722 - if (_AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0)) {
1.1723 - /* failed to release the reserved lock */
1.1724 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1725 - }
1.1726 - }
1.1727 - }
1.1728 - if( locktype==NO_LOCK ){
1.1729 - int failed = _AFPFSSetLock(context->filePath, pFile->h,
1.1730 - SHARED_FIRST + context->sharedLockByte, 1, 0);
1.1731 - if (failed) {
1.1732 - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
1.1733 - }
1.1734 - }
1.1735 - if (rc == SQLITE_OK)
1.1736 - pFile->locktype = locktype;
1.1737 - leaveMutex();
1.1738 - return rc;
1.1739 -}
1.1740 -
1.1741 -/*
1.1742 - ** Close a file & cleanup AFP specific locking context
1.1743 - */
1.1744 -static int afpUnixClose(sqlite3_file *id) {
1.1745 - unixFile *pFile = (unixFile*)pId;
1.1746 -
1.1747 - if( !pFile ) return SQLITE_OK;
1.1748 - afpUnixUnlock(*pId, NO_LOCK);
1.1749 - /* free the AFP locking structure */
1.1750 - if (pFile->lockingContext != NULL) {
1.1751 - if (((afpLockingContext *)pFile->lockingContext)->filePath != NULL)
1.1752 - sqlite3_free(((afpLockingContext*)pFile->lockingContext)->filePath);
1.1753 - sqlite3_free(pFile->lockingContext);
1.1754 - }
1.1755 -
1.1756 - if( pFile->dirfd>=0 ) close(pFile->dirfd);
1.1757 - pFile->dirfd = -1;
1.1758 - close(pFile->h);
1.1759 - OSTRACE2("CLOSE %-3d\n", pFile->h);
1.1760 - OpenCounter(-1);
1.1761 - return SQLITE_OK;
1.1762 -}
1.1763 -
1.1764 -
1.1765 -#pragma mark flock() style locking
1.1766 -
1.1767 -/*
1.1768 - ** The flockLockingContext is not used
1.1769 - */
1.1770 -typedef void flockLockingContext;
1.1771 -
1.1772 -static int flockUnixCheckReservedLock(sqlite3_file *id) {
1.1773 - unixFile *pFile = (unixFile*)id;
1.1774 -
1.1775 - if (pFile->locktype == RESERVED_LOCK) {
1.1776 - return 1; /* already have a reserved lock */
1.1777 - } else {
1.1778 - /* attempt to get the lock */
1.1779 - int rc = flock(pFile->h, LOCK_EX | LOCK_NB);
1.1780 - if (!rc) {
1.1781 - /* got the lock, unlock it */
1.1782 - flock(pFile->h, LOCK_UN);
1.1783 - return 0; /* no one has it reserved */
1.1784 - }
1.1785 - return 1; /* someone else might have it reserved */
1.1786 - }
1.1787 -}
1.1788 -
1.1789 -static int flockUnixLock(sqlite3_file *id, int locktype) {
1.1790 - unixFile *pFile = (unixFile*)id;
1.1791 -
1.1792 - /* if we already have a lock, it is exclusive.
1.1793 - ** Just adjust level and punt on outta here. */
1.1794 - if (pFile->locktype > NO_LOCK) {
1.1795 - pFile->locktype = locktype;
1.1796 - return SQLITE_OK;
1.1797 - }
1.1798 -
1.1799 - /* grab an exclusive lock */
1.1800 - int rc = flock(pFile->h, LOCK_EX | LOCK_NB);
1.1801 - if (rc) {
1.1802 - /* didn't get, must be busy */
1.1803 - return SQLITE_BUSY;
1.1804 - } else {
1.1805 - /* got it, set the type and return ok */
1.1806 - pFile->locktype = locktype;
1.1807 - return SQLITE_OK;
1.1808 - }
1.1809 -}
1.1810 -
1.1811 -static int flockUnixUnlock(sqlite3_file *id, int locktype) {
1.1812 - unixFile *pFile = (unixFile*)id;
1.1813 -
1.1814 - assert( locktype<=SHARED_LOCK );
1.1815 -
1.1816 - /* no-op if possible */
1.1817 - if( pFile->locktype==locktype ){
1.1818 - return SQLITE_OK;
1.1819 - }
1.1820 -
1.1821 - /* shared can just be set because we always have an exclusive */
1.1822 - if (locktype==SHARED_LOCK) {
1.1823 - pFile->locktype = locktype;
1.1824 - return SQLITE_OK;
1.1825 - }
1.1826 -
1.1827 - /* no, really, unlock. */
1.1828 - int rc = flock(pFile->h, LOCK_UN);
1.1829 - if (rc)
1.1830 - return SQLITE_IOERR_UNLOCK;
1.1831 - else {
1.1832 - pFile->locktype = NO_LOCK;
1.1833 - return SQLITE_OK;
1.1834 - }
1.1835 -}
1.1836 -
1.1837 -/*
1.1838 - ** Close a file.
1.1839 - */
1.1840 -static int flockUnixClose(sqlite3_file *pId) {
1.1841 - unixFile *pFile = (unixFile*)*pId;
1.1842 -
1.1843 - if( !pFile ) return SQLITE_OK;
1.1844 - flockUnixUnlock(*pId, NO_LOCK);
1.1845 -
1.1846 - if( pFile->dirfd>=0 ) close(pFile->dirfd);
1.1847 - pFile->dirfd = -1;
1.1848 - enterMutex();
1.1849 -
1.1850 - close(pFile->h);
1.1851 - leaveMutex();
1.1852 - OSTRACE2("CLOSE %-3d\n", pFile->h);
1.1853 - OpenCounter(-1);
1.1854 - return SQLITE_OK;
1.1855 -}
1.1856 -
1.1857 -#pragma mark Old-School .lock file based locking
1.1858 -
1.1859 -/*
1.1860 - ** The dotlockLockingContext structure contains all dotlock (.lock) lock
1.1861 - ** specific state
1.1862 - */
1.1863 -typedef struct dotlockLockingContext dotlockLockingContext;
1.1864 -struct dotlockLockingContext {
1.1865 - char *lockPath;
1.1866 -};
1.1867 -
1.1868 -
1.1869 -static int dotlockUnixCheckReservedLock(sqlite3_file *id) {
1.1870 - unixFile *pFile = (unixFile*)id;
1.1871 - dotlockLockingContext *context =
1.1872 - (dotlockLockingContext *) pFile->lockingContext;
1.1873 -
1.1874 - if (pFile->locktype == RESERVED_LOCK) {
1.1875 - return 1; /* already have a reserved lock */
1.1876 - } else {
1.1877 - struct stat statBuf;
1.1878 - if (lstat(context->lockPath,&statBuf) == 0)
1.1879 - /* file exists, someone else has the lock */
1.1880 - return 1;
1.1881 - else
1.1882 - /* file does not exist, we could have it if we want it */
1.1883 - return 0;
1.1884 - }
1.1885 -}
1.1886 -
1.1887 -static int dotlockUnixLock(sqlite3_file *id, int locktype) {
1.1888 - unixFile *pFile = (unixFile*)id;
1.1889 - dotlockLockingContext *context =
1.1890 - (dotlockLockingContext *) pFile->lockingContext;
1.1891 -
1.1892 - /* if we already have a lock, it is exclusive.
1.1893 - ** Just adjust level and punt on outta here. */
1.1894 - if (pFile->locktype > NO_LOCK) {
1.1895 - pFile->locktype = locktype;
1.1896 -
1.1897 - /* Always update the timestamp on the old file */
1.1898 - utimes(context->lockPath,NULL);
1.1899 - return SQLITE_OK;
1.1900 - }
1.1901 -
1.1902 - /* check to see if lock file already exists */
1.1903 - struct stat statBuf;
1.1904 - if (lstat(context->lockPath,&statBuf) == 0){
1.1905 - return SQLITE_BUSY; /* it does, busy */
1.1906 - }
1.1907 -
1.1908 - /* grab an exclusive lock */
1.1909 - int fd = open(context->lockPath,O_RDONLY|O_CREAT|O_EXCL,0600);
1.1910 - if (fd < 0) {
1.1911 - /* failed to open/create the file, someone else may have stolen the lock */
1.1912 - return SQLITE_BUSY;
1.1913 - }
1.1914 - close(fd);
1.1915 -
1.1916 - /* got it, set the type and return ok */
1.1917 - pFile->locktype = locktype;
1.1918 - return SQLITE_OK;
1.1919 -}
1.1920 -
1.1921 -static int dotlockUnixUnlock(sqlite3_file *id, int locktype) {
1.1922 - unixFile *pFile = (unixFile*)id;
1.1923 - dotlockLockingContext *context =
1.1924 - (dotlockLockingContext *) pFile->lockingContext;
1.1925 -
1.1926 - assert( locktype<=SHARED_LOCK );
1.1927 -
1.1928 - /* no-op if possible */
1.1929 - if( pFile->locktype==locktype ){
1.1930 - return SQLITE_OK;
1.1931 - }
1.1932 -
1.1933 - /* shared can just be set because we always have an exclusive */
1.1934 - if (locktype==SHARED_LOCK) {
1.1935 - pFile->locktype = locktype;
1.1936 - return SQLITE_OK;
1.1937 - }
1.1938 -
1.1939 - /* no, really, unlock. */
1.1940 - unlink(context->lockPath);
1.1941 - pFile->locktype = NO_LOCK;
1.1942 - return SQLITE_OK;
1.1943 -}
1.1944 -
1.1945 -/*
1.1946 - ** Close a file.
1.1947 - */
1.1948 -static int dotlockUnixClose(sqlite3_file *id) {
1.1949 - unixFile *pFile = (unixFile*)id;
1.1950 -
1.1951 - if( !pFile ) return SQLITE_OK;
1.1952 - dotlockUnixUnlock(*pId, NO_LOCK);
1.1953 - /* free the dotlock locking structure */
1.1954 - if (pFile->lockingContext != NULL) {
1.1955 - if (((dotlockLockingContext *)pFile->lockingContext)->lockPath != NULL)
1.1956 - sqlite3_free( ( (dotlockLockingContext *)
1.1957 - pFile->lockingContext)->lockPath);
1.1958 - sqlite3_free(pFile->lockingContext);
1.1959 - }
1.1960 -
1.1961 - if( pFile->dirfd>=0 ) close(pFile->dirfd);
1.1962 - pFile->dirfd = -1;
1.1963 - enterMutex();
1.1964 -
1.1965 - close(pFile->h);
1.1966 -
1.1967 - leaveMutex();
1.1968 - OSTRACE2("CLOSE %-3d\n", pFile->h);
1.1969 - OpenCounter(-1);
1.1970 - return SQLITE_OK;
1.1971 -}
1.1972 -
1.1973 -
1.1974 -#pragma mark No locking
1.1975 -
1.1976 -/*
1.1977 - ** The nolockLockingContext is void
1.1978 - */
1.1979 -typedef void nolockLockingContext;
1.1980 -
1.1981 -static int nolockUnixCheckReservedLock(sqlite3_file *id) {
1.1982 - return 0;
1.1983 -}
1.1984 -
1.1985 -static int nolockUnixLock(sqlite3_file *id, int locktype) {
1.1986 - return SQLITE_OK;
1.1987 -}
1.1988 -
1.1989 -static int nolockUnixUnlock(sqlite3_file *id, int locktype) {
1.1990 - return SQLITE_OK;
1.1991 -}
1.1992 -
1.1993 -/*
1.1994 - ** Close a file.
1.1995 - */
1.1996 -static int nolockUnixClose(sqlite3_file *id) {
1.1997 - unixFile *pFile = (unixFile*)id;
1.1998 -
1.1999 - if( !pFile ) return SQLITE_OK;
1.2000 - if( pFile->dirfd>=0 ) close(pFile->dirfd);
1.2001 - pFile->dirfd = -1;
1.2002 - enterMutex();
1.2003 -
1.2004 - close(pFile->h);
1.2005 -
1.2006 - leaveMutex();
1.2007 - OSTRACE2("CLOSE %-3d\n", pFile->h);
1.2008 - OpenCounter(-1);
1.2009 - return SQLITE_OK;
1.2010 -}
1.2011 -
1.2012 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.2013 -
1.2014 -
1.2015 -/*
1.2016 -** Information and control of an open file handle.
1.2017 -*/
1.2018 -static int unixFileControl(sqlite3_file *id, int op, void *pArg){
1.2019 - switch( op ){
1.2020 - case SQLITE_FCNTL_LOCKSTATE: {
1.2021 - *(int*)pArg = ((unixFile*)id)->locktype;
1.2022 - return SQLITE_OK;
1.2023 - }
1.2024 - }
1.2025 - return SQLITE_ERROR;
1.2026 -}
1.2027 -
1.2028 -/*
1.2029 -** Return the sector size in bytes of the underlying block device for
1.2030 -** the specified file. This is almost always 512 bytes, but may be
1.2031 -** larger for some devices.
1.2032 -**
1.2033 -** SQLite code assumes this function cannot fail. It also assumes that
1.2034 -** if two files are created in the same file-system directory (i.e.
1.2035 -** a database and it's journal file) that the sector size will be the
1.2036 -** same for both.
1.2037 -*/
1.2038 -static int unixSectorSize(sqlite3_file *id){
1.2039 - return SQLITE_DEFAULT_SECTOR_SIZE;
1.2040 -}
1.2041 -
1.2042 -/*
1.2043 -** Return the device characteristics for the file. This is always 0.
1.2044 -*/
1.2045 -static int unixDeviceCharacteristics(sqlite3_file *id){
1.2046 - return 0;
1.2047 -}
1.2048 -
1.2049 -/*
1.2050 -** This vector defines all the methods that can operate on an sqlite3_file
1.2051 -** for unix.
1.2052 -*/
1.2053 -static const sqlite3_io_methods sqlite3UnixIoMethod = {
1.2054 - 1, /* iVersion */
1.2055 - unixClose,
1.2056 - unixRead,
1.2057 - unixWrite,
1.2058 - unixTruncate,
1.2059 - unixSync,
1.2060 - unixFileSize,
1.2061 - unixLock,
1.2062 - unixUnlock,
1.2063 - unixCheckReservedLock,
1.2064 - unixFileControl,
1.2065 - unixSectorSize,
1.2066 - unixDeviceCharacteristics
1.2067 -};
1.2068 -
1.2069 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.2070 -/*
1.2071 -** This vector defines all the methods that can operate on an sqlite3_file
1.2072 -** for unix with AFP style file locking.
1.2073 -*/
1.2074 -static const sqlite3_io_methods sqlite3AFPLockingUnixIoMethod = {
1.2075 - 1, /* iVersion */
1.2076 - unixClose,
1.2077 - unixRead,
1.2078 - unixWrite,
1.2079 - unixTruncate,
1.2080 - unixSync,
1.2081 - unixFileSize,
1.2082 - afpUnixLock,
1.2083 - afpUnixUnlock,
1.2084 - afpUnixCheckReservedLock,
1.2085 - unixFileControl,
1.2086 - unixSectorSize,
1.2087 - unixDeviceCharacteristics
1.2088 -};
1.2089 -
1.2090 -/*
1.2091 -** This vector defines all the methods that can operate on an sqlite3_file
1.2092 -** for unix with flock() style file locking.
1.2093 -*/
1.2094 -static const sqlite3_io_methods sqlite3FlockLockingUnixIoMethod = {
1.2095 - 1, /* iVersion */
1.2096 - flockUnixClose,
1.2097 - unixRead,
1.2098 - unixWrite,
1.2099 - unixTruncate,
1.2100 - unixSync,
1.2101 - unixFileSize,
1.2102 - flockUnixLock,
1.2103 - flockUnixUnlock,
1.2104 - flockUnixCheckReservedLock,
1.2105 - unixFileControl,
1.2106 - unixSectorSize,
1.2107 - unixDeviceCharacteristics
1.2108 -};
1.2109 -
1.2110 -/*
1.2111 -** This vector defines all the methods that can operate on an sqlite3_file
1.2112 -** for unix with dotlock style file locking.
1.2113 -*/
1.2114 -static const sqlite3_io_methods sqlite3DotlockLockingUnixIoMethod = {
1.2115 - 1, /* iVersion */
1.2116 - dotlockUnixClose,
1.2117 - unixRead,
1.2118 - unixWrite,
1.2119 - unixTruncate,
1.2120 - unixSync,
1.2121 - unixFileSize,
1.2122 - dotlockUnixLock,
1.2123 - dotlockUnixUnlock,
1.2124 - dotlockUnixCheckReservedLock,
1.2125 - unixFileControl,
1.2126 - unixSectorSize,
1.2127 - unixDeviceCharacteristics
1.2128 -};
1.2129 -
1.2130 -/*
1.2131 -** This vector defines all the methods that can operate on an sqlite3_file
1.2132 -** for unix with dotlock style file locking.
1.2133 -*/
1.2134 -static const sqlite3_io_methods sqlite3NolockLockingUnixIoMethod = {
1.2135 - 1, /* iVersion */
1.2136 - nolockUnixClose,
1.2137 - unixRead,
1.2138 - unixWrite,
1.2139 - unixTruncate,
1.2140 - unixSync,
1.2141 - unixFileSize,
1.2142 - nolockUnixLock,
1.2143 - nolockUnixUnlock,
1.2144 - nolockUnixCheckReservedLock,
1.2145 - unixFileControl,
1.2146 - unixSectorSize,
1.2147 - unixDeviceCharacteristics
1.2148 -};
1.2149 -
1.2150 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.2151 -
1.2152 -/*
1.2153 -** Allocate memory for a new unixFile and initialize that unixFile.
1.2154 -** Write a pointer to the new unixFile into *pId.
1.2155 -** If we run out of memory, close the file and return an error.
1.2156 -*/
1.2157 -#ifdef SQLITE_ENABLE_LOCKING_STYLE
1.2158 -/*
1.2159 -** When locking extensions are enabled, the filepath and locking style
1.2160 -** are needed to determine the unixFile pMethod to use for locking operations.
1.2161 -** The locking-style specific lockingContext data structure is created
1.2162 -** and assigned here also.
1.2163 -*/
1.2164 -static int fillInUnixFile(
1.2165 - int h, /* Open file descriptor of file being opened */
1.2166 - int dirfd, /* Directory file descriptor */
1.2167 - sqlite3_file *pId, /* Write completed initialization here */
1.2168 - const char *zFilename, /* Name of the file being opened */
1.2169 -){
1.2170 - sqlite3LockingStyle lockingStyle;
1.2171 - unixFile *pNew = (unixFile *)pId;
1.2172 - int rc;
1.2173 -
1.2174 - memset(pNew, 0, sizeof(unixFile));
1.2175 - lockingStyle = sqlite3DetectLockingStyle(zFilename, h);
1.2176 - if ( lockingStyle == posixLockingStyle ) {
1.2177 - enterMutex();
1.2178 - rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen);
1.2179 - leaveMutex();
1.2180 - if( rc ){
1.2181 - close(h);
1.2182 - unlink(zFilename);
1.2183 - return SQLITE_NOMEM;
1.2184 - }
1.2185 - } else {
1.2186 - /* pLock and pOpen are only used for posix advisory locking */
1.2187 - pNew->pLock = NULL;
1.2188 - pNew->pOpen = NULL;
1.2189 - }
1.2190 - pNew->dirfd = -1;
1.2191 - pNew->h = h;
1.2192 - SET_THREADID(pNew);
1.2193 - pNew = sqlite3_malloc( sizeof(unixFile) );
1.2194 - if( pNew==0 ){
1.2195 - close(h);
1.2196 - enterMutex();
1.2197 - releaseLockInfo(pNew->pLock);
1.2198 - releaseOpenCnt(pNew->pOpen);
1.2199 - leaveMutex();
1.2200 - return SQLITE_NOMEM;
1.2201 - }else{
1.2202 - switch(lockingStyle) {
1.2203 - case afpLockingStyle: {
1.2204 - /* afp locking uses the file path so it needs to be included in
1.2205 - ** the afpLockingContext */
1.2206 - int nFilename;
1.2207 - pNew->pMethod = &sqlite3AFPLockingUnixIoMethod;
1.2208 - pNew->lockingContext =
1.2209 - sqlite3_malloc(sizeof(afpLockingContext));
1.2210 - nFilename = strlen(zFilename)+1;
1.2211 - ((afpLockingContext *)pNew->lockingContext)->filePath =
1.2212 - sqlite3_malloc(nFilename);
1.2213 - memcpy(((afpLockingContext *)pNew->lockingContext)->filePath,
1.2214 - zFilename, nFilename);
1.2215 - srandomdev();
1.2216 - break;
1.2217 - }
1.2218 - case flockLockingStyle:
1.2219 - /* flock locking doesn't need additional lockingContext information */
1.2220 - pNew->pMethod = &sqlite3FlockLockingUnixIoMethod;
1.2221 - break;
1.2222 - case dotlockLockingStyle: {
1.2223 - /* dotlock locking uses the file path so it needs to be included in
1.2224 - ** the dotlockLockingContext */
1.2225 - int nFilename;
1.2226 - pNew->pMethod = &sqlite3DotlockLockingUnixIoMethod;
1.2227 - pNew->lockingContext = sqlite3_malloc(
1.2228 - sizeof(dotlockLockingContext));
1.2229 - nFilename = strlen(zFilename) + 6;
1.2230 - ((dotlockLockingContext *)pNew->lockingContext)->lockPath =
1.2231 - sqlite3_malloc( nFilename );
1.2232 - sqlite3_snprintf(nFilename,
1.2233 - ((dotlockLockingContext *)pNew->lockingContext)->lockPath,
1.2234 - "%s.lock", zFilename);
1.2235 - break;
1.2236 - }
1.2237 - case posixLockingStyle:
1.2238 - /* posix locking doesn't need additional lockingContext information */
1.2239 - pNew->pMethod = &sqlite3UnixIoMethod;
1.2240 - break;
1.2241 - case noLockingStyle:
1.2242 - case unsupportedLockingStyle:
1.2243 - default:
1.2244 - pNew->pMethod = &sqlite3NolockLockingUnixIoMethod;
1.2245 - }
1.2246 - OpenCounter(+1);
1.2247 - return SQLITE_OK;
1.2248 - }
1.2249 -}
1.2250 -#else /* SQLITE_ENABLE_LOCKING_STYLE */
1.2251 -static int fillInUnixFile(
1.2252 - int h, /* Open file descriptor on file being opened */
1.2253 - int dirfd,
1.2254 - sqlite3_file *pId, /* Write to the unixFile structure here */
1.2255 - const char *zFilename /* Name of the file being opened */
1.2256 -){
1.2257 - unixFile *pNew = (unixFile *)pId;
1.2258 - int rc;
1.2259 -
1.2260 -#ifdef FD_CLOEXEC
1.2261 - fcntl(h, F_SETFD, fcntl(h, F_GETFD, 0) | FD_CLOEXEC);
1.2262 -#endif
1.2263 -
1.2264 - enterMutex();
1.2265 - rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen);
1.2266 - leaveMutex();
1.2267 - if( rc ){
1.2268 - close(h);
1.2269 - return SQLITE_NOMEM;
1.2270 - }
1.2271 -
1.2272 - OSTRACE3("OPEN %-3d %s\n", h, zFilename);
1.2273 - pNew->dirfd = -1;
1.2274 - pNew->h = h;
1.2275 - pNew->dirfd = dirfd;
1.2276 - SET_THREADID(pNew);
1.2277 -
1.2278 - pNew->pMethod = &sqlite3UnixIoMethod;
1.2279 - OpenCounter(+1);
1.2280 - return SQLITE_OK;
1.2281 -}
1.2282 -#endif /* SQLITE_ENABLE_LOCKING_STYLE */
1.2283 -
1.2284 -/*
1.2285 -** Open a file descriptor to the directory containing file zFilename.
1.2286 -** If successful, *pFd is set to the opened file descriptor and
1.2287 -** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM
1.2288 -** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined
1.2289 -** value.
1.2290 -**
1.2291 -** If SQLITE_OK is returned, the caller is responsible for closing
1.2292 -** the file descriptor *pFd using close().
1.2293 -*/
1.2294 -static int openDirectory(const char *zFilename, int *pFd){
1.2295 - int ii;
1.2296 - int fd = -1;
1.2297 - char zDirname[MAX_PATHNAME+1];
1.2298 -
1.2299 - sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename);
1.2300 - for(ii=strlen(zDirname); ii>=0 && zDirname[ii]!='/'; ii--);
1.2301 - if( ii>0 ){
1.2302 - zDirname[ii] = '\0';
1.2303 - fd = open(zDirname, O_RDONLY|O_BINARY, 0);
1.2304 - if( fd>=0 ){
1.2305 -#ifdef FD_CLOEXEC
1.2306 - fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
1.2307 -#endif
1.2308 - OSTRACE3("OPENDIR %-3d %s\n", fd, zDirname);
1.2309 - }
1.2310 - }
1.2311 - *pFd = fd;
1.2312 - return (fd>=0?SQLITE_OK:SQLITE_CANTOPEN);
1.2313 -}
1.2314 -
1.2315 -/*
1.2316 -** Open the file zPath.
1.2317 -**
1.2318 -** Previously, the SQLite OS layer used three functions in place of this
1.2319 -** one:
1.2320 -**
1.2321 -** sqlite3OsOpenReadWrite();
1.2322 -** sqlite3OsOpenReadOnly();
1.2323 -** sqlite3OsOpenExclusive();
1.2324 -**
1.2325 -** These calls correspond to the following combinations of flags:
1.2326 -**
1.2327 -** ReadWrite() -> (READWRITE | CREATE)
1.2328 -** ReadOnly() -> (READONLY)
1.2329 -** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE)
1.2330 -**
1.2331 -** The old OpenExclusive() accepted a boolean argument - "delFlag". If
1.2332 -** true, the file was configured to be automatically deleted when the
1.2333 -** file handle closed. To achieve the same effect using this new
1.2334 -** interface, add the DELETEONCLOSE flag to those specified above for
1.2335 -** OpenExclusive().
1.2336 -*/
1.2337 -static int unixOpen(
1.2338 - sqlite3_vfs *pVfs,
1.2339 - const char *zPath,
1.2340 - sqlite3_file *pFile,
1.2341 - int flags,
1.2342 - int *pOutFlags
1.2343 -){
1.2344 - int fd = 0; /* File descriptor returned by open() */
1.2345 - int dirfd = -1; /* Directory file descriptor */
1.2346 - int oflags = 0; /* Flags to pass to open() */
1.2347 - int eType = flags&0xFFFFFF00; /* Type of file to open */
1.2348 -
1.2349 - int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
1.2350 - int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE);
1.2351 - int isCreate = (flags & SQLITE_OPEN_CREATE);
1.2352 - int isReadonly = (flags & SQLITE_OPEN_READONLY);
1.2353 - int isReadWrite = (flags & SQLITE_OPEN_READWRITE);
1.2354 -
1.2355 - /* If creating a master or main-file journal, this function will open
1.2356 - ** a file-descriptor on the directory too. The first time unixSync()
1.2357 - ** is called the directory file descriptor will be fsync()ed and close()d.
1.2358 - */
1.2359 - int isOpenDirectory = (isCreate &&
1.2360 - (eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL)
1.2361 - );
1.2362 -
1.2363 - /* Check the following statements are true:
1.2364 - **
1.2365 - ** (a) Exactly one of the READWRITE and READONLY flags must be set, and
1.2366 - ** (b) if CREATE is set, then READWRITE must also be set, and
1.2367 - ** (c) if EXCLUSIVE is set, then CREATE must also be set.
1.2368 - ** (d) if DELETEONCLOSE is set, then CREATE must also be set.
1.2369 - */
1.2370 - assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly));
1.2371 - assert(isCreate==0 || isReadWrite);
1.2372 - assert(isExclusive==0 || isCreate);
1.2373 - assert(isDelete==0 || isCreate);
1.2374 -
1.2375 -
1.2376 - /* The main DB, main journal, and master journal are never automatically
1.2377 - ** deleted
1.2378 - */
1.2379 - assert( eType!=SQLITE_OPEN_MAIN_DB || !isDelete );
1.2380 - assert( eType!=SQLITE_OPEN_MAIN_JOURNAL || !isDelete );
1.2381 - assert( eType!=SQLITE_OPEN_MASTER_JOURNAL || !isDelete );
1.2382 -
1.2383 - /* Assert that the upper layer has set one of the "file-type" flags. */
1.2384 - assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
1.2385 - || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL
1.2386 - || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL
1.2387 - || eType==SQLITE_OPEN_TRANSIENT_DB
1.2388 - );
1.2389 -
1.2390 - if( isReadonly ) oflags |= O_RDONLY;
1.2391 - if( isReadWrite ) oflags |= O_RDWR;
1.2392 - if( isCreate ) oflags |= O_CREAT;
1.2393 - if( isExclusive ) oflags |= (O_EXCL|O_NOFOLLOW);
1.2394 - oflags |= (O_LARGEFILE|O_BINARY);
1.2395 -
1.2396 - memset(pFile, 0, sizeof(unixFile));
1.2397 - fd = open(zPath, oflags, isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS);
1.2398 - if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){
1.2399 - /* Failed to open the file for read/write access. Try read-only. */
1.2400 - flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
1.2401 - flags |= SQLITE_OPEN_READONLY;
1.2402 - return unixOpen(pVfs, zPath, pFile, flags, pOutFlags);
1.2403 - }
1.2404 - if( fd<0 ){
1.2405 - return SQLITE_CANTOPEN;
1.2406 - }
1.2407 - if( isDelete ){
1.2408 - unlink(zPath);
1.2409 - }
1.2410 - if( pOutFlags ){
1.2411 - *pOutFlags = flags;
1.2412 - }
1.2413 -
1.2414 - assert(fd!=0);
1.2415 - if( isOpenDirectory ){
1.2416 - int rc = openDirectory(zPath, &dirfd);
1.2417 - if( rc!=SQLITE_OK ){
1.2418 - close(fd);
1.2419 - return rc;
1.2420 - }
1.2421 - }
1.2422 - return fillInUnixFile(fd, dirfd, pFile, zPath);
1.2423 -}
1.2424 -
1.2425 -/*
1.2426 -** Delete the file at zPath. If the dirSync argument is true, fsync()
1.2427 -** the directory after deleting the file.
1.2428 -*/
1.2429 -static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
1.2430 - int rc = SQLITE_OK;
1.2431 - SimulateIOError(return SQLITE_IOERR_DELETE);
1.2432 - unlink(zPath);
1.2433 - if( dirSync ){
1.2434 - int fd;
1.2435 - rc = openDirectory(zPath, &fd);
1.2436 - if( rc==SQLITE_OK ){
1.2437 - if( fsync(fd) ){
1.2438 - rc = SQLITE_IOERR_DIR_FSYNC;
1.2439 - }
1.2440 - close(fd);
1.2441 - }
1.2442 - }
1.2443 - return rc;
1.2444 -}
1.2445 -
1.2446 -/*
1.2447 -** Test the existance of or access permissions of file zPath. The
1.2448 -** test performed depends on the value of flags:
1.2449 -**
1.2450 -** SQLITE_ACCESS_EXISTS: Return 1 if the file exists
1.2451 -** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable.
1.2452 -** SQLITE_ACCESS_READONLY: Return 1 if the file is readable.
1.2453 -**
1.2454 -** Otherwise return 0.
1.2455 -*/
1.2456 -static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){
1.2457 - int amode = 0;
1.2458 - switch( flags ){
1.2459 - case SQLITE_ACCESS_EXISTS:
1.2460 - amode = F_OK;
1.2461 - break;
1.2462 - case SQLITE_ACCESS_READWRITE:
1.2463 - amode = W_OK|R_OK;
1.2464 - break;
1.2465 - case SQLITE_ACCESS_READ:
1.2466 - amode = R_OK;
1.2467 - break;
1.2468 -
1.2469 - default:
1.2470 - assert(!"Invalid flags argument");
1.2471 - }
1.2472 - return (access(zPath, amode)==0);
1.2473 -}
1.2474 -
1.2475 -/*
1.2476 -** Create a temporary file name in zBuf. zBuf must be allocated
1.2477 -** by the calling process and must be big enough to hold at least
1.2478 -** pVfs->mxPathname bytes.
1.2479 -*/
1.2480 -static int unixGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
1.2481 - static const char *azDirs[] = {
1.2482 - 0,
1.2483 - "/var/tmp",
1.2484 - "/usr/tmp",
1.2485 - "/tmp",
1.2486 - ".",
1.2487 - };
1.2488 - static const unsigned char zChars[] =
1.2489 - "abcdefghijklmnopqrstuvwxyz"
1.2490 - "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1.2491 - "0123456789";
1.2492 - int i, j;
1.2493 - struct stat buf;
1.2494 - const char *zDir = ".";
1.2495 -
1.2496 - /* It's odd to simulate an io-error here, but really this is just
1.2497 - ** using the io-error infrastructure to test that SQLite handles this
1.2498 - ** function failing.
1.2499 - */
1.2500 - SimulateIOError( return SQLITE_ERROR );
1.2501 -
1.2502 - azDirs[0] = sqlite3_temp_directory;
1.2503 - for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
1.2504 - if( azDirs[i]==0 ) continue;
1.2505 - if( stat(azDirs[i], &buf) ) continue;
1.2506 - if( !S_ISDIR(buf.st_mode) ) continue;
1.2507 - if( access(azDirs[i], 07) ) continue;
1.2508 - zDir = azDirs[i];
1.2509 - break;
1.2510 - }
1.2511 - do{
1.2512 - assert( pVfs->mxPathname==MAX_PATHNAME );
1.2513 - assert( nBuf>=MAX_PATHNAME );
1.2514 - sqlite3_snprintf(MAX_PATHNAME-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir);
1.2515 - j = strlen(zBuf);
1.2516 - sqlite3Randomness(15, &zBuf[j]);
1.2517 - for(i=0; i<15; i++, j++){
1.2518 - zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
1.2519 - }
1.2520 - zBuf[j] = 0;
1.2521 - }while( access(zBuf,0)==0 );
1.2522 - return SQLITE_OK;
1.2523 -}
1.2524 -
1.2525 -
1.2526 -/*
1.2527 -** Turn a relative pathname into a full pathname. The relative path
1.2528 -** is stored as a nul-terminated string in the buffer pointed to by
1.2529 -** zPath.
1.2530 -**
1.2531 -** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes
1.2532 -** (in this case, MAX_PATHNAME bytes). The full-path is written to
1.2533 -** this buffer before returning.
1.2534 -*/
1.2535 -static int unixFullPathname(
1.2536 - sqlite3_vfs *pVfs, /* Pointer to vfs object */
1.2537 - const char *zPath, /* Possibly relative input path */
1.2538 - int nOut, /* Size of output buffer in bytes */
1.2539 - char *zOut /* Output buffer */
1.2540 -){
1.2541 -
1.2542 - /* It's odd to simulate an io-error here, but really this is just
1.2543 - ** using the io-error infrastructure to test that SQLite handles this
1.2544 - ** function failing. This function could fail if, for example, the
1.2545 - ** current working directly has been unlinked.
1.2546 - */
1.2547 - SimulateIOError( return SQLITE_ERROR );
1.2548 -
1.2549 - assert( pVfs->mxPathname==MAX_PATHNAME );
1.2550 - zOut[MAX_PATHNAME-1] = '\0';
1.2551 - if( zPath[0]=='/' ){
1.2552 - sqlite3_snprintf(MAX_PATHNAME, zOut, "%s", zPath);
1.2553 - }else{
1.2554 - int nCwd;
1.2555 - if( getcwd(zOut, MAX_PATHNAME-1)==0 ){
1.2556 - return SQLITE_CANTOPEN;
1.2557 - }
1.2558 - nCwd = strlen(zOut);
1.2559 - sqlite3_snprintf(MAX_PATHNAME-nCwd, &zOut[nCwd], "/%s", zPath);
1.2560 - }
1.2561 - return SQLITE_OK;
1.2562 -
1.2563 -#if 0
1.2564 - /*
1.2565 - ** Remove "/./" path elements and convert "/A/./" path elements
1.2566 - ** to just "/".
1.2567 - */
1.2568 - if( zFull ){
1.2569 - int i, j;
1.2570 - for(i=j=0; zFull[i]; i++){
1.2571 - if( zFull[i]=='/' ){
1.2572 - if( zFull[i+1]=='/' ) continue;
1.2573 - if( zFull[i+1]=='.' && zFull[i+2]=='/' ){
1.2574 - i += 1;
1.2575 - continue;
1.2576 - }
1.2577 - if( zFull[i+1]=='.' && zFull[i+2]=='.' && zFull[i+3]=='/' ){
1.2578 - while( j>0 && zFull[j-1]!='/' ){ j--; }
1.2579 - i += 3;
1.2580 - continue;
1.2581 - }
1.2582 - }
1.2583 - zFull[j++] = zFull[i];
1.2584 - }
1.2585 - zFull[j] = 0;
1.2586 - }
1.2587 -#endif
1.2588 -}
1.2589 -
1.2590 -
1.2591 -#ifndef SQLITE_OMIT_LOAD_EXTENSION
1.2592 -/*
1.2593 -** Interfaces for opening a shared library, finding entry points
1.2594 -** within the shared library, and closing the shared library.
1.2595 -*/
1.2596 -#include <dlfcn.h>
1.2597 -static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
1.2598 - return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL);
1.2599 -}
1.2600 -
1.2601 -/*
1.2602 -** SQLite calls this function immediately after a call to unixDlSym() or
1.2603 -** unixDlOpen() fails (returns a null pointer). If a more detailed error
1.2604 -** message is available, it is written to zBufOut. If no error message
1.2605 -** is available, zBufOut is left unmodified and SQLite uses a default
1.2606 -** error message.
1.2607 -*/
1.2608 -static void unixDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
1.2609 - char *zErr;
1.2610 - enterMutex();
1.2611 - zErr = dlerror();
1.2612 - if( zErr ){
1.2613 - sqlite3_snprintf(nBuf, zBufOut, "%s", zErr);
1.2614 - }
1.2615 - leaveMutex();
1.2616 -}
1.2617 -static void *unixDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
1.2618 - return dlsym(pHandle, zSymbol);
1.2619 -}
1.2620 -static void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){
1.2621 - dlclose(pHandle);
1.2622 -}
1.2623 -#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
1.2624 - #define unixDlOpen 0
1.2625 - #define unixDlError 0
1.2626 - #define unixDlSym 0
1.2627 - #define unixDlClose 0
1.2628 -#endif
1.2629 -
1.2630 -/*
1.2631 -** Write nBuf bytes of random data to the supplied buffer zBuf.
1.2632 -*/
1.2633 -static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
1.2634 -
1.2635 - assert(nBuf>=(sizeof(time_t)+sizeof(int)));
1.2636 -
1.2637 - /* We have to initialize zBuf to prevent valgrind from reporting
1.2638 - ** errors. The reports issued by valgrind are incorrect - we would
1.2639 - ** prefer that the randomness be increased by making use of the
1.2640 - ** uninitialized space in zBuf - but valgrind errors tend to worry
1.2641 - ** some users. Rather than argue, it seems easier just to initialize
1.2642 - ** the whole array and silence valgrind, even if that means less randomness
1.2643 - ** in the random seed.
1.2644 - **
1.2645 - ** When testing, initializing zBuf[] to zero is all we do. That means
1.2646 - ** that we always use the same random number sequence. This makes the
1.2647 - ** tests repeatable.
1.2648 - */
1.2649 - memset(zBuf, 0, nBuf);
1.2650 -#if !defined(SQLITE_TEST)
1.2651 - {
1.2652 - int pid, fd;
1.2653 - fd = open("/dev/urandom", O_RDONLY);
1.2654 - if( fd<0 ){
1.2655 - time_t t;
1.2656 - time(&t);
1.2657 - memcpy(zBuf, &t, sizeof(t));
1.2658 - pid = getpid();
1.2659 - memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid));
1.2660 - }else{
1.2661 - read(fd, zBuf, nBuf);
1.2662 - close(fd);
1.2663 - }
1.2664 - }
1.2665 -#endif
1.2666 - return SQLITE_OK;
1.2667 -}
1.2668 -
1.2669 -
1.2670 -/*
1.2671 -** Sleep for a little while. Return the amount of time slept.
1.2672 -** The argument is the number of microseconds we want to sleep.
1.2673 -** The return value is the number of microseconds of sleep actually
1.2674 -** requested from the underlying operating system, a number which
1.2675 -** might be greater than or equal to the argument, but not less
1.2676 -** than the argument.
1.2677 -*/
1.2678 -static int unixSleep(sqlite3_vfs *pVfs, int microseconds){
1.2679 -#if defined(HAVE_USLEEP) && HAVE_USLEEP
1.2680 - usleep(microseconds);
1.2681 - return microseconds;
1.2682 -#else
1.2683 - int seconds = (microseconds+999999)/1000000;
1.2684 - sleep(seconds);
1.2685 - return seconds*1000000;
1.2686 -#endif
1.2687 -}
1.2688 -
1.2689 -/*
1.2690 -** The following variable, if set to a non-zero value, becomes the result
1.2691 -** returned from sqlite3OsCurrentTime(). This is used for testing.
1.2692 -*/
1.2693 -#ifdef SQLITE_TEST
1.2694 -int sqlite3_current_time = 0;
1.2695 -#endif
1.2696 -
1.2697 -/*
1.2698 -** Find the current time (in Universal Coordinated Time). Write the
1.2699 -** current time and date as a Julian Day number into *prNow and
1.2700 -** return 0. Return 1 if the time and date cannot be found.
1.2701 -*/
1.2702 -static int unixCurrentTime(sqlite3_vfs *pVfs, double *prNow){
1.2703 -#ifdef NO_GETTOD
1.2704 - time_t t;
1.2705 - time(&t);
1.2706 - *prNow = t/86400.0 + 2440587.5;
1.2707 -#else
1.2708 - struct timeval sNow;
1.2709 - gettimeofday(&sNow, 0);
1.2710 - *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0;
1.2711 -#endif
1.2712 -#ifdef SQLITE_TEST
1.2713 - if( sqlite3_current_time ){
1.2714 - *prNow = sqlite3_current_time/86400.0 + 2440587.5;
1.2715 - }
1.2716 -#endif
1.2717 - return 0;
1.2718 -}
1.2719 -
1.2720 -/*
1.2721 -** Return a pointer to the sqlite3DefaultVfs structure. We use
1.2722 -** a function rather than give the structure global scope because
1.2723 -** some compilers (MSVC) do not allow forward declarations of
1.2724 -** initialized structures.
1.2725 -*/
1.2726 -sqlite3_vfs *sqlite3OsDefaultVfs(void){
1.2727 - static sqlite3_vfs unixVfs = {
1.2728 - 1, /* iVersion */
1.2729 - sizeof(unixFile), /* szOsFile */
1.2730 - MAX_PATHNAME, /* mxPathname */
1.2731 - 0, /* pNext */
1.2732 - "unix", /* zName */
1.2733 - 0, /* pAppData */
1.2734 -
1.2735 - unixOpen, /* xOpen */
1.2736 - unixDelete, /* xDelete */
1.2737 - unixAccess, /* xAccess */
1.2738 - unixGetTempname, /* xGetTempName */
1.2739 - unixFullPathname, /* xFullPathname */
1.2740 - unixDlOpen, /* xDlOpen */
1.2741 - unixDlError, /* xDlError */
1.2742 - unixDlSym, /* xDlSym */
1.2743 - unixDlClose, /* xDlClose */
1.2744 - unixRandomness, /* xRandomness */
1.2745 - unixSleep, /* xSleep */
1.2746 - unixCurrentTime /* xCurrentTime */
1.2747 - };
1.2748 -
1.2749 - return &unixVfs;
1.2750 -}
1.2751 -
1.2752 -#endif /* OS_UNIX */