fix move and rename functions
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 15 Jan 2025 16:27:25 +0000 (17:27 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 15 Jan 2025 16:29:52 +0000 (17:29 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index 658974111b32b106e2f5fd995ce49f6e012fde58..bf1a5a44cb37f9f767b989cb775d81840de8554b 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -402,12 +402,22 @@ int main (int argc, char *argv[])
                 len = (strlen (current->name) > MAXFNAME * 80 / 100) ? 2 * MAXFNAME + 1: MAXFNAME + 1;
                 string = getwindow ("Rename", winscreen, MAXFNAME / 2, len, current->name);
                 if (string) {
-                    struct stat sb;
-                    if ((stat (string, &sb) == 0) || (rename (current->name, string) != 0)) {
+                    if (strchr (string, *SEPARATOR) != NULL) {
                         char *buf = strdupcat ("Can't rename file to '", string, "'", NULL);
                         msgwindow (buf, winscreen, 0);
                         getch ();
                         free (buf);
+                    } else {
+                        char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL);
+                        char *dest = strdupcat (dirname[panel], SEPARATOR, string, NULL);
+                        char *msg = processmove (dest, src);
+                        if (msg) {
+                            msgwindow (msg, winscreen, 0);
+                            getch ();
+                            free (msg);
+                        }
+                        free (src);
+                        free (dest);
                     }
                     freelist (list[panel]);
                     list[panel] = NULL;
@@ -471,7 +481,10 @@ int main (int argc, char *argv[])
 /* test: { sleep 1; echo -en '\en'; sleep 1; echo -n foo/bar; sleep 1; echo; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */
 
 /* Rename */
-/* test: touch .a && { sleep 1; echo -en 'k\er'; sleep 1; echo .aa; sleep 1; echo -en '\er'; sleep 1; echo .aa/1; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .aa */
+/* test: touch .a && { sleep 1; echo -en 'k\er'; sleep 1; echo .aa; sleep 1; echo -en '\er'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .aa */
+/* test: touch .a && { sleep 1; echo -en 'k\er'; sleep 1; echo .c/1; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
+/* test: touch .a && mkdir .b && { sleep 1; echo -en 'k\er'; sleep 1; echo .b/.a; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a && mkdir .b */
+/* test: touch .a .b && { sleep 1; echo -en 'k\er'; sleep 1; echo .b; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a .b */
 
 /* Move */
 /* test: touch .a0 && mkdir .a1 && { sleep 1; echo -en 'k\esk\es'; sleep 1; echo -en '\t\n\t'; sleep 1; echo -en '\em'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm ../.a0 && rmdir ../.a1 */
index 2f991cbe9ecee81646d115f3f0c22e3cc8630cf6..49b91956c3b0df94a6e889b5a17abb5c78f21f62 100644 (file)
@@ -511,18 +511,19 @@ char *processmove (char *dest, char *src)
     char *msg = NULL;
 
     struct stat sb;
-    if (STAT (dest, &sb) == 0) {
+    int rc = STAT (dest, &sb);
+    errno = 0;
+    if ((rc == -1) && (errno == ENOENT)) {
         if (rename (src, dest) != 0) {
-            char *sep = strrchr (dest, *SEPARATOR);
-            if (sep != NULL) {
-                *sep = '\0';
-            }
             msg = strdupcat ("Can't move '", src, "' to '", dest, "'", NULL);
         }
+    } else if (rc == 0) {
+        msg = strdupcat ("File '", dest, "' exists", NULL);
     } else {
         VERBOSE (ERROR, fprintf (stderr, "can't stat on file '%s'\n", src));
         exit (1);
     }
+    errno = 0;
 
     return msg;
 }