Rewrote _stat functions. This functions can't use _fstat.

svn path=/trunk/; revision=3366
This commit is contained in:
Hartmut Birr 2002-08-18 21:04:52 +00:00
parent 82557ffc26
commit 0127899031

View file

@ -2,51 +2,189 @@
#include <msvcrt/sys/stat.h> #include <msvcrt/sys/stat.h>
#include <msvcrt/fcntl.h> #include <msvcrt/fcntl.h>
#include <msvcrt/io.h> #include <msvcrt/io.h>
#include <msvcrt/errno.h>
#include <windows.h>
int _stat(const char *path, struct stat *buffer) int _stat(const char *path, struct stat *buffer)
{ {
int fd = _open(path,_O_RDONLY); HANDLE findHandle;
int ret; WIN32_FIND_DATAA findData;
if (fd < 0) if (!buffer)
{
__set_errno(EINVAL);
return -1; return -1;
}
ret = fstat(fd,buffer); if(strchr(path, '*') || strchr(path, '?'))
_close(fd); {
__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) __int64 _stati64 (const char *path, struct _stati64 *buffer)
{ {
int fd = _open(path,_O_RDONLY); HANDLE findHandle;
int ret; WIN32_FIND_DATAA findData;
ret = _fstati64(fd,buffer); if (!buffer)
_close(fd); {
__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 _wstat (const wchar_t *path, struct stat *buffer)
{ {
int fd = _wopen(path,_O_RDONLY); HANDLE findHandle;
int ret; WIN32_FIND_DATAW findData;
ret = fstat(fd,buffer); if (!buffer)
_close(fd); {
__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) __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
{ {
int fd = _wopen(path,_O_RDONLY); HANDLE findHandle;
int ret; WIN32_FIND_DATAW findData;
ret = _fstati64(fd,buffer); if (!buffer)
_close(fd); {
__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;
} }