From 090ef59b29403fbe77a7a3aa2042efd8a628c673 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 9 Nov 2013 10:32:44 -0800 Subject: [PATCH] Change safe_read() to select() before reading. --- io.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/io.c b/io.c index 3036903..28f5fe8 100644 --- a/io.c +++ b/io.c @@ -232,28 +232,10 @@ static NORETURN void whine_about_eof(BOOL allow_kluge) * the socket except very early in the transfer. */ static size_t safe_read(int fd, char *buf, size_t len) { - size_t got; - int n; + size_t got = 0; assert(fd != iobuf.in_fd); - n = read(fd, buf, len); - if ((size_t)n == len || n == 0) { - if (DEBUG_GTE(IO, 2)) - rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n); - return n; - } - if (n < 0) { - if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { - read_failed: - rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]", - (long)len, who_am_i()); - exit_cleanup(RERR_STREAMIO); - } - got = 0; - } else - got = n; - while (1) { struct timeval tv; fd_set r_fds, e_fds; @@ -282,7 +264,7 @@ static size_t safe_read(int fd, char *buf, size_t len) rprintf(FINFO, "select exception on fd %d\n", fd); */ if (FD_ISSET(fd, &r_fds)) { - n = read(fd, buf + got, len - got); + int n = read(fd, buf + got, len - got); if (DEBUG_GTE(IO, 2)) rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n); if (n == 0) @@ -290,7 +272,9 @@ static size_t safe_read(int fd, char *buf, size_t len) if (n < 0) { if (errno == EINTR) continue; - goto read_failed; + rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]", + (long)len, who_am_i()); + exit_cleanup(RERR_STREAMIO); } if ((got += (size_t)n) == len) break; -- 2.7.4