From: Laurent MAZET Date: Wed, 15 Jan 2025 16:27:25 +0000 (+0100) Subject: fix move and rename functions X-Git-Tag: v1.0~39 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=55590adde844932af6a75d47442013342e6d43ab;p=fm.git fix move and rename functions --- diff --git a/fm.c b/fm.c index 6589741..bf1a5a4 100644 --- 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 */ diff --git a/function.c b/function.c index 2f991cb..49b9195 100644 --- a/function.c +++ b/function.c @@ -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; }