X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ce6c7c63189d612e0e3ae254ac57584c204b39fa..26ef00bd3c6c66240a4640aa54db1106d8b901fc:/io.c diff --git a/io.c b/io.c index eca02fa0..7aee3479 100644 --- a/io.c +++ b/io.c @@ -48,6 +48,8 @@ static void check_timeout(void) { extern int am_server, am_daemon; time_t t; + + err_list_push(); if (!io_timeout) return; @@ -81,6 +83,8 @@ static void read_error_fd(void) int fd = io_error_fd; int tag, len; + /* io_error_fd is temporarily disabled -- is this meant to + * prevent indefinite recursion? */ io_error_fd = -1; read_loop(fd, buf, 4); @@ -108,10 +112,12 @@ static int no_flush; * Read from a socket with IO timeout. return the number of bytes * read. If no bytes can be read then exit, never return a number <= 0. * - * TODO: If the remote shell connection fails, then current versions actually - * report an "unexpected EOF" error here. Since it's a fairly common mistake - * to try to use rsh when ssh is required, we should trap that: if we fail - * to read any data at all, we should give a better explanation. + * TODO: If the remote shell connection fails, then current versions + * actually report an "unexpected EOF" error here. Since it's a + * fairly common mistake to try to use rsh when ssh is required, we + * should trap that: if we fail to read any data at all, we should + * give a better explanation. We can tell whether the connection has + * started by looking e.g. at whether the remote version is known yet. */ static int read_timeout(int fd, char *buf, int len) { @@ -173,7 +179,10 @@ static int read_timeout(int fd, char *buf, int len) if (n == 0) { if (eof_error) { - rprintf(FERROR,"unexpected EOF in read_timeout\n"); + rprintf(FERROR, + "%s: connection to server unexpectedly closed" + " (%.0f bytes read so far)\n", + RSYNC_NAME, (double)stats.total_read); } exit_cleanup(RERR_STREAMIO); } @@ -332,6 +341,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) int fd_count, count; struct timeval tv; + err_list_push(); + no_flush++; while (total < len) { @@ -370,7 +381,6 @@ static void writefd_unbuffered(int fd,char *buf,int len) if (FD_ISSET(fd, &w_fds)) { int ret, n = len-total; - ret = write(fd,buf+total,n); if (ret == -1 && errno == EINTR) { @@ -455,6 +465,9 @@ static void mplex_write(int fd, enum logcode code, char *buf, int len) void io_flush(void) { int fd = multiplex_out_fd; + + err_list_push(); + if (!io_buffer_count || no_flush) return; if (io_multiplexing_out) { @@ -476,21 +489,12 @@ void io_end_buffering(int fd) } } -/* some OSes have a bug where an exit causes the pending writes on - a socket to be flushed. Do an explicit shutdown to try to prevent this */ -void io_shutdown(void) -{ - if (multiplex_out_fd != -1) close(multiplex_out_fd); - if (io_error_fd != -1) close(io_error_fd); - multiplex_out_fd = -1; - io_error_fd = -1; -} - - static void writefd(int fd,char *buf,int len) { stats.total_written += len; + err_list_push(); + if (!io_buffer || fd != multiplex_out_fd) { writefd_unbuffered(fd, buf, len); return; @@ -628,14 +632,6 @@ int io_multiplex_write(enum logcode code, char *buf, int len) return 1; } -/* write a message to the special error fd */ -int io_error_write(int f, enum logcode code, char *buf, int len) -{ - if (f == -1) return 0; - mplex_write(f, code, buf, len); - return 1; -} - /* stop output multiplexing */ void io_multiplexing_close(void) {