add tests and fix bound condition on copy
authorLaurent Mazet <mazet@softndesign.org>
Tue, 14 Jan 2025 22:18:42 +0000 (23:18 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Tue, 14 Jan 2025 22:18:42 +0000 (23:18 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index 54221720ea02c021588a99640dc8b718da62f766..cd9f7e6e5b955685fff2afc1c150f1e0fa8bc62e 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -361,7 +361,7 @@ int main (int argc, char *argv[])
                         char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL);
                         char *dest = strdupcat (dirname[(panel + 1 ) % MAXPANELS], SEPARATOR, current->name, NULL);
                         struct stat sb;
-                        if ((stat (dest, &sb) == 0) || (rename (src, dest) != 0)) {
+                        if ((STAT (dest, &sb) == 0) || (rename (src, dest) != 0)) {
                             char *buf = strdupcat ("Can't move '", current->name, "' to '", dirname[(panel + 1 ) % MAXPANELS], "'", NULL);
                             msgwindow (buf, winscreen, 0);
                             getch ();
@@ -480,6 +480,8 @@ int main (int argc, char *argv[])
 /* test: touch .a0 && mkdir .a1 && touch .a1/a2 && { sleep 1; echo -en 'k\esk\es'; sleep 1; echo -en '\ed'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */
 
 /* Copy */
-/* test: mkdir .b .b/c .b/c/d && echo "test" > .a && touch .b/a .b/b  && dd if=/dev/random bs=1k count=12 of=.b/c/d/e 2>/dev/null && md5=$(md5sum .b/c/d/e); && { sleep 1; echo -en '\t\n\t'; sleep 1; echo -en 'k\esk\es'; sleep 1; echo -en '\ec'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && test "$(cat .a) = test && test "$(md5)" = "$(cd ..; md5sum .b/c/d/e)" && rm .a ../.a .b/a ../.b/a .b/b ../.b/b .b/c/d/e ../.b/c/d/e && rmdir .b ../.b .b/c ../.b/c .b/c/d ../.b/c/d */
+/* test: mkdir .b .b/c .b/c/d && echo "test" > .a && touch .b/a .b/b && dd if=/dev/random bs=1k count=12 of=.b/c/d/e 2>/dev/null && md5=$(md5sum .b/c/d/e) && { sleep 1; echo -en '\t\n\t'; sleep 1; echo -en 'k\esk\es'; sleep 1; echo -en '\ec'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && test "$(cat .a)" = test && test "$md5" = "$(cd ..; md5sum .b/c/d/e)" && rm .a ../.a .b/a ../.b/a .b/b ../.b/b .b/c/d/e ../.b/c/d/e && rmdir .b/c/d .b/c .b ../.b/c/d ../.b/c ../.b */
+/* test: echo "test" > .a && touch ../.a && { sleep 1; echo -en '\t\n\t'; sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ec'; sleep 1; echo -n y; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && test "$(ls -s ../.a)" = "0 ../.a" && rm .a ../.a */
+/* test: mkdir .a ../.a && { sleep 1; echo -en '\t\n\t'; sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ec'; sleep 1; echo -n y; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a ../.a */
 
 /* vim: set ts=4 sw=4 et: */
index 92821874aa4b36bdbae71c0062234e3acd840bd7..8082cb8e0ac8df276f9aba3248386d7d0069715c 100644 (file)
@@ -377,13 +377,13 @@ char *_copyfile (char *dest, char *src)
     do {
         char buffer[BUFMAX];
         size_t nread = fread (buffer, 1, BUFMAX, fdsrc);
-        VERBOSE (DEBUG, fprintf (stderr, "read %d bytes\n", nread));
+        VERBOSE (DEBUG, fprintf (stderr, "read %d bytes\n", (int)nread));
         if (nread <= 0) {
             break;
         }
 
         size_t nwritten = fwrite (buffer, 1, nread, fddest);
-        VERBOSE (DEBUG, fprintf (stderr, "wrote %d bytes\n", nwritten));
+        VERBOSE (DEBUG, fprintf (stderr, "wrote %d bytes\n", (int)nwritten));
         if (nwritten != nread) {
             msg = strdupcat ("Can't write file '", dest, "'", NULL);
         }
@@ -435,8 +435,13 @@ char *processcopy (char *dest, char *src)
             basename = (basename) ? basename + 1 : src;
             VERBOSE (DEBUG, fprintf (stderr, "basename '%s'\n", basename));
             char *newdest = strdupcat (dest, SEPARATOR, basename, NULL);
-            VERBOSE (DEBUG, fprintf (stderr, "copy '%s' to '%s'\n", src, newdest));
-            msg = _copyfile (newdest, src);
+            struct stat sb;
+            if (STAT (newdest, &sb) == 0) {
+                msg = strdupcat ("File '", newdest, "' already exists", NULL);
+            } else {
+                VERBOSE (DEBUG, fprintf (stderr, "copy '%s' to '%s'\n", src, newdest));
+                msg = _copyfile (newdest, src);
+            }
             free (newdest);
         }
     } else {