Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2001-05-12 20:24:05 +0400
committerCorinna Vinschen <corinna@vinschen.de>2001-05-12 20:24:05 +0400
commitcbedbdd029e46132dac6eef615fedee53bd16824 (patch)
treedf9d01a68131c222a5ee0ead3de6ab0e3d35ee8a /winsup/cygwin/dir.cc
parent24a474a4aae74ee7d1ed8e3e5d7db7b977a63db1 (diff)
* dir.cc (rmdir): Rearrange slightly to allow removing directories
even when R/O attribute is set.
Diffstat (limited to 'winsup/cygwin/dir.cc')
-rw-r--r--winsup/cygwin/dir.cc42
1 files changed, 29 insertions, 13 deletions
diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc
index 7c0c35e64..9e154b010 100644
--- a/winsup/cygwin/dir.cc
+++ b/winsup/cygwin/dir.cc
@@ -343,6 +343,19 @@ rmdir (const char *dir)
goto done;
}
+ /* Is `dir' a directory? */
+ if (real_dir.file_attributes () == (DWORD) -1 ||
+ !(real_dir.file_attributes () & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ set_errno (ENOTDIR);
+ goto done;
+ }
+
+ /* Even own directories can't be removed if R/O attribute is set. */
+ if (real_dir.file_attributes () & FILE_ATTRIBUTE_READONLY)
+ SetFileAttributes (real_dir.get_win32 (), real_dir.file_attributes () &
+ ~FILE_ATTRIBUTE_READONLY);
+
if (RemoveDirectoryA (real_dir.get_win32 ()))
{
/* RemoveDirectory on a samba drive doesn't return an error if the
@@ -353,21 +366,24 @@ rmdir (const char *dir)
else
res = 0;
}
- else if (GetLastError() == ERROR_ACCESS_DENIED)
+ else
{
- /* 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 (real_dir.file_attributes () != (DWORD) -1 &&
- !(real_dir.file_attributes () & FILE_ATTRIBUTE_DIRECTORY))
- set_errno (ENOTDIR);
- else if (os_being_run != winNT)
- set_errno (ENOTEMPTY);
- else
- __seterrno ();
+ if (GetLastError() == ERROR_ACCESS_DENIED)
+ {
+ /* On 9X ERROR_ACCESS_DENIED is returned if you try to remove
+ a non-empty directory. */
+ if (os_being_run != winNT)
+ set_errno (ENOTEMPTY);
+ else
+ __seterrno ();
+ }
+ else
+ __seterrno ();
+
+ /* If directory still exists, restore R/O attribute. */
+ if (real_dir.file_attributes () & FILE_ATTRIBUTE_READONLY)
+ SetFileAttributes (real_dir.get_win32 (), real_dir.file_attributes ());
}
- else
- __seterrno ();
done:
syscall_printf ("%d = rmdir (%s)", res, dir);