2004-03-19 Pierre Humblet <pierre.humblet@ieee.org>

* dir.cc (rmdir): Reorganize error handling to reduce indentation.
This commit is contained in:
Pierre Humblet 2004-03-20 00:03:32 +00:00
parent 61f50f94d2
commit 83f96e3fbd
2 changed files with 44 additions and 36 deletions

View File

@ -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.

View File

@ -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;
if (att == INVALID_FILE_ATTRIBUTES)
{
res = 0;
break;
}
err = ERROR_DIR_NOT_EMPTY;
}
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)
{
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. */
err = GetLastError ();
/* 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);
}
}
/* 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;
}