Checking in the g2r-basis-filename patch that ensures that the receiver
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index a094561..50eca53 100644 (file)
--- 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,14 +1140,21 @@ 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;
 }
 
 void start_write_batch(int fd)
 {
+       write_stream_flags(batch_fd);
+
        /* Some communication has already taken place, but we don't
         * enable batch writing until here so that we can write a
         * canonical record of the communication even though the