]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/w32.c (sys_rename_replace): Support renaming a directory.
authorEli Zaretskii <eliz@gnu.org>
Thu, 17 Aug 2017 14:58:08 +0000 (17:58 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 17 Aug 2017 14:58:08 +0000 (17:58 +0300)
src/w32.c

index c821e245d8340bb500760be43c31c1f11bd745f5..7cd58d07d884e744f2f981190b57047325a59ffd 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -4504,6 +4504,7 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
       result = _wrename (temp_w, newname_w);
       if (result < 0)
        {
+         DWORD attributes;
          DWORD w32err = GetLastError ();
 
          if (errno == EACCES
@@ -4514,8 +4515,6 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
                 different storage device (ex. logical disk).  It returns
                 EACCES instead.  So here we handle such situations and
                 return EXDEV.  */
-             DWORD attributes;
-
              if ((attributes = GetFileAttributesW (temp_w)) != -1
                  && (attributes & FILE_ATTRIBUTE_DIRECTORY))
                errno = EXDEV;
@@ -4524,7 +4523,13 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
            {
              if (_wchmod (newname_w, 0666) != 0)
                return result;
-             if (_wunlink (newname_w) != 0)
+             if ((attributes = GetFileAttributesW (newname_w)) != -1
+                 && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+               {
+                 if (_wrmdir (newname_w) != 0)
+                   return result;
+               }
+             else if (_wunlink (newname_w) != 0)
                return result;
              result = _wrename (temp_w, newname_w);
            }
@@ -4548,13 +4553,12 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
       result = rename (temp_a, newname_a);
       if (result < 0)
        {
+         DWORD attributes;
          DWORD w32err = GetLastError ();
 
          if (errno == EACCES
              && newname_dev != oldname_dev)
            {
-             DWORD attributes;
-
              if ((attributes = GetFileAttributesA (temp_a)) != -1
                  && (attributes & FILE_ATTRIBUTE_DIRECTORY))
                errno = EXDEV;
@@ -4563,7 +4567,13 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
            {
              if (_chmod (newname_a, 0666) != 0)
                return result;
-             if (_unlink (newname_a) != 0)
+             if ((attributes = GetFileAttributesA (newname_a)) != -1
+                 && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+               {
+                 if (_rmdir (newname_a) != 0)
+                   return result;
+               }
+             else if (_unlink (newname_a) != 0)
                return result;
              result = rename (temp_a, newname_a);
            }