Copy files until EOF, not the reported file size, to deal with bad sizes in
the proc filesystem.
This commit is contained in:
parent
5246225596
commit
bf0a010cf7
@ -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);
|
||||||
|
@ -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) {
|
while (chunksize != 0) {
|
||||||
if (chunksize > BUFSIZ) {
|
if (chunksize > BUFSIZ)
|
||||||
size = BUFSIZ;
|
size = BUFSIZ;
|
||||||
} else {
|
else
|
||||||
size = chunksize;
|
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 */
|
nread = fread (buffer, 1, size, src_file);
|
||||||
/*
|
|
||||||
Local Variables:
|
if (nread != size && ferror (src_file)) {
|
||||||
c-file-style: "linux"
|
perror_msg ("read");
|
||||||
c-basic-offset: 4
|
return -1;
|
||||||
tab-width: 4
|
} else if (nread == 0) {
|
||||||
End:
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user