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);
}
/* Recursively copy files in SOURCE. */
if ((dp = opendir(source)) == NULL) {
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_dest);
}
/* ??? What if an error occurs in readdir? */
if (closedir(dp) < 0) {
@ -173,7 +173,8 @@ int copy_file(const char *source, const char *dest, int flags)
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) {
perror_msg("unable to close `%s'", dest);

View File

@ -29,38 +29,46 @@
#include <sys/stat.h>
#include "libbb.h"
/*
* Copy chunksize bytes between two file descriptors
*
* 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
*/
/* Copy CHUNKSIZE bytes (or until EOF if CHUNKSIZE equals -1) from SRC_FILE
* to DST_FILE. */
extern int copy_file_chunk(FILE *src_file, FILE *dst_file, unsigned long long chunksize)
{
off_t size, amount_written;
char buffer[BUFSIZ]; /* BUFSIZ is declared in stdio.h */
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);
}
size_t nread, nwritten, size;
char buffer[BUFSIZ];
/* END CODE */
/*
Local Variables:
c-file-style: "linux"
c-basic-offset: 4
tab-width: 4
End:
*/
while (chunksize != 0) {
if (chunksize > BUFSIZ)
size = BUFSIZ;
else
size = chunksize;
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;
}