diff options
author | Matt Kraai <kraai@debian.org> | 2001-05-18 14:14:55 +0000 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2001-05-18 14:14:55 +0000 |
commit | d6ef07406d217a728d334ae5e49c4734b4ed26f5 (patch) | |
tree | 61708f6aa1e598e454ff0be88793bf14d7833132 /libbb/copyfd.c | |
parent | 69438154000344f0fc60b12c0d31b297c698b5f4 (diff) |
Rewrote copyfd to use library functions, terminate, and copy correct data.
Diffstat (limited to 'libbb/copyfd.c')
-rw-r--r-- | libbb/copyfd.c | 40 |
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 */ |