diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-22 11:59:47 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-22 11:59:47 +0000 |
commit | f213f5044ea1f061917b1ac0c73e275c2cfe7897 (patch) | |
tree | dc8a461f1c4c9163811a73090a9ab33c97f9bb61 /win32 | |
parent | 0e84f98d0de13a644469fbb145ecccc1b25d62df (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')
-rw-r--r-- | win32/win32.c | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/win32/win32.c b/win32/win32.c index fd46ec84bd..f900bfd81e 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; |