extensions/sqlite/sqlite-source/os_unix.c
changeset 1952 b7aa2b626807
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/extensions/sqlite/sqlite-source/os_unix.c	Sun Mar 30 07:00:22 2008 +0000
     1.3 @@ -0,0 +1,2749 @@
     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 */