[libcompat] Use _stati64() instead of _stat64().
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 16:46:14 +0000 (12:46 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 16:46:14 +0000 (12:46 -0400)
_stat64() was added in MSVC 2005, while _stati64() is available
in MSVC 6.0 and possibly earlier versions.

struct _stati64 has a 64-bit filesize, and depending on MSVC version,
either a 32-bit (pre-2005) or 64-bit (2005+) time_t.

Note that struct _stati64 is affected by _USE_32BIT_TIME_T in MSVC 2005
and later versions, so we have to make sure it doesn't get defined.

Renamed HAVE_FSEEKI64 and HAVE_FTELLI64 to HAVE__FSEEKI64 and HAVE__FTELLI64.
Note the extra underscores. This matches the standard convention
for config.h macros.

src/libcompat/CMakeLists.txt
src/libcompat/W32U/W32U_libc.c
src/libcompat/W32U/W32U_libc.h
src/libcompat/config.libcompat.h.in
src/libgens/Decompressor/DcRar_Win32.cpp
src/libzomg/Zomg.cpp

index 193e63e..bd4a737 100644 (file)
@@ -51,8 +51,9 @@ CHECK_FUNCTION_EXISTS_OR_INLINE(localtime_s "time.h" "time_t tm; localtime_s(&tm
 CHECK_FUNCTION_EXISTS(getpwuid_r HAVE_GETPWUID_R)
 # NOTE: These should either both be present or both be absent.
 # We'll test for both of them anyway.
-CHECK_FUNCTION_EXISTS(_fseeki64 HAVE_FSEEKI64)
-CHECK_FUNCTION_EXISTS(_ftelli64 HAVE_FTELLI64)
+CHECK_FUNCTION_EXISTS(_stati64 HAVE__STATI64)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64)
+CHECK_FUNCTION_EXISTS(_ftelli64 HAVE__FTELLI64)
 
 # aligned_malloc.h
 # NOTE: MinGW-w64 only has _aligned_malloc().
index 69ff911..74f0ae1 100644 (file)
@@ -225,14 +225,14 @@ fail:
 }
 
 /**
- * Internal implementation of _wstat64().
- * MSVCRT's _wstat64() fails if the filename contains '?' or '*',
+ * Internal implementation of _wstati64().
+ * MSVCRT's _wstati64() fails if the filename contains '?' or '*',
  * which breaks long filename support, e.g. \\?\.
  * @param pathname Pathname.
  * @param buf Stat buffer.
  * @return 0 on success; -1 on error.
  */
-static int W32U_wstat64(const wchar_t *pathname, struct _stat64 *buffer)
+static int W32U_wstati64(const wchar_t *pathname, struct _stati64 *buffer)
 {
        int fd, ret;
 
@@ -261,7 +261,7 @@ static int W32U_wstat64(const wchar_t *pathname, struct _stat64 *buffer)
  * @param buf Stat buffer.
  * @return 0 on success; -1 on error.
  */
-int W32U_stat64(const char *pathname, struct _stat64 *buf)
+int W32U_stati64(const char *pathname, struct _stati64 *buf)
 {
        wchar_t *pathnameW;
        int ret = -1;
@@ -301,10 +301,10 @@ int W32U_stat64(const char *pathname, struct _stat64 *buf)
 
        if (W32U_IsUnicode()) {
                // Unicode version.
-               // NOTE: MSVCRT's _wstat64() fails if the filename
+               // NOTE: MSVCRT's _wstati64() fails if the filename
                // contains '?' or '*', which breaks long filename
                // support, e.g. \\?\.
-               ret = W32U_wstat64(pathnameW, buf);
+               ret = W32U_wstati64(pathnameW, buf);
                errno_ret = errno;
        } else {
 #ifdef ENABLE_ANSI_WINDOWS
@@ -318,7 +318,7 @@ int W32U_stat64(const char *pathname, struct _stat64 *buf)
                }
 
                // Get the file status.
-               ret = _stat64(pathnameA, buf);
+               ret = _stati64(pathnameA, buf);
 #else /* !ENABLE_ANSI_WINDOWS */
                // ANSI is not supported in this build.
                // TODO: Fail earlier to avoid an alloc()?
index 7a0d09b..0aac362 100644 (file)
@@ -73,18 +73,28 @@ FILE *W32U_fopen(const char *filename, const char *mode);
 // TODO: Use _fseeki64() and _ftelli64() on MinGW-w64 to avoid
 // use of wrapper functions?
 #ifdef _MSC_VER
-#ifdef HAVE_FSEEKI64
+#ifndef HAVE__STATI64
+#pragma message("MSVC is missing _stati64(); files larger than 2 GB may not be handled correctly.")
+#define _stati64 stat
+#endif
+#ifdef HAVE__FSEEKI64
 #define fseeko(stream, offset, origin) _fseeki64(stream, offset, origin)
 #else /* !HAVE_FSEEKI64 */
-#pragma message("MSVC is missing _fseeki64(), files larger than 2 GB may not be handled correctly.")
+#pragma message("MSVC is missing _fseeki64(); files larger than 2 GB may not be handled correctly.")
 #define fseeko(stream, offset, origin) fseek(stream, (int)offset, origin)
 #endif /* HAVE_FSEEKI64 */
-#ifdef HAVE_FTELLI64
+#ifdef HAVE__FTELLI64
 #define ftello(stream) _ftelli64(stream)
 #else /* !HAVE_FTELLI64 */
-#pragma message("MSVC is missing _ftelli64(), files larger than 2 GB may not be handled correctly.")
+#pragma message("MSVC is missing _ftelli64(); files larger than 2 GB may not be handled correctly.")
 #define ftello(stream) (__int64)ftell(stream)
 #endif /* HAVE_FTELLI64 */
+
+#if _MSC_VER >= 1400 && _USE_32BIT_TIME_T
+/* MSVC 2005 defaults to 64-bit time_t, but this can be overridden. */
+/* We don't want it to be overridden. */
+#error 32-bit time_t is enabled, please undefine _USE_32BIT_TIME_T.
+#endif
 #endif /* _MSC_VER */
 
 /** access() **/
@@ -134,13 +144,13 @@ int W32U_mkdir(const char *path);
 // non-underscore versions for compatibility.
 
 // FIXME: How do we handle struct stat?
-// For now, the caller will have to ensure it uses struct _stat64.
+// For now, the caller will have to ensure it uses struct _stati64.
 
 // Redefine stat() as W32U_stat64().
 #ifdef stat
 #undef stat
 #endif
-#define stat(pathname, buf) W32U_stat64(pathname, buf)
+#define stat(pathname, buf) W32U_stati64(pathname, buf)
 
 /**
  * Get file status.
@@ -148,7 +158,7 @@ int W32U_mkdir(const char *path);
  * @param buf Stat buffer.
  * @return 0 on success; -1 on error.
  */
-int W32U_stat64(const char *pathname, struct _stat64 *buf);
+int W32U_stati64(const char *pathname, struct _stati64 *buf);
 
 #ifdef __cplusplus
 }
index 7dc3999..93cac64 100644 (file)
 /* Define to 1 if you have the `getpwuid_r` function. */
 #cmakedefine HAVE_GETPWUID_R 1
 
+/* Define to 1 if you have the `_stati64` function. */
+#cmakedefine HAVE__STATI64 1
+
 /* Define to 1 if you have the `_fseeki64` function. */
-#cmakedefine HAVE_FSEEKI64 1
+#cmakedefine HAVE__FSEEKI64 1
 
 /* Define to 1 if you have the `_ftelli64` function. */
-#cmakedefine HAVE_FTELLI64 1
+#cmakedefine HAVE__FTELLI64 1
 
 /* Define to 1 if you have the MSVC-specific `_aligned_malloc` function. */
 #cmakedefine HAVE_MSVC_ALIGNED_MALLOC 1
index 505abbd..26ab092 100644 (file)
@@ -521,7 +521,7 @@ uint32_t DcRar::CheckExtPrg(const char *extprg, ExtPrgInfo *prg_info)
                return -1;
 
        // Make sure that this is a regular file.
-       struct _stat64 st_buf;
+       struct _stati64 st_buf;
        if (stat(extprg, &st_buf) != 0)
                return -4;
        if (!S_ISREG(st_buf.st_mode))
index af5bfbd..421ae63 100644 (file)
@@ -98,7 +98,7 @@ int ZomgPrivate::initZomgLoad(const char *filename)
        // TODO: Check for "CreationTime" in ZOMG.ini, and use it
        // if it's available.
 #ifdef _WIN32
-       struct _stat64 buf;
+       struct _stati64 buf;
 #else
        struct stat buf;
 #endif