From 80b0773d33eed302872bbf6808b338d0760b260c Mon Sep 17 00:00:00 2001 From: ocean Date: Wed, 13 Jul 2005 10:40:06 +0000 Subject: * win32/win32.c (rb_w32_mkdir): should set EEXIST (not EACCES) if file or directory already exists. (bcc32) * win32/win32.c (rb_w32_rmdir): should set ENOTDIR (not EINVAL) if it is not directory. (bcc32, win32) * win32/win32.c (rb_w32_rmdir, rb_w32_unlink): restore FILE_ATTRIBUTE_READONLY flag on function failure. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8756 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/win32.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'win32') diff --git a/win32/win32.c b/win32/win32.c index 476306b951..31677689a4 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -152,6 +152,7 @@ static struct { { ERROR_NEGATIVE_SEEK, EINVAL }, { ERROR_SEEK_ON_DEVICE, EACCES }, { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, + { ERROR_DIRECTORY, ENOTDIR }, { ERROR_NOT_LOCKED, EACCES }, { ERROR_BAD_PATHNAME, ENOENT }, { ERROR_MAX_THRDS_REACHED, EAGAIN }, @@ -3623,19 +3624,17 @@ rb_w32_isatty(int fd) } #endif -#undef mkdir -#undef rmdir int rb_w32_mkdir(const char *path, int mode) { int ret = -1; RUBY_CRITICAL(do { - if (mkdir(path) == -1) + if (CreateDirectory(path, NULL) == FALSE) { + errno = map_errno(GetLastError()); break; + } if (chmod(path, mode) == -1) { - int save_errno = errno; - rmdir(path); - errno = save_errno; + RemoveDirectory(path); break; } ret = 0; @@ -3646,37 +3645,38 @@ rb_w32_mkdir(const char *path, int mode) int rb_w32_rmdir(const char *path) { - DWORD attr; - int ret; + int ret = 0; RUBY_CRITICAL({ - attr = GetFileAttributes(path); + const DWORD attr = GetFileAttributes(path); if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) { - attr &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(path, attr); + SetFileAttributes(path, attr & ~FILE_ATTRIBUTE_READONLY); } - ret = rmdir(path); - if (ret < 0 && attr != (DWORD)-1) { - SetFileAttributes(path, attr); + if (RemoveDirectory(path) == FALSE) { + errno = map_errno(GetLastError()); + ret = -1; + if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) { + SetFileAttributes(path, attr); + } } }); return ret; } -#undef unlink int rb_w32_unlink(const char *path) { - DWORD attr; - int ret; + int ret = 0; RUBY_CRITICAL({ - attr = GetFileAttributes(path); + const DWORD attr = GetFileAttributes(path); if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) { - attr &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(path, attr); + SetFileAttributes(path, attr & ~FILE_ATTRIBUTE_READONLY); } - ret = unlink(path); - if (ret < 0 && attr != (DWORD)-1) { - SetFileAttributes(path, attr); + if (DeleteFile(path) == FALSE) { + errno = map_errno(GetLastError()); + ret = -1; + if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) { + SetFileAttributes(path, attr); + } } }); return ret; -- cgit v1.2.3