diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2001-05-12 16:24:05 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2001-05-12 16:24:05 +0000 |
commit | cbedbdd029e46132dac6eef615fedee53bd16824 (patch) | |
tree | df9d01a68131c222a5ee0ead3de6ab0e3d35ee8a /winsup/cygwin/dir.cc | |
parent | 24a474a4aae74ee7d1ed8e3e5d7db7b977a63db1 (diff) | |
download | cygnal-cbedbdd029e46132dac6eef615fedee53bd16824.tar.gz cygnal-cbedbdd029e46132dac6eef615fedee53bd16824.tar.bz2 cygnal-cbedbdd029e46132dac6eef615fedee53bd16824.zip |
* 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.cc | 42 |
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); |