diff options
author | Pierre Humblet <phumblet@phumblet.no-ip.org> | 2004-03-20 00:03:32 +0000 |
---|---|---|
committer | Pierre Humblet <phumblet@phumblet.no-ip.org> | 2004-03-20 00:03:32 +0000 |
commit | 83f96e3fbd70cdb443ddb4248fb0b4b9dc565d9d (patch) | |
tree | 6f45548f9097f1e2ea382ef64697bc060e0f9156 /winsup | |
parent | 61f50f94d22ad131e06901c8eb5a5fc026fe3c93 (diff) | |
download | newlib-83f96e3fbd70cdb443ddb4248fb0b4b9dc565d9d.zip newlib-83f96e3fbd70cdb443ddb4248fb0b4b9dc565d9d.tar.gz newlib-83f96e3fbd70cdb443ddb4248fb0b4b9dc565d9d.tar.bz2 |
2004-03-19 Pierre Humblet <pierre.humblet@ieee.org>
* dir.cc (rmdir): Reorganize error handling to reduce indentation.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 4 | ||||
-rw-r--r-- | winsup/cygwin/dir.cc | 76 |
2 files changed, 44 insertions, 36 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1a150d6..b5a4e1b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2004-03-19 Pierre Humblet <pierre.humblet@ieee.org> + + * dir.cc (rmdir): Reorganize error handling to reduce indentation. + 2004-03-19 Christopher Faylor <cgf@redhat.com> * include/cygwin/version.h: Bump DLL minor number to 10. diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index 2fccabc..303326e 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -328,6 +328,7 @@ rmdir (const char *dir) for (bool is_cwd = false; ; is_cwd = true) { + DWORD err; int rc = RemoveDirectory (real_dir); DWORD att = GetFileAttributes (real_dir); @@ -338,48 +339,51 @@ rmdir (const char *dir) /* 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 (att != INVALID_FILE_ATTRIBUTES) - set_errno (ENOTEMPTY); - else - res = 0; - } - else - { - /* This kludge detects if we are attempting to remove the current working - directory. If so, we will move elsewhere to potentially allow the - rmdir to succeed. This means that cygwin's concept of the current working - directory != Windows concept but, hey, whaddaregonnado? - FIXME: A potential workaround for this is for cygwin apps to *never* call - SetCurrentDirectory. */ - if (strcasematch (real_dir, cygheap->cwd.win32) - && !strcasematch ("c:\\", cygheap->cwd.win32) && !is_cwd) + if (att == INVALID_FILE_ATTRIBUTES) { - DWORD err = GetLastError (); - if (!SetCurrentDirectory ("c:\\")) - SetLastError (err); - else - continue; - } - if (res) - { - if (GetLastError () != ERROR_ACCESS_DENIED - || !wincap.access_denied_on_delete ()) - __seterrno (); - else - set_errno (ENOTEMPTY); /* On 9X ERROR_ACCESS_DENIED is - returned if you try to remove a - non-empty directory. */ - - /* If directory still exists, restore R/O attribute. */ - if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY)) - SetFileAttributes (real_dir, real_dir); - if (is_cwd) - SetCurrentDirectory (cygheap->cwd.win32); + res = 0; + break; } + err = ERROR_DIR_NOT_EMPTY; } + else + err = GetLastError (); + + /* This kludge detects if we are attempting to remove the current working + directory. If so, we will move elsewhere to potentially allow the + rmdir to succeed. This means that cygwin's concept of the current working + directory != Windows concept but, hey, whaddaregonnado? + Note that this will not cause something like the following to work: + $ cd foo + $ rmdir . + since the shell will have foo "open" in the above case and so Windows will + not allow the deletion. (Actually it does on 9X.) + FIXME: A potential workaround for this is for cygwin apps to *never* call + SetCurrentDirectory. */ + + if (strcasematch (real_dir, cygheap->cwd.win32) + && !strcasematch ("c:\\", cygheap->cwd.win32) + && !is_cwd + && SetCurrentDirectory ("c:\\")) + continue; + + /* On 9X ERROR_ACCESS_DENIED is returned + if you try to remove a non-empty directory. */ + if (err == ERROR_ACCESS_DENIED + && wincap.access_denied_on_delete ()) + err = ERROR_DIR_NOT_EMPTY; + + __seterrno_from_win_error (err); + + /* Directory still exists, restore its characteristics. */ + if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY)) + SetFileAttributes (real_dir, real_dir); + if (is_cwd) + SetCurrentDirectory (real_dir); break; } } + syscall_printf ("%d = rmdir (%s)", res, dir); return res; } |