summaryrefslogtreecommitdiffhomepage
path: root/libbb/copyfd.c
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2001-05-18 14:14:55 +0000
committerMatt Kraai <kraai@debian.org>2001-05-18 14:14:55 +0000
commitd6ef07406d217a728d334ae5e49c4734b4ed26f5 (patch)
tree61708f6aa1e598e454ff0be88793bf14d7833132 /libbb/copyfd.c
parent69438154000344f0fc60b12c0d31b297c698b5f4 (diff)
Rewrote copyfd to use library functions, terminate, and copy correct data.
Diffstat (limited to 'libbb/copyfd.c')
-rw-r--r--libbb/copyfd.c40
1 files changed, 16 insertions, 24 deletions
diff --git a/libbb/copyfd.c b/libbb/copyfd.c
index 253a8cf6e..aa938d105 100644
--- a/libbb/copyfd.c
+++ b/libbb/copyfd.c
@@ -25,36 +25,28 @@
#include "libbb.h"
-extern size_t copyfd(int fd1, int fd2)
+extern int copyfd(int fd1, int fd2)
{
- char buf[32768], *writebuf;
- int status = TRUE;
- size_t totalread = 0, bytesread, byteswritten;
+ char buf[8192];
+ ssize_t nread, nwrote;
- while(status) {
- bytesread = read(fd1, &buf, sizeof(buf));
- if(bytesread == -1) {
- error_msg("read: %s", strerror(errno));
- status = FALSE;
+ while (1) {
+ nread = safe_read(fd1, buf, sizeof(buf));
+ if (nread == 0)
break;
+ if (nread == -1) {
+ perror_msg("read");
+ return -1;
}
- byteswritten = 0;
- writebuf = buf;
- while(bytesread) {
- byteswritten = write( fd2, &writebuf, bytesread );
- if(byteswritten == -1) {
- error_msg("write: %s", strerror(errno));
- status = FALSE;
- break;
- }
- bytesread -= byteswritten;
- writebuf += byteswritten;
+
+ nwrote = full_write(fd2, buf, nread);
+ if (nwrote == -1) {
+ perror_msg("write");
+ return -1;
}
}
- if ( status == TRUE )
- return totalread;
- else
- return -1;
+
+ return 0;
}
/* END CODE */