aboutsummaryrefslogtreecommitdiffstats
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/win32.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 2657d7403d..c26d3e3cc7 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -5188,9 +5188,18 @@ rb_w32_uopen(const char *file, int oflag, ...)
static int
check_if_dir(const char *file)
{
- struct stati64 st;
- if (rb_w32_stati64(file, &st) != 0 || !S_ISDIR(st.st_mode))
+ DWORD attr;
+ WCHAR *wfile;
+
+ if (!(wfile = filecp_to_wstr(file, NULL)))
+ return FALSE;
+ attr = GetFileAttributesW(wfile);
+ if (attr == (DWORD)-1L ||
+ !(attr & FILE_ATTRIBUTE_DIRECTORY) ||
+ check_valid_dir(wfile)) {
return FALSE;
+ }
+ free(wfile);
errno = EISDIR;
return TRUE;
}
@@ -5199,9 +5208,12 @@ check_if_dir(const char *file)
static int
check_if_wdir(const WCHAR *wfile)
{
- struct stati64 st;
- if (wstati64(wfile, &st) != 0 || !S_ISDIR(st.st_mode))
+ DWORD attr = GetFileAttributesW(wfile);
+ if (attr == (DWORD)-1L ||
+ !(attr & FILE_ATTRIBUTE_DIRECTORY) ||
+ check_valid_dir(wfile)) {
return FALSE;
+ }
errno = EISDIR;
return TRUE;
}