mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
- Replaced FindFirstFile/FindClose with GetFileAttributesEx.
- Fixed some minor bugs. svn path=/trunk/; revision=4879
This commit is contained in:
parent
48be1aeb7d
commit
a3048f0254
2 changed files with 101 additions and 89 deletions
|
@ -10,8 +10,7 @@
|
||||||
|
|
||||||
int _stat(const char* path, struct stat* buffer)
|
int _stat(const char* path, struct stat* buffer)
|
||||||
{
|
{
|
||||||
HANDLE findHandle;
|
WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
|
||||||
WIN32_FIND_DATAA findData;
|
|
||||||
char* ext;
|
char* ext;
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
|
@ -26,38 +25,87 @@ int _stat(const char* path, struct stat* buffer)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
findHandle = FindFirstFileA(path, &findData);
|
if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
|
||||||
if (findHandle == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
__set_errno(ENOENT);
|
__set_errno(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
FindClose(findHandle);
|
|
||||||
|
|
||||||
memset (buffer, 0, sizeof(struct stat));
|
memset (buffer, 0, sizeof(struct stat));
|
||||||
|
|
||||||
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
|
buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
|
||||||
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
|
buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
|
||||||
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
|
buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
|
||||||
|
|
||||||
// statbuf->st_dev = fd;
|
// statbuf->st_dev = fd;
|
||||||
buffer->st_size = findData.nFileSizeLow;
|
buffer->st_size = fileAttributeData.nFileSizeLow;
|
||||||
buffer->st_mode = S_IREAD;
|
buffer->st_mode = S_IREAD;
|
||||||
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
buffer->st_mode |= S_IFDIR;
|
buffer->st_mode |= S_IFDIR;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
buffer->st_mode |= S_IFREG;
|
buffer->st_mode |= S_IFREG;
|
||||||
ext = strrchr(path, '.');
|
ext = strrchr(path, '.');
|
||||||
if (ext && (!stricmp(ext, ".exe") ||
|
if (ext && (!_stricmp(ext, ".exe") ||
|
||||||
!stricmp(ext, ".com") ||
|
!_stricmp(ext, ".com") ||
|
||||||
!stricmp(ext, ".bat") ||
|
!_stricmp(ext, ".bat") ||
|
||||||
!stricmp(ext, ".cmd")))
|
!_stricmp(ext, ".cmd")))
|
||||||
buffer->st_mode |= S_IEXEC;
|
buffer->st_mode |= S_IEXEC;
|
||||||
}
|
}
|
||||||
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
|
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
|
||||||
buffer->st_mode |= S_IWRITE;
|
buffer->st_mode |= S_IWRITE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__int64 _stati64 (const char *path, struct _stati64 *buffer)
|
||||||
|
{
|
||||||
|
WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
|
||||||
|
char* ext;
|
||||||
|
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strchr(path, '*') || strchr(path, '?'))
|
||||||
|
{
|
||||||
|
__set_errno(ENOENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
|
||||||
|
{
|
||||||
|
__set_errno(ENOENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (buffer, 0, sizeof(struct _stati64));
|
||||||
|
|
||||||
|
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)fileAttributeData.nFileSizeHigh) << 16) << 16) +
|
||||||
|
fileAttributeData.nFileSizeLow;
|
||||||
|
buffer->st_mode = S_IREAD;
|
||||||
|
if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
buffer->st_mode |= S_IFDIR;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer->st_mode |= S_IFREG;
|
||||||
|
ext = strrchr(path, '.');
|
||||||
|
if (ext && (!_stricmp(ext, ".exe") ||
|
||||||
|
!_stricmp(ext, ".com") ||
|
||||||
|
!_stricmp(ext, ".bat") ||
|
||||||
|
!_stricmp(ext, ".cmd")))
|
||||||
|
buffer->st_mode |= S_IEXEC;
|
||||||
|
}
|
||||||
|
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
|
||||||
|
buffer->st_mode |= S_IWRITE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
int _wstat (const wchar_t *path, struct stat *buffer)
|
int _wstat (const wchar_t *path, struct stat *buffer)
|
||||||
{
|
{
|
||||||
HANDLE findHandle;
|
WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
|
||||||
WIN32_FIND_DATAW findData;
|
wchar_t ext;
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
|
@ -21,79 +21,38 @@ int _wstat (const wchar_t *path, struct stat *buffer)
|
||||||
|
|
||||||
if(wcschr(path, L'*') || wcschr(path, L'?'))
|
if(wcschr(path, L'*') || wcschr(path, L'?'))
|
||||||
{
|
{
|
||||||
__set_errno(EINVAL);
|
__set_errno(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
findHandle = FindFirstFileW(path, &findData);
|
if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
|
||||||
if (findHandle == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
__set_errno(ENOENT);
|
__set_errno(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
FindClose(findHandle);
|
|
||||||
|
|
||||||
memset (buffer, 0, sizeof(struct stat));
|
memset (buffer, 0, sizeof(struct stat));
|
||||||
|
|
||||||
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
|
buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
|
||||||
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
|
buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
|
||||||
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
|
buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
|
||||||
|
|
||||||
// statbuf->st_dev = fd;
|
// statbuf->st_dev = fd;
|
||||||
buffer->st_size = findData.nFileSizeLow;
|
buffer->st_size = fileAttributeData.nFileSizeLow;
|
||||||
buffer->st_mode = S_IREAD;
|
buffer->st_mode = S_IREAD;
|
||||||
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
buffer->st_mode |= S_IFDIR;
|
buffer->st_mode |= S_IFDIR;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
buffer->st_mode |= S_IFREG;
|
buffer->st_mode |= S_IFREG;
|
||||||
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
|
ext = wcsrchr(path, L'.');
|
||||||
buffer->st_mode |= S_IWRITE;
|
if (ext && (!_wcsicmp(ext, L".exe") ||
|
||||||
|
!_wcsicmp(ext, L".com") ||
|
||||||
return 0;
|
!_wcsicmp(ext, L".bat") ||
|
||||||
}
|
!_wcsicmp(ext, L".cmd")))
|
||||||
|
buffer->st_mode |= S_IEXEC;
|
||||||
__int64 _stati64 (const char *path, struct _stati64 *buffer)
|
|
||||||
{
|
|
||||||
HANDLE findHandle;
|
|
||||||
WIN32_FIND_DATAA findData;
|
|
||||||
|
|
||||||
if (!buffer)
|
|
||||||
{
|
|
||||||
__set_errno(EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
|
||||||
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;
|
buffer->st_mode |= S_IWRITE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -101,8 +60,8 @@ __int64 _stati64 (const char *path, struct _stati64 *buffer)
|
||||||
|
|
||||||
__int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
|
__int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
|
||||||
{
|
{
|
||||||
HANDLE findHandle;
|
WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
|
||||||
WIN32_FIND_DATAW findData;
|
wchar_t ext;
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
|
@ -112,34 +71,39 @@ __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
|
||||||
|
|
||||||
if(wcschr(path, L'*') || wcschr(path, L'?'))
|
if(wcschr(path, L'*') || wcschr(path, L'?'))
|
||||||
{
|
{
|
||||||
__set_errno(EINVAL);
|
__set_errno(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
findHandle = FindFirstFileW(path, &findData);
|
if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
|
||||||
if (findHandle == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
__set_errno(ENOENT);
|
__set_errno(ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
FindClose(findHandle);
|
memset (buffer, 0, sizeof(struct _stati64));
|
||||||
|
|
||||||
memset (buffer, 0, sizeof(struct stat));
|
buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
|
||||||
|
buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
|
||||||
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
|
buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
|
||||||
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
|
|
||||||
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
|
|
||||||
|
|
||||||
// statbuf->st_dev = fd;
|
// statbuf->st_dev = fd;
|
||||||
buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
|
buffer->st_size = ((((__int64)fileAttributeData.nFileSizeHigh) << 16) << 16) +
|
||||||
findData.nFileSizeLow;
|
fileAttributeData.nFileSizeLow;
|
||||||
buffer->st_mode = S_IREAD;
|
buffer->st_mode = S_IREAD;
|
||||||
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
buffer->st_mode |= S_IFDIR;
|
buffer->st_mode |= S_IFDIR;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
buffer->st_mode |= S_IFREG;
|
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;
|
buffer->st_mode |= S_IWRITE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue