diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/copyfd.c | 40 | ||||
-rw-r--r-- | libbb/libbb.h | 2 |
2 files changed, 17 insertions, 25 deletions
diff --git a/libbb/copyfd.c b/libbb/copyfd.c index 253a8cf..aa938d1 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 */ diff --git a/libbb/libbb.h b/libbb/libbb.h index 29a756b..4e324bf 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h @@ -133,7 +133,7 @@ extern pid_t* find_pid_by_name( char* pidName); extern char *find_real_root_device_name(const char* name); extern char *get_line_from_file(FILE *file); extern void print_file(FILE *file); -extern size_t copyfd(int fd1, int fd2); +extern int copyfd(int fd1, int fd2); extern int print_file_by_name(char *filename); extern char process_escape_sequence(const char **ptr); extern char *get_last_path_component(char *path); |