From 689221682269bf5c40567d15d28bfb73369253e7 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 22 May 2000 17:15:47 +0000 Subject: [PATCH] * dir.cc (rmdir): Care for misleading error messages when trying to remove a directory on a samba share. Eliminate superfluous else branch. * syscalls.cc (_rename): Additional check for ERROR_FILE_EXISTS if MoveFile fails. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/dir.cc | 23 ++++++++++++++++------- winsup/cygwin/syscalls.cc | 3 ++- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index acf819b8e..01384d0a1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +Mon May 16 23:39:00 2000 Corinna Vinschen + + * dir.cc (rmdir): Care for misleading error messages + when trying to remove a directory on a samba share. + Eliminate superfluous else branch. + * syscalls.cc (_rename): Additional check for ERROR_FILE_EXISTS + if MoveFile fails. + Sun May 21 20:51:44 2000 Christopher Faylor * dcrt0.cc (dll_crt0_1): Move uinfo_init call to before sigproc_init to diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index 48187a20c..d93f2e62c 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -319,18 +319,27 @@ rmdir (const char *dir) } if (RemoveDirectoryA (real_dir.get_win32 ())) - res = 0; - else if (os_being_run != winNT && GetLastError() == ERROR_ACCESS_DENIED) { - /* Under Windows 95 & 98, ERROR_ACCESS_DENIED is returned - if you try to remove a file or a non-empty directory. */ + /* RemoveDirectory on a samba drive doesn't return an error if the + directory can't be removed because it's not empty. Checking for + existence afterwards keeps us informed about success. */ + if (GetFileAttributesA (real_dir.get_win32 ()) != (DWORD) -1) + set_errno (ENOTEMPTY); + else + res = 0; + } + else if (GetLastError() == ERROR_ACCESS_DENIED) + { + /* Under Windows 9X or on a samba share, ERROR_ACCESS_DENIED is + returned if you try to remove a file. On 9X the same error is + returned if you try to remove a non-empty directory. */ if (GetFileAttributes (real_dir.get_win32()) != FILE_ATTRIBUTE_DIRECTORY) set_errno (ENOTDIR); - else + else if (os_being_run != winNT) set_errno (ENOTEMPTY); + else + __seterrno (); } - else if (GetLastError () == ERROR_DIRECTORY) - set_errno (ENOTDIR); else __seterrno (); diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index c1ad04b1c..e6a5c0670 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1231,7 +1231,8 @@ _rename (const char *oldpath, const char *newpath) if (!MoveFile (real_old.get_win32 (), real_new.get_win32 ())) res = -1; - if (res == 0 || GetLastError () != ERROR_ALREADY_EXISTS) + if (res == 0 || (GetLastError () != ERROR_ALREADY_EXISTS + && GetLastError () != ERROR_FILE_EXISTS)) goto done; if (os_being_run == winNT)