From: Laurent Mazet Date: Mon, 13 Jan 2025 22:36:32 +0000 (+0100) Subject: wip copy (2) X-Git-Tag: v1.0~46 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=6ccc6ce1bcb3e7fe591c0c8457c75c4b104a0224;p=fm.git wip copy (2) --- diff --git a/fm.c b/fm.c index 8bd4436..f4d10fe 100644 --- a/fm.c +++ b/fm.c @@ -308,13 +308,13 @@ int main (int argc, char *argv[]) for (i = 0; i < list[panel]->nb; i++) { current = list[panel]->tab + i; if (current->selected) { - char *src = strdupcat (dirname[panel], SEPARATOR, current->name); + char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL); char *dest = dirname[(panel + 1 ) % MAXPANELS]; - if (processcopy (dest, src) != 0) { - char *buf = strdupcat ("Can't copy '", src, "' to '", dest, "'", NULL); - msgwindow (buf, winscreen, 0); + char *msg = processcopy (dest, src); + if (msg) { + msgwindow (msg, winscreen, 0); getch (); - free (buf); + free (msg); } free (src); } diff --git a/function.c b/function.c index 67ecd18..63333ed 100644 --- a/function.c +++ b/function.c @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -364,9 +366,9 @@ int filterlist (list_t *list, char *regex) return rc; } -int _copyfile (char *dest, char *src, size_t size) +char *_copyfile (char *dest, char *src) { - int rc = 0; + char *msg = NULL; int fdsrc = open (src, O_RDONLY); int fddest = open (dest, O_WRONLY | O_CREAT | O_EXCL, 0622); @@ -377,39 +379,38 @@ int _copyfile (char *dest, char *src, size_t size) if (fddest > 0) { close (fddest); } - return 1; + return strdupcat ("Can't open file '", (fdsrc < 0) ? src : dest, "'", NULL); } char bufin[BUFMAX]; - size_t nread = 0; - int saved_errno; + ssize_t nread = 0; while (nread = read(fdsrc, bufin, sizeof (bufin)), nread > 0) { char *bufout = bufin; - size_t nwritten; + ssize_t nwritten; - while ((nread > 0) && (rc == 0)) { + while ((nread > 0) && (msg == NULL)) { nwritten = write(fddest, bufout, nread); if (nwritten >= 0) { nread -= nwritten; bufout += nwritten; } else if (errno != EINTR) { - rc = 1; + msg = strdupcat ("Can't write file '", dest, "'", NULL); } } } if ((close (fddest) < 0) && (nread == 0)) { - rc = 1; + strdupcat ("Can't close file '", dest, "'", NULL); } close (fdsrc); - return rc; + return msg; } -int processcopy (char *dest, char *src) +char *processcopy (char *dest, char *src) { - int rc = 0; + char *msg = NULL; struct stat sb; #ifdef WIN32 @@ -418,50 +419,46 @@ int 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 *nextdest = strdupcat (dest, SEPARATOR, src, NULL); #ifdef WIN32 if (mkdir (nextdest) != 0) { #else - if (mkdir (nextdest, 0750) != 0) { + //if (mkdir (nextdest, 0750) != 0) { + VERBOSE (ERROR, fprintf (stderr, "mkdir '%s'\n", nextdest)); if (0) { #endif - char *msg = strdupcat (("Can't create directory '", nextdest, "'", NULL); - msgwindow (msg, winscreen, 0); - getch (); - free (msg); - rc = 1; + msg = strdupcat ("Can't create directory '", nextdest, "'", NULL); } else { DIR *dir = opendir (src); if (dir != NULL) { struct dirent *dp = NULL; - while (((dp = readdir (dir)) != NULL) && (rc == 0)) { + while (((dp = readdir (dir)) != NULL) && (msg == NULL)) { 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); + msg = processcopy (dest, nextsrc); free (nextsrc); } closedir (dir); } else { - rc = 1; + msg = strdupcat ("Can't open directory '", src, "'", NULL); } } free (nextdest); } else { - char *basename = strrstr (srcn SEPARATOR); + char *basename = strrchr (src, *SEPARATOR); + basename = (basename) ? basename + 1 : src; char *newdest = strdupcat (dest, SEPARATOR, basename, NULL); - rc = _copyfile (dest, src, sb.st_size); + //msg = _copyfile (newdest, src); + VERBOSE (ERROR, fprintf (stderr, "copy '%s' to '%s'\n", src, newdest)); free (newdest); } } else { - rc = 1; + msg = strdupcat ("Can't stat file '", src, "'", NULL); } - return rc; -} - - return 0; + return msg; } int processdelete (char *name) diff --git a/function.h b/function.h index 8de42ad..976ad62 100644 --- a/function.h +++ b/function.h @@ -39,7 +39,7 @@ void freewindow (window_t *win); int filterlist (list_t *list, char *regex); -int processcopy (char *dest, char *src); +char *processcopy (char *dest, char *src); int processdelete (char *src);