#include <msvcrt/internal/file.h>
+/*
+ * @implemented
+ */
int _wstat (const wchar_t *path, struct stat *buffer)
{
- HANDLE findHandle;
- WIN32_FIND_DATAW findData;
+ WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+ wchar_t *ext;
if (!buffer)
{
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 _stati64 (const char *path, struct _stati64 *buffer)
-{
- HANDLE findHandle;
- WIN32_FIND_DATAA findData;
-
- if (!buffer)
- {
- __set_errno(EINVAL);
- return -1;
- }
-
- if(strchr(path, '*') || strchr(path, '?'))
- {
- __set_errno(EINVAL);
- return -1;
- }
-
- findHandle = FindFirstFileA(path, &findData);
- if (findHandle == INVALID_HANDLE_VALUE)
+ if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
{
__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);
+ buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
+ buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
+ buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd;
- buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
- findData.nFileSizeLow;
+ buffer->st_size = fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD;
- if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR;
else
+ {
buffer->st_mode |= S_IFREG;
- if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+ ext = wcsrchr(path, L'.');
+ if (ext && (!_wcsicmp(ext, L".exe") ||
+ !_wcsicmp(ext, L".com") ||
+ !_wcsicmp(ext, L".bat") ||
+ !_wcsicmp(ext, L".cmd")))
+ buffer->st_mode |= S_IEXEC;
+ }
+ if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE;
return 0;
}
+/*
+ * @implemented
+ */
__int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
{
- HANDLE findHandle;
- WIN32_FIND_DATAW findData;
+ WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+ wchar_t *ext;
if (!buffer)
{
if(wcschr(path, L'*') || wcschr(path, L'?'))
{
- __set_errno(EINVAL);
+ __set_errno(ENOENT);
return -1;
}
- findHandle = FindFirstFileW(path, &findData);
- if (findHandle == INVALID_HANDLE_VALUE)
+ if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
{
__set_errno(ENOENT);
return -1;
}
- FindClose(findHandle);
-
- memset (buffer, 0, sizeof(struct stat));
+ memset (buffer, 0, sizeof(struct _stati64));
- buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
- buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
- buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
+ buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
+ buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
+ buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd;
- buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
- findData.nFileSizeLow;
+ buffer->st_size = ((((__int64)fileAttributeData.nFileSizeHigh) << 16) << 16) +
+ fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD;
- if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR;
else
+ {
buffer->st_mode |= S_IFREG;
- if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+ ext = wcsrchr(path, L'.');
+ if (ext && (!_wcsicmp(ext, L".exe") ||
+ !_wcsicmp(ext, L".com") ||
+ !_wcsicmp(ext, L".bat") ||
+ !_wcsicmp(ext, L".cmd")))
+ buffer->st_mode |= S_IEXEC;
+ }
+ if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE;
return 0;