aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h2
-rw-r--r--libbb/copyfd.c40
-rw-r--r--libbb/libbb.h2
3 files changed, 18 insertions, 26 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 29a756b7f..4e324bf86 100644
--- a/include/libbb.h
+++ b/include/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);
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 */
diff --git a/libbb/libbb.h b/libbb/libbb.h
index 29a756b7f..4e324bf86 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);