From: Andrew G. <ag...@us...> - 2005-04-14 18:57:53
|
Update of /cvsroot/zoolib/zoolib/src/platform/posix In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30874 Modified Files: ZFile_POSIX.cpp Log Message: Use the 64 bit entry points on Linux, and allow 64 bit offsets when off_t is not 4 bytes in length (presumably it's 8 bytes). Index: ZFile_POSIX.cpp =================================================================== RCS file: /cvsroot/zoolib/zoolib/src/platform/posix/ZFile_POSIX.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- ZFile_POSIX.cpp 8 Apr 2005 17:55:05 -0000 1.42 +++ ZFile_POSIX.cpp 14 Apr 2005 18:57:44 -0000 1.43 @@ -25,14 +25,11 @@ // Enable pread/pwrite. #define _XOPEN_SOURCE 500 -// Enable 64 bit variants of system calls. +// Enable 64 bit variants of system calls on Linux. We don't go the whole hog and +// use _FILE_OFFSET_BITS to do renaming of entry points and data types because I'd +// rather be explicit about which functions we're calling. #define _LARGEFILE64_SOURCE -// We don't want the regular types and entry points renamed. -// Eventually I'll beef up the ZStream API to support 64 bit -// offsets, at which time we can explicitly call the 64 bit versions. -//#define _FILE_OFFSET_BITS 64 - #include "ZFile_POSIX.h" #if ZCONFIG(API_File, POSIX) @@ -50,12 +47,6 @@ # define ZCONFIG_File_AtAPISupported 1 #endif -#if defined(linux) -# define ZCONFIG_File_64BitOffsets 1 -#else -# define ZCONFIG_File_64BitOffsets 0 -#endif - #include <dirent.h> #include <errno.h> #include <fcntl.h> @@ -66,10 +57,6 @@ using std::string; using std::vector; -#if ZCONFIG_File_64BitOffsets -ZAssertCompile(sizeof(off64_t) == sizeof(uint64)); -#endif - // ==================================================================================================== #pragma mark - #pragma mark * Shared implementation details @@ -171,10 +158,10 @@ static int sOpen(const char* iPath, bool iRead, bool iWrite, bool iPreventWriters, ZFile::Error* oErr) { - int theFlags = O_NOCTTY; - - #if ZCONFIG_File_64BitOffsets - theFlags |= O_LARGEFILE; + #if defined(linux) + int theFlags = O_NOCTTY | O_LARGEFILE; + #else + int theFlags = O_NOCTTY; #endif if (iRead && iWrite) @@ -219,7 +206,7 @@ static int sCreate(const char* iPath, bool iOpenExisting, bool iAllowRead, bool iPreventWriters, ZFile::Error* oErr) { - #if ZCONFIG_File_64BitOffsets + #if defined(linux) int flags = O_CREAT | O_NOCTTY | O_LARGEFILE; #else int flags = O_CREAT | O_NOCTTY; @@ -306,15 +293,17 @@ if (oCountRead) *oCountRead = 0; - if (!ZCONFIG_File_64BitOffsets && iOffset > 0x7FFFFFFFL) + #if !defined(linux) + if (sizeof(off_t) == 4 && iOffset > 0x7FFFFFFFL) return ZFile::errorGeneric; + #endif char* localDest = reinterpret_cast<char*>(iDest); uint64 localOffset = iOffset; size_t countRemaining = iCount; while (countRemaining > 0) { - #if ZCONFIG_File_64BitOffsets + #if defined(linux) ssize_t countRead = ::pread64(iFD, localDest, countRemaining, localOffset); #else ssize_t countRead = ::pread(iFD, localDest, countRemaining, localOffset); @@ -353,15 +342,17 @@ if (oCountWritten) *oCountWritten = 0; - if (!ZCONFIG_File_64BitOffsets && iOffset > 0x7FFFFFFFL) + #if !defined(linux) + if (sizeof(off_t) == 4 && iOffset > 0x7FFFFFFFL) return ZFile::errorGeneric; + #endif const char* localSource = reinterpret_cast<const char*>(iSource); uint64 localOffset = iOffset; size_t countRemaining = iCount; while (countRemaining > 0) { - #if ZCONFIG_File_64BitOffsets + #if defined(linux) ssize_t countWritten = ::pwrite64(iFD, localSource, countRemaining, localOffset); #else ssize_t countWritten = ::pwrite(iFD, localSource, countRemaining, localOffset); @@ -392,7 +383,12 @@ static ZFile::Error sGetPosition(int iFD, uint64& oPosition) { - off_t result = ::lseek(iFD, 0, SEEK_CUR); + #if defined(linux) + off64_t result = ::lseek64(iFD, 0, SEEK_CUR); + #else + off_t result = ::lseek(iFD, 0, SEEK_CUR); + #endif + if (result < 0) return sTranslateError(errno); oPosition = result; @@ -401,16 +397,29 @@ static ZFile::Error sSetPosition(int iFD, uint64 iPosition) { - if (::lseek(iFD, iPosition, SEEK_SET) < 0) - return sTranslateError(errno); + #if defined(linux) + if (::lseek64(iFD, iPosition, SEEK_SET) < 0) + return sTranslateError(errno); + #else + if (::lseek(iFD, iPosition, SEEK_SET) < 0) + return sTranslateError(errno); + #endif + return ZFile::errorNone; } static ZFile::Error sGetSize(int iFD, uint64& oSize) { - struct stat theStatStruct; - if (::fstat(iFD, &theStatStruct)) - return sTranslateError(errno); + #if defined(linux) + struct stat64 theStatStruct; + if (::fstat64(iFD, &theStatStruct)) + return sTranslateError(errno); + #else + struct stat theStatStruct; + if (::fstat(iFD, &theStatStruct)) + return sTranslateError(errno); + #endif + oSize = theStatStruct.st_size; return ZFile::errorNone; } @@ -418,8 +427,14 @@ static ZFile::Error sSetSize(int iFD, uint64 iSize) { // NB ftruncate is not supported on all systems - if (::ftruncate(iFD, iSize) < 0) - return sTranslateError(errno); + #if defined(linux) + if (::ftruncate64(iFD, iSize) < 0) + return sTranslateError(errno); + #else + if (::ftruncate(iFD, iSize) < 0) + return sTranslateError(errno); + #endif + return ZFile::errorNone; } @@ -881,9 +896,15 @@ uint64 ZFileLoc_POSIX::Size(ZFile::Error* oErr) { - struct stat theStat; + #if defined(linux) + struct stat64 theStat; + int result = ::stat64(this->Internal_GetPath().c_str(), &theStat); + #else + struct stat theStat; + int result = ::stat(this->Internal_GetPath().c_str(), &theStat); + #endif - if (0 > ::stat(this->Internal_GetPath().c_str(), &theStat)) + if (result < 0) { if (oErr) *oErr = sTranslateError(errno); @@ -899,7 +920,6 @@ ZTime ZFileLoc_POSIX::TimeCreated(ZFile::Error* oErr) { struct stat theStat; - if (0 > ::stat(this->Internal_GetPath().c_str(), &theStat)) { if (oErr) @@ -922,7 +942,6 @@ ZTime ZFileLoc_POSIX::TimeModified(ZFile::Error* oErr) { struct stat theStat; - if (0 > ::stat(this->Internal_GetPath().c_str(), &theStat)) { if (oErr) |