aboutsummaryrefslogtreecommitdiff
path: root/libbb/copyfd.c
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2002-12-13 08:20:44 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2002-12-13 08:20:44 +0000
commit25fe94fd32f39a76294456a7bc7b8dd0595afb0d (patch)
tree5f41636eb6f772de78a17e90189da6aeee3f32a7 /libbb/copyfd.c
parenta67dffe186eefb6cf75c08422dbfa0e4a752c692 (diff)
downloadbusybox-25fe94fd32f39a76294456a7bc7b8dd0595afb0d.tar.gz
Merge copyfd and copy_file_chunk
Diffstat (limited to 'libbb/copyfd.c')
-rw-r--r--libbb/copyfd.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/libbb/copyfd.c b/libbb/copyfd.c
index 22d8c3996..4df1fd084 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;
}