OSDN Git Service

* dir.cc (rmdir): Rearrange slightly to allow removing directories
authorcorinna <corinna>
Sat, 12 May 2001 16:24:05 +0000 (16:24 +0000)
committercorinna <corinna>
Sat, 12 May 2001 16:24:05 +0000 (16:24 +0000)
        even when R/O attribute is set.

winsup/cygwin/ChangeLog
winsup/cygwin/dir.cc

index e105d47..450de5c 100644 (file)
@@ -1,3 +1,8 @@
+Sat May 12 18:19:00 2001  Corinna Vinschen <corinna@vinschen.de>
+
+       * dir.cc (rmdir): Rearrange slightly to allow removing directories
+       even when R/O attribute is set.
+
 Fri May 11 16:53:38 2001  Christopher Faylor <cgf@cygnus.com>
 
        * external.cc (fillout_pinfo): Use correct pids.
index 7c0c35e..9e154b0 100644 (file)
@@ -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);