X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0d67e00af8119231c94951f1291c96a8d09861c8..32cbfe7b17ba8ec661fc27fd773909709d100e8a:/io.c diff --git a/io.c b/io.c index f01353ff..035362e9 100644 --- a/io.c +++ b/io.c @@ -56,6 +56,7 @@ extern struct stats stats; const char phase_unknown[] = "unknown"; int select_timeout = SELECT_TIMEOUT; +int ignore_timeout = 0; int batch_fd = -1; int batch_gen_fd = -1; @@ -137,7 +138,7 @@ static void check_timeout(void) { time_t t; - if (!io_timeout) + if (!io_timeout || ignore_timeout) return; if (!last_io) { @@ -256,6 +257,14 @@ static void read_msg_fd(void) read_loop(fd, buf, len); io_multiplex_write(MSG_DELETED, buf, len); break; + case MSG_SUCCESS: + if (len != 4 || !am_generator) { + rprintf(FERROR, "invalid message %d:%d\n", tag, len); + exit_cleanup(RERR_STREAMIO); + } + read_loop(fd, buf, len); + io_multiplex_write(MSG_SUCCESS, buf, len); + break; case MSG_INFO: case MSG_ERROR: case MSG_LOG: @@ -626,6 +635,21 @@ void io_end_buffering(void) } +void maybe_send_keepalive(int allowed_lull, int ndx) +{ + if (time(NULL) - last_io >= allowed_lull) { + if (!iobuf_out || !iobuf_out_cnt) { + if (protocol_version < 29) + return; /* there's nothing we can do */ + write_int(sock_f_out, ndx); + write_shortint(sock_f_out, ITEM_IS_NEW); + } + if (iobuf_out) + io_flush(NORMAL_FLUSH); + } +} + + /** * Continue trying to read len bytes - don't return until len has been * read. @@ -704,6 +728,16 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) log_delete(line, S_IFREG); remaining = 0; break; + case MSG_SUCCESS: + if (remaining != 4) { + rprintf(FERROR, "invalid multi-message %d:%ld\n", + tag, (long)remaining); + exit_cleanup(RERR_STREAMIO); + } + read_loop(fd, line, remaining); + successful_send(IVAL(line, 0)); + remaining = 0; + break; case MSG_INFO: case MSG_ERROR: if (remaining >= sizeof line) { @@ -996,6 +1030,7 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) * to grab any messages they sent before they died. */ while (fd == sock_f_out && io_multiplexing_in) { io_timeout = select_timeout = 30; + ignore_timeout = 0; readfd_unbuffered(sock_f_in, io_filesfrom_buf, sizeof io_filesfrom_buf); }