diff options
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | libbb/copy_file.c | 2 | ||||
-rw-r--r-- | libbb/copyfd.c | 57 | ||||
-rw-r--r-- | libbb/print_file.c | 5 | ||||
-rw-r--r-- | networking/ftpgetput.c | 53 |
5 files changed, 54 insertions, 65 deletions
diff --git a/include/libbb.h b/include/libbb.h index 1e95a903e..5f437a95f 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -131,7 +131,7 @@ extern long* find_pid_by_name( const 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 int copyfd(int fd1, int fd2); +extern int copyfd(int fd1, int fd2, const off_t chunksize); 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/copy_file.c b/libbb/copy_file.c index 5f667cf4f..23a2d75a3 100644 --- a/libbb/copy_file.c +++ b/libbb/copy_file.c @@ -183,7 +183,7 @@ int copy_file(const char *source, const char *dest, int flags) } } - if (copy_file_chunk(sfp, dfp, -1) < 0) + if (copyfd(fileno(sfp), fileno(dfp), 0) == -1) status = -1; if (fclose(dfp) < 0) { 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; } diff --git a/libbb/print_file.c b/libbb/print_file.c index a6df14ed9..cdd60e7a0 100644 --- a/libbb/print_file.c +++ b/libbb/print_file.c @@ -20,6 +20,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include <sys/stat.h> #include "libbb.h" @@ -27,7 +28,9 @@ extern void print_file(FILE *file) { fflush(stdout); - copyfd(fileno(file), fileno(stdout)); + if (copyfd(fileno(file), fileno(stdout), 0) == -1) { + exit(EXIT_FAILURE); + } fclose(file); } diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 909f3b117..a23c64af1 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c @@ -56,51 +56,6 @@ typedef struct ftp_host_info_s { static char verbose_flag; static char do_continue = 0; -static int copyfd_chunk(int fd1, int fd2, const off_t chunksize) -{ - 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); - - if (nread <= 0) { - if (chunksize) { - perror_msg_and_die("read error"); - } else { - return(0); - } - } - - nwritten = full_write(fd2, buffer, nread); - - if (nwritten != nread) { - error_msg_and_die("Unable to write all data"); - } - - if (chunksize) { - remaining -= nwritten; - } - } while (remaining != 0); - - return 0; -} - static ftp_host_info_t *ftp_init(void) { ftp_host_info_t *host; @@ -252,7 +207,9 @@ static int ftp_recieve(FILE *control_stream, const char *host, const char *local } /* Copy the file */ - copyfd_chunk(fd_data, fd_local, filesize); + if (copyfd(fd_data, fd_local, filesize) == -1) { + exit(EXIT_FAILURE); + } /* close it all down */ close(fd_data); @@ -311,7 +268,9 @@ static int ftp_send(FILE *control_stream, const char *host, const char *server_p } /* transfer the file */ - copyfd_chunk(fd_local, fd_data, 0); + if (copyfd(fd_local, fd_data, 0) == -1) { + exit(EXIT_FAILURE); + } /* close it all down */ close(fd_data); |