aboutsummaryrefslogtreecommitdiff
path: root/libbb/copy_file_chunk.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/copy_file_chunk.c')
-rw-r--r--libbb/copy_file_chunk.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/libbb/copy_file_chunk.c b/libbb/copy_file_chunk.c
index bf0b06e1a..e887cbe9f 100644
--- a/libbb/copy_file_chunk.c
+++ b/libbb/copy_file_chunk.c
@@ -32,24 +32,29 @@
/*
* Copy chunksize bytes between two file descriptors
*/
-int copy_file_chunk(int srcfd, int dstfd, off_t chunksize)
+extern int copy_file_chunk(FILE *src_file, FILE *dst_file, off_t chunksize)
{
- off_t size;
- char buffer[BUFSIZ]; /* BUFSIZ is declared in stdio.h */
-
- while (chunksize > 0) {
- if (chunksize > BUFSIZ)
- size = BUFSIZ;
- else
- size = chunksize;
- if (full_write(dstfd, buffer, full_read(srcfd, buffer, size)) < size)
- return(FALSE);
- chunksize -= size;
- }
- return (TRUE);
+ off_t size, amount_written;
+ char buffer[BUFSIZ]; /* BUFSIZ is declared in stdio.h */
+
+ clearerr(src_file);
+ clearerr(dst_file);
+ 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 */
/*
Local Variables: