add function copy
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 14 Jan 2025 17:05:42 +0000 (18:05 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 14 Jan 2025 17:05:42 +0000 (18:05 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index f4d10fe540631081f8659598bc6cbb09307cade2..88530d072faef71f363ed572d065322f0832072d 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -483,4 +483,7 @@ int main (int argc, char *argv[])
 /* Delete */
 /* 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 */
+
 /* vim: set ts=4 sw=4 et: */
index 63333ed01ce1595de34b7a57b2cacdb5de1797bc..2750f8b94458ee877769a5e01471aafb4b8614d2 100644 (file)
@@ -86,7 +86,7 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
 #else /* Linux*/
         if (lstat (name, &sb) == -1) {
 #endif
-            VERBOSE (ERROR, fprintf (stderr, "can't stat on file '%s'\n", name));
+            VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s'\n", name));
             exit (1);
         }
 
@@ -221,7 +221,7 @@ void getinfo (char *dirname, elem_t *elem)
 #else /* Linux*/
     if (lstat (name, &sb) == -1) {
 #endif
-        VERBOSE (ERROR, fprintf (stderr, "can't stat on file '%s%s%s'\n", dirname, SEPARATOR, elem->name));
+        VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s%s%s'\n", dirname, SEPARATOR, elem->name));
         exit (1);
     }
 
@@ -370,40 +370,37 @@ char *_copyfile (char *dest, char *src)
 {
     char *msg = NULL;
 
-    int fdsrc = open (src, O_RDONLY);
-    int fddest = open (dest, O_WRONLY | O_CREAT | O_EXCL, 0622);
-    if ((fdsrc < 0) || (fddest < 0)) {
-        if (fdsrc > 0) {
-            close (fdsrc);
+    FILE *fdsrc = fopen (src, "rb");
+    FILE *fddest = fopen (dest, "wb");
+    if ((fdsrc == NULL) || (fddest == NULL)) {
+        if (fdsrc != NULL) {
+            fclose (fdsrc);
         }
-        if (fddest > 0) {
-            close (fddest);
+        if (fddest != NULL) {
+            fclose (fddest);
         }
-        return strdupcat ("Can't open file '", (fdsrc < 0) ? src : dest, "'", NULL);
+        return strdupcat ("Can't open file '", (fdsrc == NULL ) ? src : dest, "'", NULL);
     }
 
-    char bufin[BUFMAX];
-    ssize_t nread = 0;
-    while (nread = read(fdsrc, bufin, sizeof (bufin)), nread > 0) {
-        char *bufout = bufin;
-        ssize_t nwritten;
-
-        while ((nread > 0) && (msg == NULL)) {
-            nwritten = write(fddest, bufout, nread);
+    do {
+        char buffer[BUFMAX];
+        size_t nread = fread (buffer, 1, BUFMAX, fdsrc);
+        VERBOSE (DEBUG, fprintf (stderr, "read %d bytes\n", nread));
+        if (nread <= 0) {
+            break;
+        }
 
-            if (nwritten >= 0) {
-                nread -= nwritten;
-                bufout += nwritten;
-            } else if (errno != EINTR) {
-                msg = strdupcat ("Can't write file '", dest, "'", NULL);
-            }
+        size_t nwritten = fwrite (buffer, 1, nread, fddest);
+        VERBOSE (DEBUG, fprintf (stderr, "wrote %d bytes\n", nwritten));
+        if (nwritten != nread) {
+            msg = strdupcat ("Can't write file '", dest, "'", NULL);
         }
-    }
+    } while (msg == NULL);
 
-    if ((close (fddest) < 0) && (nread == 0)) {
-        strdupcat ("Can't close file '", dest, "'", NULL);
+    if ((fclose (fddest) != 0) && (msg == NULL)) {
+        msg = strdupcat ("Can't close file '", dest, "'", NULL);
     }
-    close (fdsrc);
+    fclose (fdsrc);
 
     return msg;
 }
@@ -419,12 +416,15 @@ char *processcopy (char *dest, char *src)
     if (lstat (src, &sb) == 0) {
 #endif
         if ((sb.st_mode & S_IFMT) == S_IFDIR) {
-            char *nextdest = strdupcat (dest, SEPARATOR, src, NULL);
+            char *basename = strrchr (src, *SEPARATOR);
+            basename = (basename) ? basename + 1 : src;
+            VERBOSE (DEBUG, fprintf (stderr, "basename '%s'\n", basename));
+            char *nextdest = strdupcat (dest, SEPARATOR, basename, NULL);
+            VERBOSE (DEBUG, fprintf (stderr, "mkdir '%s'\n", nextdest));
 #ifdef WIN32
             if (mkdir (nextdest) != 0) {
 #else
-            //if (mkdir (nextdest, 0750) != 0) {
-            VERBOSE (ERROR, fprintf (stderr, "mkdir '%s'\n", nextdest)); if (0) {
+            if (mkdir (nextdest, 0750) != 0) {
 #endif
                 msg = strdupcat ("Can't create directory '", nextdest, "'", NULL);
             } else {
@@ -437,7 +437,7 @@ char *processcopy (char *dest, char *src)
                             continue;
                         }
                         char *nextsrc = strdupcat (src, SEPARATOR, dp->d_name, NULL);
-                        msg = processcopy (dest, nextsrc);
+                        msg = processcopy (nextdest, nextsrc);
                         free (nextsrc);
                     }
                     closedir (dir);
@@ -449,13 +449,15 @@ char *processcopy (char *dest, char *src)
         } else {
             char *basename = strrchr (src, *SEPARATOR);
             basename = (basename) ? basename + 1 : src;
+            VERBOSE (DEBUG, fprintf (stderr, "basename '%s'\n", basename));
             char *newdest = strdupcat (dest, SEPARATOR, basename, NULL);
-            //msg = _copyfile (newdest, src);
-            VERBOSE (ERROR, fprintf (stderr, "copy '%s' to '%s'\n", src, newdest));
+            VERBOSE (DEBUG, fprintf (stderr, "copy '%s' to '%s'\n", src, newdest));
+            msg = _copyfile (newdest, src);
             free (newdest);
         }
     } else {
-        msg = strdupcat ("Can't stat file '", src, "'", NULL);
+        VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s'\n", src));
+        exit (1);
     }
 
     return msg;
@@ -486,17 +488,19 @@ int processdelete (char *name)
                 }
                 closedir (dir);
                 if (rc == 0) {
-                    //VERBOSE (DEBUG, fprintf (stderr, "rmdir '%s'\n", name));
+                    VERBOSE (DEBUG, fprintf (stderr, "rmdir '%s'\n", name));
                     rc = rmdir (name);
                 }
             } else {
                 rc = 1;
             }
         } else {
-            //VERBOSE (DEBUG, fprintf (stderr, "unlink '%s'\n", name));
+            VERBOSE (DEBUG, fprintf (stderr, "unlink '%s'\n", name));
             rc = unlink (name);
         }
     } else {
+        VERBOSE (ERROR, fprintf (stderr, "can't stat on file '%s'\n", name));
+        exit (1);
         rc = 1;
     }