diff options
author | drh <drh@noemail.net> | 2007-08-24 03:51:33 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2007-08-24 03:51:33 +0000 |
commit | 153c62c461b4f330f642eb63db517597348c0e82 (patch) | |
tree | 996af405e48778f63c5c3918eff0611391c042eb /src/os_unix.c | |
parent | bae37537b0b6982b59ae1cb6841ed4ba919c3dee (diff) | |
download | sqlite-153c62c461b4f330f642eb63db517597348c0e82.tar.gz sqlite-153c62c461b4f330f642eb63db517597348c0e82.zip |
The win32 driver compiles but does not yet work well. Many bugs
fixed. (CVS 4282)
FossilOrigin-Name: 3a68fcddfa9184e4b310ce0a21312c54b9462ec8
Diffstat (limited to 'src/os_unix.c')
-rw-r--r-- | src/os_unix.c | 116 |
1 files changed, 56 insertions, 60 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index eb7a66b64..4287e2351 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -109,13 +109,6 @@ struct unixFile { #include "os_common.h" /* -** Do not include any of the File I/O interface procedures if the -** SQLITE_OMIT_DISKIO macro is defined (indicating that the database -** will be in-memory only) -*/ -#ifndef SQLITE_OMIT_DISKIO - -/* ** Define various macros that are missing from some systems. */ #ifndef O_LARGEFILE @@ -2300,12 +2293,6 @@ static int fillInUnixFile( } #endif /* SQLITE_ENABLE_LOCKING_STYLE */ -#endif /* SQLITE_OMIT_DISKIO */ -/*************************************************************************** -** Everything above deals with file I/O. Everything that follows deals -** with other miscellanous aspects of the operating system interface -****************************************************************************/ - /* ** Open a file descriptor to the directory containing file zFilename. ** If successful, *pFd is set to the opened file descriptor and @@ -2321,8 +2308,7 @@ static int openDirectory(const char *zFilename, int *pFd){ int fd; char zDirname[MAX_PATHNAME+1]; - strncpy(zDirname, zFilename, MAX_PATHNAME); - zDirname[MAX_PATHNAME-1] = '\0'; + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); for(ii=strlen(zDirname); ii>=0 && zDirname[ii]!='/'; ii--); if( ii>0 ){ zDirname[ii] = '\0'; @@ -2361,7 +2347,7 @@ static int openDirectory(const char *zFilename, int *pFd){ ** OpenExclusive(). */ static int unixOpen( - void *pNotUsed, + sqlite3_vfs *pVfs, const char *zPath, sqlite3_file *pFile, int flags, @@ -2414,7 +2400,7 @@ static int unixOpen( /* Failed to open the file for read/write access. Try read-only. */ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); flags |= SQLITE_OPEN_READONLY; - return unixOpen(pNotUsed, zPath, pFile, flags, pOutFlags); + return unixOpen(pVfs, zPath, pFile, flags, pOutFlags); } if( fd<0 ){ return SQLITE_CANTOPEN; @@ -2441,7 +2427,7 @@ static int unixOpen( ** Delete the file at zPath. If the dirSync argument is true, fsync() ** the directory after deleting the file. */ -static int unixDelete(void *pNotUsed, const char *zPath, int dirSync){ +static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ int rc = SQLITE_OK; SimulateIOError(return SQLITE_IOERR_DELETE); unlink(zPath); @@ -2468,7 +2454,7 @@ static int unixDelete(void *pNotUsed, const char *zPath, int dirSync){ ** ** Otherwise return 0. */ -static int unixAccess(void *pNotUsed, const char *zPath, int flags){ +static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){ int amode; switch( flags ){ case SQLITE_ACCESS_EXISTS: @@ -2488,10 +2474,11 @@ static int unixAccess(void *pNotUsed, const char *zPath, int flags){ } /* -** Create a temporary file name in zBuf. zBuf must be big enough to -** hold at least MAX_PATHNAME characters. +** Create a temporary file name in zBuf. zBuf must be allocated +** by the calling process and must be big enough to hold at least +** pVfs->mxPathname bytes. */ -static int unixGetTempName(void *pNotUsed, char *zBuf){ +static int unixGetTempName(sqlite3_vfs *pVfs, char *zBuf){ static const char *azDirs[] = { 0, "/var/tmp", @@ -2516,7 +2503,8 @@ static int unixGetTempName(void *pNotUsed, char *zBuf){ break; } do{ - sqlite3_snprintf(MAX_PATHNAME-17, zBuf, "%s/"TEMP_FILE_PREFIX, zDir); + assert( pVfs->mxPathname==MAX_PATHNAME ); + sqlite3_snprintf(MAX_PATHNAME-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); j = strlen(zBuf); sqlite3Randomness(15, &zBuf[j]); for(i=0; i<15; i++, j++){ @@ -2537,18 +2525,18 @@ static int unixGetTempName(void *pNotUsed, char *zBuf){ ** (in this case, MAX_PATHNAME bytes). The full-path is written to ** this buffer before returning. */ -static int unixFullPathname(void *pNotUsed, const char *zPath, char *zOut){ +static int unixFullPathname(sqlite3_vfs *pVfs, const char *zPath, char *zOut){ + assert( pVfs->mxPathname==MAX_PATHNAME ); zOut[MAX_PATHNAME-1] = '\0'; if( zPath[0]=='/' ){ - strncpy(zOut, zPath, MAX_PATHNAME-1); + sqlite3_snprintf(MAX_PATHNAME, zOut, "%s", zPath); }else{ int nCwd; if( getcwd(zOut, MAX_PATHNAME-1)==0 ){ return SQLITE_ERROR; } nCwd = strlen(zOut); - zOut[nCwd] = '/'; - strncpy(&zOut[nCwd+1], zPath, MAX_PATHNAME-1-nCwd-1); + sqlite3_snprintf(MAX_PATHNAME-nCwd, &zOut[nCwd], "/%s", zPath); } return SQLITE_OK; @@ -2586,25 +2574,24 @@ static int unixFullPathname(void *pNotUsed, const char *zPath, char *zOut){ ** within the shared library, and closing the shared library. */ #include <dlfcn.h> -static void *unixDlOpen(void *pNotUsed, const char *zFilename){ +static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); } -static void unixDlError(void *pNotUsed, int nBuf, char *zBufOut){ +static void unixDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ char *zErr; enterMutex(); zErr = dlerror(); if( zErr ){ - strncpy(zBufOut, zErr, nBuf-1); - zBufOut[nBuf-1] = '\0'; + sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); }else if(nBuf>0) { zBufOut[0] = '\0'; } leaveMutex(); } -void *unixDlSym(void *pHandle, const char *zSymbol){ +void *unixDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ return dlsym(pHandle, zSymbol); } -void unixDlClose(void *pHandle){ +void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){ dlclose(pHandle); } #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ @@ -2617,7 +2604,7 @@ void unixDlClose(void *pHandle){ /* ** Write nBuf bytes of random data to the supplied buffer zBuf. */ -static int unixRandomness(void *pNotUsed, int nBuf, char *zBuf){ +static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ assert(nBuf>=(sizeof(time_t)+sizeof(int))); @@ -2662,7 +2649,7 @@ static int unixRandomness(void *pNotUsed, int nBuf, char *zBuf){ ** might be greater than or equal to the argument, but not less ** than the argument. */ -static int unixSleep(void *pNotUsed, int microseconds){ +static int unixSleep(sqlite3_vfs *pVfs, int microseconds){ #if defined(HAVE_USLEEP) && HAVE_USLEEP usleep(microseconds); return microseconds; @@ -2686,7 +2673,7 @@ int sqlite3_current_time = 0; ** current time and date as a Julian Day number into *prNow and ** return 0. Return 1 if the time and date cannot be found. */ -static int unixCurrentTime(void *pNotUsed, double *prNow){ +static int unixCurrentTime(sqlite3_vfs *pVfs, double *prNow){ #ifdef NO_GETTOD time_t t; time(&t); @@ -2704,29 +2691,38 @@ static int unixCurrentTime(void *pNotUsed, double *prNow){ return 0; } - -sqlite3_vfs sqlite3DefaultVfs = { - 1, /* iVersion */ - sizeof(unixFile), /* szOsFile */ - MAX_PATHNAME, /* mxPathname */ - 0, /* nRef */ - 0, /* vfsMutex */ - 0, /* pNext */ - "unix", /* zName */ - 0, /* pAppData */ - - unixOpen, /* xOpen */ - unixDelete, /* xDelete */ - unixAccess, /* xAccess */ - unixGetTempName, /* xGetTempName */ - unixFullPathname, /* xFullPathname */ - unixDlOpen, /* xDlOpen */ - unixDlError, /* xDlError */ - unixDlSym, /* xDlSym */ - unixDlClose, /* xDlClose */ - unixRandomness, /* xRandomness */ - unixSleep, /* xSleep */ - unixCurrentTime /* xCurrentTime */ -}; +/* +** Return a pointer to the sqlite3DefaultVfs structure. We use +** a function rather than give the structure global scope because +** some compilers (MSVC) do not allow forward declarations of +** initialized structures. +*/ +sqlite3_vfs *sqlite3OsDefaultVfs(void){ + static sqlite3_vfs unixVfs = { + 1, /* iVersion */ + sizeof(unixFile), /* szOsFile */ + MAX_PATHNAME, /* mxPathname */ + 0, /* nRef */ + 0, /* vfsMutex */ + 0, /* pNext */ + "unix", /* zName */ + 0, /* pAppData */ + + unixOpen, /* xOpen */ + unixDelete, /* xDelete */ + unixAccess, /* xAccess */ + unixGetTempName, /* xGetTempName */ + unixFullPathname, /* xFullPathname */ + unixDlOpen, /* xDlOpen */ + unixDlError, /* xDlError */ + unixDlSym, /* xDlSym */ + unixDlClose, /* xDlClose */ + unixRandomness, /* xRandomness */ + unixSleep, /* xSleep */ + unixCurrentTime /* xCurrentTime */ + }; + + return &unixVfs; +} #endif /* OS_UNIX */ |