From 012789903181e6c6807cd49ee39229afe77964cf Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 18 Aug 2002 21:04:52 +0000 Subject: [PATCH] Rewrote _stat functions. This functions can't use _fstat. svn path=/trunk/; revision=3366 --- reactos/lib/msvcrt/sys_stat/stat.c | 180 +++++++++++++++++++++++++---- 1 file changed, 159 insertions(+), 21 deletions(-) diff --git a/reactos/lib/msvcrt/sys_stat/stat.c b/reactos/lib/msvcrt/sys_stat/stat.c index 5fc7f5e8418..9e7a164d0fa 100644 --- a/reactos/lib/msvcrt/sys_stat/stat.c +++ b/reactos/lib/msvcrt/sys_stat/stat.c @@ -2,51 +2,189 @@ #include #include #include +#include + +#include int _stat(const char *path, struct stat *buffer) { - int fd = _open(path,_O_RDONLY); - int ret; + HANDLE findHandle; + WIN32_FIND_DATAA findData; - if (fd < 0) + if (!buffer) + { + __set_errno(EINVAL); return -1; + } - ret = fstat(fd,buffer); - _close(fd); + if(strchr(path, '*') || strchr(path, '?')) + { + __set_errno(EINVAL); + return -1; + } - return ret; + findHandle = FindFirstFileA(path, &findData); + if (findHandle == INVALID_HANDLE_VALUE) + { + __set_errno(ENOENT); + return -1; + } + + FindClose(findHandle); + + memset (buffer, 0, sizeof(struct stat)); + + buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); + buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); + buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); + +// statbuf->st_dev = fd; + buffer->st_size = findData.nFileSizeLow; + buffer->st_mode = S_IREAD; + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + buffer->st_mode |= S_IFDIR; + else + buffer->st_mode |= S_IFREG; + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + buffer->st_mode |= S_IWRITE; + + return 0; } __int64 _stati64 (const char *path, struct _stati64 *buffer) { - int fd = _open(path,_O_RDONLY); - int ret; + HANDLE findHandle; + WIN32_FIND_DATAA findData; - ret = _fstati64(fd,buffer); - _close(fd); + if (!buffer) + { + __set_errno(EINVAL); + return -1; + } - return ret; + if(strchr(path, '*') || strchr(path, '?')) + { + __set_errno(EINVAL); + return -1; + } + + findHandle = FindFirstFileA(path, &findData); + if (findHandle == INVALID_HANDLE_VALUE) + { + __set_errno(ENOENT); + return -1; + } + + FindClose(findHandle); + + memset (buffer, 0, sizeof(struct stat)); + + buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); + buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); + buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); + +// statbuf->st_dev = fd; + buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) + + findData.nFileSizeLow; + buffer->st_mode = S_IREAD; + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + buffer->st_mode |= S_IFDIR; + else + buffer->st_mode |= S_IFREG; + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + buffer->st_mode |= S_IWRITE; + + return 0; } int _wstat (const wchar_t *path, struct stat *buffer) { - int fd = _wopen(path,_O_RDONLY); - int ret; + HANDLE findHandle; + WIN32_FIND_DATAW findData; - ret = fstat(fd,buffer); - _close(fd); + if (!buffer) + { + __set_errno(EINVAL); + return -1; + } - return ret; + if(wcschr(path, L'*') || wcschr(path, L'?')) + { + __set_errno(EINVAL); + return -1; + } + + findHandle = FindFirstFileW(path, &findData); + if (findHandle == INVALID_HANDLE_VALUE) + { + __set_errno(ENOENT); + return -1; + } + + FindClose(findHandle); + + memset (buffer, 0, sizeof(struct stat)); + + buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); + buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); + buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); + +// statbuf->st_dev = fd; + buffer->st_size = findData.nFileSizeLow; + buffer->st_mode = S_IREAD; + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + buffer->st_mode |= S_IFDIR; + else + buffer->st_mode |= S_IFREG; + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + buffer->st_mode |= S_IWRITE; + + return 0; } __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer) { - int fd = _wopen(path,_O_RDONLY); - int ret; + HANDLE findHandle; + WIN32_FIND_DATAW findData; - ret = _fstati64(fd,buffer); - _close(fd); + if (!buffer) + { + __set_errno(EINVAL); + return -1; + } - return ret; + if(wcschr(path, L'*') || wcschr(path, L'?')) + { + __set_errno(EINVAL); + return -1; + } + + findHandle = FindFirstFileW(path, &findData); + if (findHandle == INVALID_HANDLE_VALUE) + { + __set_errno(ENOENT); + return -1; + } + + FindClose(findHandle); + + memset (buffer, 0, sizeof(struct stat)); + + buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); + buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); + buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); + +// statbuf->st_dev = fd; + buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) + + findData.nFileSizeLow; + buffer->st_mode = S_IREAD; + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + buffer->st_mode |= S_IFDIR; + else + buffer->st_mode |= S_IFREG; + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + buffer->st_mode |= S_IWRITE; + + return 0; }