X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/741d654495cf4a35bd92ddf0df14e56681454ec6..3610c4583a6b187fa6fc98ad0025340c6f840d53:/io.c diff --git a/io.c b/io.c index bd1ce1ec..50eca536 100644 --- a/io.c +++ b/io.c @@ -353,8 +353,8 @@ static void whine_about_eof(int fd) exit_cleanup(0); rprintf(FERROR, RSYNC_NAME ": connection unexpectedly closed " - "(%.0f bytes read so far)\n", - (double)stats.total_read); + "(%.0f bytes received so far) [%s]\n", + (double)stats.total_read, who_am_i()); exit_cleanup(RERR_STREAMIO); } @@ -510,7 +510,7 @@ static int read_timeout(int fd, char *buf, size_t len) /* Don't write errors on a dead socket. */ if (fd == sock_f_in) - io_multiplexing_close(); + close_multiplexing_out(); rsyserr(FERROR, errno, "read error"); exit_cleanup(RERR_STREAMIO); } @@ -857,6 +857,11 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) if (msg_fd_in > maxfd) maxfd = msg_fd_in; } + if (fd != sock_f_out && iobuf_out_cnt && no_flush == 1) { + FD_SET(sock_f_out, &w_fds); + if (sock_f_out > maxfd) + maxfd = sock_f_out; + } tv.tv_sec = select_timeout; tv.tv_usec = 0; @@ -875,8 +880,14 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) if (msg_fd_in >= 0 && FD_ISSET(msg_fd_in, &r_fds)) read_msg_fd(); - if (!FD_ISSET(fd, &w_fds)) + if (!FD_ISSET(fd, &w_fds)) { + if (fd != sock_f_out && iobuf_out_cnt) { + no_flush--; + io_flush(NORMAL_FLUSH); + no_flush++; + } continue; + } n = len - total; if (bwlimit && n > bwlimit_writemax) @@ -895,10 +906,17 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) /* Don't try to write errors back across the stream. */ if (fd == sock_f_out) - io_multiplexing_close(); + close_multiplexing_out(); rsyserr(FERROR, errno, - "writefd_unbuffered failed to write %ld bytes: phase \"%s\"", - (long)len, io_write_phase); + "writefd_unbuffered failed to write %ld bytes: phase \"%s\" [%s]", + (long)len, io_write_phase, who_am_i()); + /* If the other side is sending us error messages, try + * to grab any messages they sent before they died. */ + while (fd == sock_f_out && io_multiplexing_in) { + io_timeout = 30; + readfd_unbuffered(sock_f_in, io_filesfrom_buf, + sizeof io_filesfrom_buf); + } exit_cleanup(RERR_STREAMIO); } @@ -1122,8 +1140,13 @@ int io_multiplex_write(enum msgcode code, char *buf, size_t len) return 1; } +void close_multiplexing_in(void) +{ + io_multiplexing_in = 0; +} + /** Stop output multiplexing. */ -void io_multiplexing_close(void) +void close_multiplexing_out(void) { io_multiplexing_out = 0; }