From 17a94e426ccb62970f8f4783ab3e8ab979ac7cd6 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Mon, 13 Jan 2025 19:04:30 +0100 Subject: [PATCH] wip copy --- fm.c | 4 +++ function.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/fm.c b/fm.c index 64feae1..8bd4436 100644 --- 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++) { diff --git a/function.c b/function.c index b97fc78..67ecd18 100644 --- a/function.c +++ b/function.c @@ -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; } -- 2.30.2