From: Andrew Tridgell Date: Sun, 9 Sep 2001 04:42:09 +0000 (+0000) Subject: fixed check for timeout in generator X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/a57873b71028ac790cc81f41468514d008d5c771 fixed check for timeout in generator the generator can easily make no progress for a long time, so don't do timeout processing checks --- diff --git a/generator.c b/generator.c index 767e86c7..6b242683 100644 --- a/generator.c +++ b/generator.c @@ -429,6 +429,11 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) rprintf(FINFO,"generator starting pid=%d count=%d\n", (int)getpid(),flist->count); + /* we expect to just sit around now, so don't exit on a + timeout. If we really get a timeout then the other process should + exit */ + io_timeout = 0; + for (i = 0; i < flist->count; i++) { struct file_struct *file = flist->files[i]; mode_t saved_mode = file->mode; @@ -458,11 +463,6 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) write_int(f,-1); - /* we expect to just sit around now, so don't exit on a - timeout. If we really get a timeout then the other process should - exit */ - io_timeout = 0; - if (remote_version >= 13) { /* in newer versions of the protocol the files can cycle through the system more than once to catch initial checksum errors */ diff --git a/io.c b/io.c index a451c133..e57d0708 100644 --- a/io.c +++ b/io.c @@ -174,6 +174,7 @@ static int read_timeout (int fd, char *buf, int len) fd_set fds; struct timeval tv; int fd_count = fd+1; + int count; FD_ZERO(&fds); FD_SET(fd, &fds); @@ -187,11 +188,16 @@ static int read_timeout (int fd, char *buf, int len) errno = 0; - if (select(fd_count, &fds, NULL, NULL, &tv) < 1) { + count = select(fd_count, &fds, NULL, NULL, &tv); + + if (count == 0) { + check_timeout(); + } + + if (count <= 0) { if (errno == EBADF) { exit_cleanup(RERR_SOCKETIO); } - check_timeout(); continue; } @@ -402,11 +408,14 @@ static void writefd_unbuffered(int fd,char *buf,int len) &w_fds,NULL, &tv); + if (count == 0) { + check_timeout(); + } + if (count <= 0) { if (errno == EBADF) { exit_cleanup(RERR_SOCKETIO); } - check_timeout(); continue; }