X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/bd7e05d7996e67cf12a0b01fe9286ef2813432f4..e2d1033d5d65375dc49e31470d68ac22568fcceb:/io.c diff --git a/io.c b/io.c index c42c1c7e..70c6a22f 100644 --- a/io.c +++ b/io.c @@ -24,6 +24,9 @@ */ #include "rsync.h" +/* if no timeout is specified then use a 60 second select timeout */ +#define SELECT_TIMEOUT 60 + static int io_multiplexing_out; static int io_multiplexing_in; static int multiplex_in_fd; @@ -67,6 +70,7 @@ static char *read_buffer_p; static int read_buffer_len; static int read_buffer_size; static int no_flush; +static int no_flush_read; /* read from a socket with IO timeout. return the number of bytes read. If no bytes can be read then exit, never return @@ -75,7 +79,9 @@ static int read_timeout(int fd, char *buf, int len) { int n, ret=0; + no_flush_read++; io_flush(); + no_flush_read--; while (ret == 0) { fd_set fds; @@ -83,11 +89,10 @@ static int read_timeout(int fd, char *buf, int len) FD_ZERO(&fds); FD_SET(fd, &fds); - tv.tv_sec = io_timeout; + tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT; tv.tv_usec = 0; - if (select(fd+1, &fds, NULL, NULL, - io_timeout?&tv:NULL) != 1) { + if (select(fd+1, &fds, NULL, NULL, &tv) != 1) { check_timeout(); continue; } @@ -119,7 +124,7 @@ static int read_timeout(int fd, char *buf, int len) if (n == 0) { if (eof_error) { - rprintf(FERROR,"EOF in read_timeout\n"); + rprintf(FERROR,"unexpected EOF in read_timeout\n"); } exit_cleanup(1); } @@ -238,7 +243,7 @@ static void readfd(int fd,char *buffer,int N) int ret; int total=0; - if (read_buffer_len < N && N < 1024) { + if ((read_buffer_len < N) && (N < 1024)) { read_check(buffer_f_in); } @@ -252,7 +257,9 @@ static void readfd(int fd,char *buffer,int N) continue; } + no_flush_read++; io_flush(); + no_flush_read--; ret = read_unbuffered(fd,buffer + total,N-total); total += ret; @@ -318,7 +325,7 @@ static void writefd_unbuffered(int fd,char *buf,int len) fd_set w_fds, r_fds; int fd_count, count; struct timeval tv; - int reading; + int reading=0; int blocked=0; no_flush++; @@ -329,8 +336,10 @@ static void writefd_unbuffered(int fd,char *buf,int len) FD_SET(fd,&w_fds); fd_count = fd+1; - reading = (buffer_f_in != -1 && - read_buffer_len < MAX_READ_BUFFER); + if (!no_flush_read) { + reading = (buffer_f_in != -1 && + read_buffer_len < MAX_READ_BUFFER); + } if (reading) { FD_SET(buffer_f_in,&r_fds); @@ -338,13 +347,13 @@ static void writefd_unbuffered(int fd,char *buf,int len) fd_count = buffer_f_in+1; } - tv.tv_sec = io_timeout; + tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT; tv.tv_usec = 0; count = select(fd_count, reading?&r_fds:NULL, &w_fds,NULL, - io_timeout?&tv:NULL); + &tv); if (count <= 0) { check_timeout();