X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/cdf236aaf5461d02ebd5c1a9f5d6d7ad970af3c8..e65154085cd6b58fada9b8f3070448e8bbad6111:/io.c diff --git a/io.c b/io.c index 16500731..2dd6d41f 100644 --- a/io.c +++ b/io.c @@ -574,7 +574,7 @@ static int read_timeout(int fd, char *buf, size_t len) len -= n; ret += n; - if (io_timeout && fd == sock_f_in) + if (fd == sock_f_in && (io_timeout || am_generator)) last_io = time(NULL); } @@ -665,6 +665,13 @@ void io_end_buffering(void) } +void maybe_flush_socket(void) +{ + if (iobuf_out && iobuf_out_cnt && time(NULL) - last_io >= 5) + io_flush(NORMAL_FLUSH); +} + + void maybe_send_keepalive(void) { if (time(NULL) - last_io >= allowed_lull) { @@ -706,7 +713,11 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) static size_t remaining; static size_t iobuf_in_ndx; int tag, ret = 0; - char line[MAXPATHLEN+1]; +#if MAXPATHLEN < 4096 + char line[4096+1024]; +#else + char line[MAXPATHLEN+1024]; +#endif if (!iobuf_in || fd != sock_f_in) return read_timeout(fd, buf, len); @@ -888,7 +899,7 @@ int read_vstring(int f, char *buf, int bufsize) if (len >= bufsize) { rprintf(FERROR, "over-long vstring received (%d > %d)\n", len, bufsize - 1); - exit_cleanup(RERR_PROTOCOL); + return -1; } if (len) @@ -1006,7 +1017,7 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) { size_t n, total = 0; fd_set w_fds, r_fds; - int maxfd, count, ret; + int maxfd, count, ret, using_r_fds; struct timeval tv; no_flush++; @@ -1021,18 +1032,15 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) FD_SET(msg_fd_in,&r_fds); 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; - } + using_r_fds = 1; + } else + using_r_fds = 0; tv.tv_sec = select_timeout; tv.tv_usec = 0; errno = 0; - count = select(maxfd + 1, msg_fd_in >= 0 ? &r_fds : NULL, + count = select(maxfd + 1, using_r_fds ? &r_fds : NULL, &w_fds, NULL, &tv); if (count <= 0) { @@ -1042,17 +1050,11 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) continue; } - if (msg_fd_in >= 0 && FD_ISSET(msg_fd_in, &r_fds)) + if (using_r_fds && FD_ISSET(msg_fd_in, &r_fds)) read_msg_fd(); - if (!FD_ISSET(fd, &w_fds)) { - if (fd != sock_f_out && iobuf_out_cnt) { - no_flush--; - io_flush(NORMAL_FLUSH); - no_flush++; - } + if (!FD_ISSET(fd, &w_fds)) continue; - } n = len - total; if (bwlimit && n > bwlimit_writemax) @@ -1089,7 +1091,7 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) total += ret; if (fd == sock_f_out) { - if (io_timeout) + if (io_timeout || am_generator) last_io = time(NULL); sleep_for_bwlimit(ret); }