X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ce6c7c63189d612e0e3ae254ac57584c204b39fa..ff81e809f46293171a332a2faa320aca57277b4b:/io.c diff --git a/io.c b/io.c index eca02fa0..1069a2e5 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" + " (%ld bytes read so far)\n", + RSYNC_NAME, 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) { @@ -455,6 +466,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 +490,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 +633,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) {