Copy files until EOF, not the reported file size, to deal with bad sizes in

the proc filesystem.
This commit is contained in:
Matt Kraai
2001-06-11 13:58:02 +00:00
parent 5246225596
commit bf0a010cf7
2 changed files with 44 additions and 35 deletions

View File

@ -94,7 +94,7 @@ int copy_file(const char *source, const char *dest, int flags)
umask(saved_umask); umask(saved_umask);
} }
/* Recursively copy files in SOURCE. */ /* Recursively copy files in SOURCE. */
if ((dp = opendir(source)) == NULL) { if ((dp = opendir(source)) == NULL) {
perror_msg("unable to open directory `%s'", source); perror_msg("unable to open directory `%s'", source);
@ -116,7 +116,7 @@ int copy_file(const char *source, const char *dest, int flags)
free(new_source); free(new_source);
free(new_dest); free(new_dest);
} }
/* ??? What if an error occurs in readdir? */ /* ??? What if an error occurs in readdir? */
if (closedir(dp) < 0) { if (closedir(dp) < 0) {
@ -173,7 +173,8 @@ int copy_file(const char *source, const char *dest, int flags)
goto end; goto end;
} }
copy_file_chunk(sfp, dfp, source_stat.st_size); if (copy_file_chunk(sfp, dfp, -1) < 0)
status = -1;
if (fclose(dfp) < 0) { if (fclose(dfp) < 0) {
perror_msg("unable to close `%s'", dest); perror_msg("unable to close `%s'", dest);

View File

@ -29,38 +29,46 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "libbb.h" #include "libbb.h"
/* /* Copy CHUNKSIZE bytes (or until EOF if CHUNKSIZE equals -1) from SRC_FILE
* Copy chunksize bytes between two file descriptors * to DST_FILE. */
*
* unsigned long is used so that if -1 is passed as chunksize it will read as
* much as possible, and it will work with off_t or off64_t
*/
extern int copy_file_chunk(FILE *src_file, FILE *dst_file, unsigned long long chunksize) extern int copy_file_chunk(FILE *src_file, FILE *dst_file, unsigned long long chunksize)
{ {
off_t size, amount_written; size_t nread, nwritten, size;
char buffer[BUFSIZ]; /* BUFSIZ is declared in stdio.h */ char buffer[BUFSIZ];
while (chunksize > 0) {
if (chunksize > BUFSIZ) {
size = BUFSIZ;
} else {
size = chunksize;
}
amount_written = fwrite(buffer, 1, fread(buffer, 1, size, src_file), dst_file);
if (amount_written != size) {
error_msg("Couldnt write correct amount");
return(FALSE);
}
chunksize -= amount_written;
}
return (TRUE);
}
/* END CODE */ while (chunksize != 0) {
/* if (chunksize > BUFSIZ)
Local Variables: size = BUFSIZ;
c-file-style: "linux" else
c-basic-offset: 4 size = chunksize;
tab-width: 4
End: nread = fread (buffer, 1, size, src_file);
*/
if (nread != size && ferror (src_file)) {
perror_msg ("read");
return -1;
} else if (nread == 0) {
if (chunksize != -1) {
error_msg ("Unable to read all data");
return -1;
}
return 0;
}
nwritten = fwrite (buffer, 1, nread, dst_file);
if (nwritten != nread) {
if (ferror (dst_file))
perror_msg ("write");
else
error_msg ("Unable to write all data");
return -1;
}
if (chunksize != -1)
chunksize -= nwritten;
}
return 0;
}