From 26af2b644ce634c383f27b66b9d291a34d80ab30 Mon Sep 17 00:00:00 2001 From: "Anthony J. Bentley" Date: Sun, 17 Jul 2016 04:30:00 -0600 Subject: [PATCH] common: convert to standard stat()/fstat() interfaces Most modern Unix environments use 64-bit off_t by default: OpenBSD, FreeBSD, OS X, and Linux libc implementations such as Musl. glibc is the lone exception; it can default to 32 bits but this is configurable by setting _FILE_OFFSET_BITS. Avoiding the stat64()/fstat64() interfaces is desirable because they are nonstandard and not implemented on many systems (including OpenBSD and FreeBSD), and using 64 bits for stat()/fstat() is either the default or trivial to set up. --- CMakeLists.txt | 9 +++++++++ src/common/file_util.cpp | 25 ++++++++++--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c7a24f04fc..df7fe0cba8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,6 +105,15 @@ else() set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) endif() +# Set file offset size to 64 bits. +# +# On modern Unixes, this is typically already the case. The lone exception is +# glibc, which may default to 32 bits. glibc allows this to be configured +# by setting _FILE_OFFSET_BITS. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_definitions(-D_FILE_OFFSET_BITS=64) +endif() + add_definitions(-DSINGLETHREADED) # CMake seems to only define _DEBUG on Windows set_property(DIRECTORY APPEND PROPERTY diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index c1838efb95..407ed047af 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -23,8 +23,8 @@ #define fseeko _fseeki64 #define ftello _ftelli64 #define atoll _atoi64 -#define stat64 _stat64 -#define fstat64 _fstat64 +#define stat _stat64 +#define fstat _fstat64 #define fileno _fileno #else #ifdef __APPLE__ @@ -52,11 +52,6 @@ #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) #endif -#if !defined(_WIN32) && !defined(__APPLE__) && !defined(__GLIBC__) && !defined(__UCLIBC__) -#define stat64 stat -#define fstat64 fstat -#endif - // This namespace has various generic functions related to files and paths. // The code still needs a ton of cleanup. // REMEMBER: strdup considered harmful! @@ -76,7 +71,7 @@ static void StripTailDirSlashes(std::string& fname) { // Returns true if file filename exists bool Exists(const std::string& filename) { - struct stat64 file_info; + struct stat file_info; std::string copy(filename); StripTailDirSlashes(copy); @@ -88,7 +83,7 @@ bool Exists(const std::string& filename) { int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); #else - int result = stat64(copy.c_str(), &file_info); + int result = stat(copy.c_str(), &file_info); #endif return (result == 0); @@ -96,7 +91,7 @@ bool Exists(const std::string& filename) { // Returns true if filename is a directory bool IsDirectory(const std::string& filename) { - struct stat64 file_info; + struct stat file_info; std::string copy(filename); StripTailDirSlashes(copy); @@ -108,7 +103,7 @@ bool IsDirectory(const std::string& filename) { int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); #else - int result = stat64(copy.c_str(), &file_info); + int result = stat(copy.c_str(), &file_info); #endif if (result < 0) { @@ -339,11 +334,11 @@ u64 GetSize(const std::string& filename) { return 0; } - struct stat64 buf; + struct stat buf; #ifdef _WIN32 if (_wstat64(Common::UTF8ToUTF16W(filename).c_str(), &buf) == 0) #else - if (stat64(filename.c_str(), &buf) == 0) + if (stat(filename.c_str(), &buf) == 0) #endif { LOG_TRACE(Common_Filesystem, "%s: %lld", filename.c_str(), (long long)buf.st_size); @@ -356,8 +351,8 @@ u64 GetSize(const std::string& filename) { // Overloaded GetSize, accepts file descriptor u64 GetSize(const int fd) { - struct stat64 buf; - if (fstat64(fd, &buf) != 0) { + struct stat buf; + if (fstat(fd, &buf) != 0) { LOG_ERROR(Common_Filesystem, "GetSize: stat failed %i: %s", fd, GetLastErrorMsg()); return 0; }