X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/909ce14fc4ee350f4067730db563cbf0961891a3..6479c2ed3f08ee11929449d01e01c9b4c87b1314:/io.c diff --git a/io.c b/io.c index 6085745d..1d406490 100644 --- a/io.c +++ b/io.c @@ -19,11 +19,22 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* - socket and pipe IO utilities used in rsync +/** + * + * @file io.c + * + * Socket and pipe IO utilities used in rsync. + * + * rsync provides its own multiplexing system, which is used to send + * stderr and stdout over a single socket. We need this because + * stdout normally carries the binary data stream, and stderr all our + * error messages. + * + * For historical reasons this is off during the start of the + * connection, but it's switched on quite early using + * io_start_multiplex_out() and io_start_multiplex_in(). + **/ - tridge, June 1996 - */ #include "rsync.h" /* if no timeout is specified then use a 60 second select timeout */ @@ -86,7 +97,7 @@ void io_set_error_fd(int fd) static void read_error_fd(void) { char buf[200]; - int n; + size_t n; int fd = io_error_fd; int tag, len; @@ -103,7 +114,8 @@ static void read_error_fd(void) while (len) { n = len; - if (n > (sizeof(buf)-1)) n = sizeof(buf)-1; + if (n > (sizeof(buf)-1)) + n = sizeof(buf)-1; read_loop(fd, buf, n); rwrite((enum logcode)tag, buf, n); len -= n; @@ -255,7 +267,7 @@ static void read_loop (int fd, char *buf, size_t len) */ static int read_unbuffered(int fd, char *buf, size_t len) { - static int remaining; + static size_t remaining; int tag, ret = 0; char line[1024]; @@ -310,7 +322,7 @@ static int read_unbuffered(int fd, char *buf, size_t len) static void readfd (int fd, char *buffer, size_t N) { int ret; - int total=0; + size_t total=0; while (total < N) { io_flush(); @@ -376,10 +388,11 @@ unsigned char read_byte(int f) return c; } -/* write len bytes to fd */ +/* Write len bytes to fd. This underlies the multiplexing system, + * which is always called by application code. */ static void writefd_unbuffered(int fd,char *buf,size_t len) { - int total = 0; + size_t total = 0; fd_set w_fds, r_fds; int fd_count, count; struct timeval tv; @@ -426,7 +439,8 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) } if (FD_ISSET(fd, &w_fds)) { - int ret, n = len-total; + int ret; + size_t n = len-total; ret = write(fd,buf+total,n); if (ret == -1 && errno == EINTR) { @@ -440,8 +454,11 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) } if (ret <= 0) { - rprintf(FERROR, - "error writing %d unbuffered bytes" + /* Don't try to write errors back + * across the stream */ + io_multiplexing_close(); + rprintf(FERROR, RSYNC_NAME + ": error writing %d unbuffered bytes" " - exiting: %s\n", len, strerror(errno)); exit_cleanup(RERR_STREAMIO); @@ -488,7 +505,7 @@ void io_start_buffering(int fd) static void mplex_write(int fd, enum logcode code, char *buf, size_t len) { char buffer[4096]; - int n = len; + size_t n = len; SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len); @@ -525,8 +542,7 @@ void io_flush(void) } -/* XXX: fd is ignored, which seems a little strange. */ -void io_end_buffering(int fd) +void io_end_buffering(void) { io_flush(); if (!io_multiplexing_out) { @@ -547,7 +563,7 @@ static void writefd(int fd,char *buf,size_t len) } while (len) { - int n = MIN(len, IO_BUFFER_SIZE-io_buffer_count); + int n = MIN((int) len, IO_BUFFER_SIZE-io_buffer_count); if (n > 0) { memcpy(io_buffer+io_buffer_count, buf, n); buf += n;