summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-22 11:59:47 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-22 11:59:47 +0000
commitf213f5044ea1f061917b1ac0c73e275c2cfe7897 (patch)
treedc8a461f1c4c9163811a73090a9ab33c97f9bb61 /win32/win32.c
parent0e84f98d0de13a644469fbb145ecccc1b25d62df (diff)
win32.c: fallback to WCHAR-version in MSVCRT
* win32/win32.c (rb_w32_open): should not fallback to ANSI-version in MSVCRT, fallback to WCHAR-version in rb_w32_wopen instead. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51917 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c48
1 files changed, 17 insertions, 31 deletions
diff --git a/win32/win32.c b/win32/win32.c
index fd46ec8..f900bfd 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -5975,19 +5975,7 @@ check_if_wdir(const WCHAR *wfile)
return TRUE;
}
-/* License: Ruby's */
-static int
-check_if_dir(const char *file)
-{
- WCHAR *wfile;
- int ret;
-
- if (!(wfile = filecp_to_wstr(file, NULL)))
- return FALSE;
- ret = check_if_wdir(wfile);
- free(wfile);
- return ret;
-}
+static int w32_wopen(const WCHAR *file, int oflag, int perm);
/* License: Ruby's */
int
@@ -6002,16 +5990,9 @@ rb_w32_open(const char *file, int oflag, ...)
pmode = va_arg(arg, int);
va_end(arg);
- if ((oflag & O_TEXT) || !(oflag & O_BINARY)) {
- oflag &= ~O_SHARE_DELETE;
- ret = _open(file, oflag, pmode);
- if (ret == -1 && errno == EACCES) check_if_dir(file);
- return ret;
- }
-
if (!(wfile = filecp_to_wstr(file, NULL)))
return -1;
- ret = rb_w32_wopen(wfile, oflag, pmode);
+ ret = w32_wopen(wfile, oflag, pmode);
free(wfile);
return ret;
}
@@ -6020,6 +6001,21 @@ rb_w32_open(const char *file, int oflag, ...)
int
rb_w32_wopen(const WCHAR *file, int oflag, ...)
{
+ int pmode = 0;
+
+ if (oflag & O_CREAT) {
+ va_list arg;
+ va_start(arg, oflag);
+ pmode = va_arg(arg, int);
+ va_end(arg);
+ }
+
+ return w32_wopen(file, oflag, pmode);
+}
+
+static int
+w32_wopen(const WCHAR *file, int oflag, int pmode)
+{
char flags = 0;
int fd;
DWORD access;
@@ -6032,11 +6028,6 @@ rb_w32_wopen(const WCHAR *file, int oflag, ...)
share_delete = oflag & O_SHARE_DELETE ? FILE_SHARE_DELETE : 0;
oflag &= ~O_SHARE_DELETE;
if ((oflag & O_TEXT) || !(oflag & O_BINARY)) {
- va_list arg;
- int pmode;
- va_start(arg, oflag);
- pmode = va_arg(arg, int);
- va_end(arg);
fd = _wopen(file, oflag, pmode);
if (fd == -1) {
switch (errno) {
@@ -6105,11 +6096,6 @@ rb_w32_wopen(const WCHAR *file, int oflag, ...)
return -1;
}
if (oflag & O_CREAT) {
- va_list arg;
- int pmode;
- va_start(arg, oflag);
- pmode = va_arg(arg, int);
- va_end(arg);
/* TODO: we need to check umask here, but it's not exported... */
if (!(pmode & S_IWRITE))
attr = FILE_ATTRIBUTE_READONLY;