X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b0ad542928c6bde674f3dec96be446a2e2ed0548..7f459268d903c8647cfbfcc8ff0c9fda18733861:/io.c diff --git a/io.c b/io.c index 4cf33028..47b15707 100644 --- a/io.c +++ b/io.c @@ -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); } @@ -744,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; } @@ -894,10 +895,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); + /* 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); } @@ -1018,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) @@ -1119,14 +1129,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