diff options
author | Glenn L McGrath | 2002-12-13 08:20:44 +0000 |
---|---|---|
committer | Glenn L McGrath | 2002-12-13 08:20:44 +0000 |
commit | 25fe94fd32f39a76294456a7bc7b8dd0595afb0d (patch) | |
tree | 5f41636eb6f772de78a17e90189da6aeee3f32a7 /libbb/copyfd.c | |
parent | a67dffe186eefb6cf75c08422dbfa0e4a752c692 (diff) | |
download | busybox-25fe94fd32f39a76294456a7bc7b8dd0595afb0d.zip busybox-25fe94fd32f39a76294456a7bc7b8dd0595afb0d.tar.gz |
Merge copyfd and copy_file_chunk
Diffstat (limited to 'libbb/copyfd.c')
-rw-r--r-- | libbb/copyfd.c | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/libbb/copyfd.c b/libbb/copyfd.c index 22d8c39..4df1fd0 100644 --- a/libbb/copyfd.c +++ b/libbb/copyfd.c @@ -24,27 +24,54 @@ #include <errno.h> #include "libbb.h" - -extern int copyfd(int fd1, int fd2) +/* If chunksize is 0 copy untill EOF */ +extern int copyfd(int fd1, int fd2, const off_t chunksize) { - char buf[8192]; - ssize_t nread, nwrote; + size_t nread; + size_t nwritten; + size_t size; + size_t remaining; + char buffer[BUFSIZ]; + + if (chunksize) { + remaining = chunksize; + } else { + remaining = -1; + } + + do { + if ((chunksize > BUFSIZ) || (chunksize == 0)) { + size = BUFSIZ; + } else { + size = chunksize; + } + + nread = safe_read(fd1, buffer, size); - while (1) { - nread = safe_read(fd1, buf, sizeof(buf)); - if (nread == 0) - break; if (nread == -1) { - perror_msg("read"); - return -1; + perror_msg("read failure"); + return(-1); } + else if (nread == 0) { + if (chunksize) { + error_msg("Unable to read all data"); + return(-1); + } else { + return(0); + } + } + + nwritten = full_write(fd2, buffer, nread); - nwrote = full_write(fd2, buf, nread); - if (nwrote == -1) { - perror_msg("write"); - return -1; + if (nwritten != nread) { + error_msg("Unable to write all data"); + return(-1); } - } + + if (chunksize) { + remaining -= nwritten; + } + } while (remaining != 0); return 0; } |