If we fail writing to the socket and we're receiving error messages
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 925b13e..f3ea2a6 100644 (file)
--- a/io.c
+++ b/io.c
@@ -55,6 +55,7 @@ extern struct stats stats;
 const char phase_unknown[] = "unknown";
 int select_timeout = SELECT_TIMEOUT;
 int batch_fd = -1;
+int batch_gen_fd = -1;
 
 /**
  * The connection might be dropped at some point; perhaps because the
@@ -743,13 +744,14 @@ int64 read_longint(int f)
        if ((int32)ret != (int32)0xffffffff)
                return ret;
 
-#ifdef NO_INT64
-       rprintf(FERROR,"Integer overflow - attempted 64 bit offset\n");
-       exit_cleanup(RERR_UNSUPPORTED);
-#else
+#ifdef INT64_IS_OFF_T
+       if (sizeof (int64) < 8) {
+               rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
+               exit_cleanup(RERR_UNSUPPORTED);
+       }
+#endif
        readfd(f,b,8);
        ret = IVAL(b,0) | (((int64)IVAL(b,4))<<32);
-#endif
 
        return ret;
 }
@@ -897,6 +899,13 @@ static void writefd_unbuffered(int fd,char *buf,size_t len)
                        rsyserr(FERROR, errno,
                                "writefd_unbuffered failed to write %ld bytes: phase \"%s\"",
                                (long)len, io_write_phase);
+                       /* If the other side is sending us error messages, try
+                        * to grab any messages they sent before they died. */
+                       while (fd == sock_f_out && am_sender) {
+                               io_timeout = 30;
+                               readfd_unbuffered(sock_f_in, io_filesfrom_buf,
+                                                 sizeof io_filesfrom_buf);
+                       }
                        exit_cleanup(RERR_STREAMIO);
                }
 
@@ -1017,16 +1026,18 @@ void write_longint(int f, int64 x)
                return;
        }
 
-#ifdef NO_INT64
-       rprintf(FERROR,"Integer overflow - attempted 64 bit offset\n");
-       exit_cleanup(RERR_UNSUPPORTED);
-#else
+#ifdef INT64_IS_OFF_T
+       if (sizeof (int64) < 8) {
+               rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
+               exit_cleanup(RERR_UNSUPPORTED);
+       }
+#endif
+
        write_int(f, (int32)0xFFFFFFFF);
        SIVAL(b,0,(x&0xFFFFFFFF));
        SIVAL(b,4,((x>>32)&0xFFFFFFFF));
 
        writefd(f,b,8);
-#endif
 }
 
 void write_buf(int f,char *buf,size_t len)
@@ -1035,12 +1046,11 @@ void write_buf(int f,char *buf,size_t len)
 }
 
 /** Write a string to the connection */
-static void write_sbuf(int f,char *buf)
+void write_sbuf(int f, char *buf)
 {
        writefd(f, buf, strlen(buf));
 }
 
-
 void write_byte(int f,unsigned char c)
 {
        writefd(f, (char *)&c, 1);
@@ -1127,6 +1137,8 @@ void io_multiplexing_close(void)
 
 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