wip copy
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 13 Jan 2025 18:04:30 +0000 (19:04 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 13 Jan 2025 18:04:30 +0000 (19:04 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index 64feae182c87bb6833e089e32725775ac6d6033d..8bd44364f9eb547d1a14b42d5d8722439abc561b 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -319,6 +319,10 @@ int main (int argc, char *argv[])
                         free (src);
                     }
                 }
+                freelist (list[panel]);
+                list[panel] = NULL;
+                freelist (list[(panel + 1) % MAXPANELS]);
+                list[(panel + 1) % MAXPANELS] = NULL;
                 break;
             case ALT_D: /* delete */
                 for (i = 0; i < list[panel]->nb; i++) {
index b97fc78bc081976e3953cd7adf952bc106d47803..67ecd184605457c83e1ec16d5dd59b5f1c47d2c7 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "function.h"
 
+#define BUFMAX 4096
+
 int strmaxlen (char *str, char ch)
 {
     int len = 0;
@@ -362,8 +364,103 @@ int filterlist (list_t *list, char *regex)
     return rc;
 }
 
+int _copyfile (char *dest, char *src, size_t size)
+{
+    int rc = 0;
+
+    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);
+        }
+        if (fddest > 0) {
+            close (fddest);
+        }
+        return 1;
+    }
+
+    char bufin[BUFMAX];
+    size_t nread = 0;
+    int saved_errno;
+    while (nread = read(fdsrc, bufin, sizeof (bufin)), nread > 0) {
+        char *bufout = bufin;
+        size_t nwritten;
+
+        while ((nread > 0) && (rc == 0)) {
+            nwritten = write(fddest, bufout, nread);
+
+            if (nwritten >= 0) {
+                nread -= nwritten;
+                bufout += nwritten;
+            } else if (errno != EINTR) {
+                rc = 1;
+            }
+        }
+    }
+
+    if ((close (fddest) < 0) && (nread == 0)) {
+        rc = 1;
+    }
+    close (fdsrc);
+
+    return rc;
+}
+
 int processcopy (char *dest, char *src)
 {
+    int rc = 0;
+
+    struct stat sb;
+#ifdef WIN32
+    if (stat (src, &sb) == 0) {
+#else /* Linux*/
+    if (lstat (src, &sb) == 0) {
+#endif
+        if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+            char nextdest = strdupcat (dest, SEPARATOR, src, NULL);
+#ifdef WIN32
+            if (mkdir (nextdest) != 0) {
+#else
+            if (mkdir (nextdest, 0750) != 0) {
+#endif
+                char *msg = strdupcat (("Can't create directory '", nextdest, "'", NULL);
+                msgwindow (msg, winscreen, 0);
+                getch ();
+                free (msg);
+                rc = 1;
+            } else {
+                DIR *dir = opendir (src);
+
+                if (dir != NULL) {
+                    struct dirent *dp = NULL;
+                    while (((dp = readdir (dir)) != NULL) && (rc == 0)) {
+                        if ((strcmp (dp->d_name, ".") == 0) || (strcmp (dp->d_name, "..") == 0)) {
+                            continue;
+                        }
+                        char *nextsrc = strdupcat (src, SEPARATOR, dp->d_name, NULL);
+                        rc = processdelete (nextdest, nextsrc);
+                        free (nextsrc);
+                    }
+                    closedir (dir);
+                } else {
+                    rc = 1;
+                }
+            }
+            free (nextdest);
+        } else {
+            char *basename = strrstr (srcn SEPARATOR);
+            char *newdest = strdupcat (dest, SEPARATOR, basename, NULL);
+            rc = _copyfile (dest, src, sb.st_size);
+            free (newdest);
+        }
+    } else {
+        rc = 1;
+    }
+
+    return rc;
+}
+
     return 0;
 }