Damjan Jovanovic : msvcrt: Implemented stat64, wstat64 and fstat64.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 14 09:25:41 CST 2007
Module: wine
Branch: master
Commit: 7ecc283bd9b6713e84f2d5b314d1173b841ddbd5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7ecc283bd9b6713e84f2d5b314d1173b841ddbd5
Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date: Wed Feb 14 12:26:42 2007 +0200
msvcrt: Implemented stat64, wstat64 and fstat64.
Change all other variations of stat use the stat64 family, since it is
the most general.
---
dlls/msvcrt/file.c | 123 +++++++++++++++++++++++++++++++------------
dlls/msvcrt/msvcrt.spec | 5 +-
dlls/msvcrt/tests/headers.c | 13 +++++
3 files changed, 106 insertions(+), 35 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 952f64c..b55d600 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -111,19 +111,34 @@ static CRITICAL_SECTION MSVCRT_file_cs;
#define LOCK_FILES() do { EnterCriticalSection(&MSVCRT_file_cs); } while (0)
#define UNLOCK_FILES() do { LeaveCriticalSection(&MSVCRT_file_cs); } while (0)
-static void msvcrt_cp_from_stati64(const struct MSVCRT__stati64 *bufi64, struct MSVCRT__stat *buf)
-{
- buf->st_dev = bufi64->st_dev;
- buf->st_ino = bufi64->st_ino;
- buf->st_mode = bufi64->st_mode;
- buf->st_nlink = bufi64->st_nlink;
- buf->st_uid = bufi64->st_uid;
- buf->st_gid = bufi64->st_gid;
- buf->st_rdev = bufi64->st_rdev;
- buf->st_size = bufi64->st_size;
- buf->st_atime = bufi64->st_atime;
- buf->st_mtime = bufi64->st_mtime;
- buf->st_ctime = bufi64->st_ctime;
+static void msvcrt_stat64_to_stat(const struct MSVCRT__stat64 *buf64, struct MSVCRT__stat *buf)
+{
+ buf->st_dev = buf64->st_dev;
+ buf->st_ino = buf64->st_ino;
+ buf->st_mode = buf64->st_mode;
+ buf->st_nlink = buf64->st_nlink;
+ buf->st_uid = buf64->st_uid;
+ buf->st_gid = buf64->st_gid;
+ buf->st_rdev = buf64->st_rdev;
+ buf->st_size = buf64->st_size;
+ buf->st_atime = buf64->st_atime;
+ buf->st_mtime = buf64->st_mtime;
+ buf->st_ctime = buf64->st_ctime;
+}
+
+static void msvcrt_stat64_to_stati64(const struct MSVCRT__stat64 *buf64, struct MSVCRT__stati64 *buf)
+{
+ buf->st_dev = buf64->st_dev;
+ buf->st_ino = buf64->st_ino;
+ buf->st_mode = buf64->st_mode;
+ buf->st_nlink = buf64->st_nlink;
+ buf->st_uid = buf64->st_uid;
+ buf->st_gid = buf64->st_gid;
+ buf->st_rdev = buf64->st_rdev;
+ buf->st_size = buf64->st_size;
+ buf->st_atime = buf64->st_atime;
+ buf->st_mtime = buf64->st_mtime;
+ buf->st_ctime = buf64->st_ctime;
}
static inline BOOL msvcrt_is_valid_fd(int fd)
@@ -1106,9 +1121,9 @@ int CDECL MSVCRT__fileno(MSVCRT_FILE* file)
}
/*********************************************************************
- * _fstati64 (MSVCRT.@)
+ * _fstat64 (MSVCRT.@)
*/
-int CDECL MSVCRT__fstati64(int fd, struct MSVCRT__stati64* buf)
+int CDECL MSVCRT__fstat64(int fd, struct MSVCRT__stat64* buf)
{
DWORD dw;
BY_HANDLE_FILE_INFORMATION hfi;
@@ -1126,7 +1141,7 @@ int CDECL MSVCRT__fstati64(int fd, struct MSVCRT__stati64* buf)
}
memset(&hfi, 0, sizeof(hfi));
- memset(buf, 0, sizeof(struct MSVCRT__stati64));
+ memset(buf, 0, sizeof(struct MSVCRT__stat64));
if (!GetFileInformationByHandle(hand, &hfi))
{
WARN(":failed-last error (%d)\n",GetLastError());
@@ -1156,15 +1171,29 @@ int CDECL MSVCRT__fstati64(int fd, struct MSVCRT__stati64* buf)
}
/*********************************************************************
+ * _fstati64 (MSVCRT.@)
+ */
+int CDECL MSVCRT__fstati64(int fd, struct MSVCRT__stati64* buf)
+{
+ int ret;
+ struct MSVCRT__stat64 buf64;
+
+ ret = MSVCRT__fstat64(fd, &buf64);
+ if (!ret)
+ msvcrt_stat64_to_stati64(&buf64, buf);
+ return ret;
+}
+
+/*********************************************************************
* _fstat (MSVCRT.@)
*/
int CDECL MSVCRT__fstat(int fd, struct MSVCRT__stat* buf)
{ int ret;
- struct MSVCRT__stati64 bufi64;
+ struct MSVCRT__stat64 buf64;
- ret = MSVCRT__fstati64(fd, &bufi64);
+ ret = MSVCRT__fstat64(fd, &buf64);
if (!ret)
- msvcrt_cp_from_stati64(&bufi64, buf);
+ msvcrt_stat64_to_stat(&buf64, buf);
return ret;
}
@@ -1692,9 +1721,9 @@ int CDECL _setmode(int fd,int mode)
}
/*********************************************************************
- * _stati64 (MSVCRT.@)
+ * _stat64 (MSVCRT.@)
*/
-int CDECL MSVCRT__stati64(const char* path, struct MSVCRT__stati64 * buf)
+int CDECL MSVCRT__stat64(const char* path, struct MSVCRT__stat64 * buf)
{
DWORD dw;
WIN32_FILE_ATTRIBUTE_DATA hfi;
@@ -1710,7 +1739,7 @@ int CDECL MSVCRT__stati64(const char* path, struct MSVCRT__stati64 * buf)
return -1;
}
- memset(buf,0,sizeof(struct MSVCRT__stati64));
+ memset(buf,0,sizeof(struct MSVCRT__stat64));
/* FIXME: rdev isn't drive num, despite what the docs say-what is it?
Bon 011120: This FIXME seems incorrect
@@ -1753,27 +1782,41 @@ int CDECL MSVCRT__stati64(const char* path, struct MSVCRT__stati64 * buf)
buf->st_mtime = buf->st_ctime = dw;
TRACE("%d %d 0x%08lx%08lx %ld %ld %ld\n", buf->st_mode,buf->st_nlink,
(long)(buf->st_size >> 32),(long)buf->st_size,
- buf->st_atime,buf->st_mtime, buf->st_ctime);
+ (long)buf->st_atime,(long)buf->st_mtime,(long)buf->st_ctime);
return 0;
}
/*********************************************************************
+ * _stati64 (MSVCRT.@)
+ */
+int CDECL MSVCRT__stati64(const char* path, struct MSVCRT__stati64 * buf)
+{
+ int ret;
+ struct MSVCRT__stat64 buf64;
+
+ ret = MSVCRT__stat64(path, &buf64);
+ if (!ret)
+ msvcrt_stat64_to_stati64(&buf64, buf);
+ return ret;
+}
+
+/*********************************************************************
* _stat (MSVCRT.@)
*/
int CDECL MSVCRT__stat(const char* path, struct MSVCRT__stat * buf)
{ int ret;
- struct MSVCRT__stati64 bufi64;
+ struct MSVCRT__stat64 buf64;
- ret = MSVCRT__stati64( path, &bufi64);
+ ret = MSVCRT__stat64( path, &buf64);
if (!ret)
- msvcrt_cp_from_stati64(&bufi64, buf);
+ msvcrt_stat64_to_stat(&buf64, buf);
return ret;
}
/*********************************************************************
- * _wstati64 (MSVCRT.@)
+ * _wstat64 (MSVCRT.@)
*/
-int CDECL MSVCRT__wstati64(const MSVCRT_wchar_t* path, struct MSVCRT__stati64 * buf)
+int CDECL MSVCRT__wstat64(const MSVCRT_wchar_t* path, struct MSVCRT__stat64 * buf)
{
DWORD dw;
WIN32_FILE_ATTRIBUTE_DATA hfi;
@@ -1789,7 +1832,7 @@ int CDECL MSVCRT__wstati64(const MSVCRT_wchar_t* path, struct MSVCRT__stati64 *
return -1;
}
- memset(buf,0,sizeof(struct MSVCRT__stat));
+ memset(buf,0,sizeof(struct MSVCRT__stat64));
/* FIXME: rdev isn't drive num, despite what the docs says-what is it? */
if (MSVCRT_iswalpha(*path))
@@ -1828,20 +1871,34 @@ int CDECL MSVCRT__wstati64(const MSVCRT_wchar_t* path, struct MSVCRT__stati64 *
buf->st_mtime = buf->st_ctime = dw;
TRACE("%d %d 0x%08lx%08lx %ld %ld %ld\n", buf->st_mode,buf->st_nlink,
(long)(buf->st_size >> 32),(long)buf->st_size,
- buf->st_atime,buf->st_mtime, buf->st_ctime);
+ (long)buf->st_atime,(long)buf->st_mtime,(long)buf->st_ctime);
return 0;
}
/*********************************************************************
+ * _wstati64 (MSVCRT.@)
+ */
+int CDECL MSVCRT__wstati64(const MSVCRT_wchar_t* path, struct MSVCRT__stati64 * buf)
+{
+ int ret;
+ struct MSVCRT__stat64 buf64;
+
+ ret = MSVCRT__wstat64(path, &buf64);
+ if (!ret)
+ msvcrt_stat64_to_stati64(&buf64, buf);
+ return ret;
+}
+
+/*********************************************************************
* _wstat (MSVCRT.@)
*/
int CDECL MSVCRT__wstat(const MSVCRT_wchar_t* path, struct MSVCRT__stat * buf)
{
int ret;
- struct MSVCRT__stati64 bufi64;
+ struct MSVCRT__stat64 buf64;
- ret = MSVCRT__wstati64( path, &bufi64 );
- if (!ret) msvcrt_cp_from_stati64(&bufi64, buf);
+ ret = MSVCRT__wstat64( path, &buf64 );
+ if (!ret) msvcrt_stat64_to_stat(&buf64, buf);
return ret;
}
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 8c5b88e..3ea7803 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -243,7 +243,7 @@
@ cdecl _fputwchar(long)
@ cdecl _fsopen(str str long) MSVCRT__fsopen
@ cdecl _fstat(long ptr) MSVCRT__fstat
-@ stub _fstat64
+@ cdecl _fstat64(long ptr) MSVCRT__fstat64
@ cdecl _fstati64(long ptr) MSVCRT__fstati64
@ cdecl _ftime(ptr)
@ cdecl -ret64 _ftol() ntdll._ftol
@@ -451,7 +451,7 @@
@ cdecl _spawnvpe(long str ptr ptr)
@ cdecl _splitpath(str ptr ptr ptr ptr) ntdll._splitpath
@ cdecl _stat(str ptr) MSVCRT__stat
-@ stub _stat64
+@ cdecl _stat64(str ptr) MSVCRT__stat64
@ cdecl _stati64(str ptr) MSVCRT__stati64
@ cdecl _statusfp()
@ cdecl _strcmpi(str str) ntdll._strcmpi
@@ -560,6 +560,7 @@
@ cdecl _wsplitpath(wstr wstr wstr wstr wstr)
@ cdecl _wstat(wstr ptr) MSVCRT__wstat
@ cdecl _wstati64(wstr ptr) MSVCRT__wstati64
+@ cdecl _wstat64(wstr ptr) MSVCRT__wstat64
@ cdecl _wstrdate(ptr)
@ cdecl _wstrtime(ptr)
@ stub _wsystem #(wstr)
diff --git a/dlls/msvcrt/tests/headers.c b/dlls/msvcrt/tests/headers.c
index d5efa86..d7c7cd7 100644
--- a/dlls/msvcrt/tests/headers.c
+++ b/dlls/msvcrt/tests/headers.c
@@ -88,6 +88,7 @@ static void test_types(void)
CHECK_TYPE(_off_t);
CHECK_TYPE(clock_t);
CHECK_TYPE(time_t);
+ CHECK_TYPE(__time64_t);
CHECK_TYPE(fpos_t);
CHECK_SIZE(FILE);
CHECK_TYPE(terminate_handler);
@@ -295,6 +296,18 @@ static void test_structs(void)
CHECK_FIELD(_stati64, st_atime);
CHECK_FIELD(_stati64, st_mtime);
CHECK_FIELD(_stati64, st_ctime);
+ CHECK_STRUCT(_stat64);
+ CHECK_FIELD(_stat64, st_dev);
+ CHECK_FIELD(_stat64, st_ino);
+ CHECK_FIELD(_stat64, st_mode);
+ CHECK_FIELD(_stat64, st_nlink);
+ CHECK_FIELD(_stat64, st_uid);
+ CHECK_FIELD(_stat64, st_gid);
+ CHECK_FIELD(_stat64, st_rdev);
+ CHECK_FIELD(_stat64, st_size);
+ CHECK_FIELD(_stat64, st_atime);
+ CHECK_FIELD(_stat64, st_mtime);
+ CHECK_FIELD(_stat64, st_ctime);
}
/************* Checking defines ***************/
More information about the wine-cvs
mailing list