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/fcntl.h>
#include <msvcrt/io.h>
#include <msvcrt/errno.h>
#include <windows.h>
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);
return ret;
if (!buffer)
{
__set_errno(EINVAL);
return -1;
}
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;
}