From: Laurent MAZET Date: Tue, 14 Jan 2025 17:05:42 +0000 (+0100) Subject: add function copy X-Git-Tag: v1.0~45 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=b3ecb195c566da1804073be18a6b84b31c8a1f51;p=fm.git add function copy --- diff --git a/fm.c b/fm.c index f4d10fe..88530d0 100644 --- 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: */ diff --git a/function.c b/function.c index 63333ed..2750f8b 100644 --- a/function.c +++ b/function.c @@ -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; }