X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ff41a59f58614ff4e57b4c97b586dcd46e43cc5c..9ec16c83be3164bdcfe8412933d5b7fc86cabcb1:/io.c diff --git a/io.c b/io.c index aefd3ef4..20fc2ba3 100644 --- a/io.c +++ b/io.c @@ -27,6 +27,8 @@ /* if no timeout is specified then use a 60 second select timeout */ #define SELECT_TIMEOUT 60 +extern int bwlimit; + static int io_multiplexing_out; static int io_multiplexing_in; static int multiplex_in_fd; @@ -49,6 +51,7 @@ void setup_readbuffer(int f_in) static void check_timeout(void) { + extern int am_server, am_daemon; time_t t; if (!io_timeout) return; @@ -61,8 +64,10 @@ static void check_timeout(void) t = time(NULL); if (last_io && io_timeout && (t-last_io) >= io_timeout) { - rprintf(FERROR,"io timeout after %d second - exiting\n", - (int)(t-last_io)); + if (!am_server && !am_daemon) { + rprintf(FERROR,"io timeout after %d second - exiting\n", + (int)(t-last_io)); + } exit_cleanup(RERR_TIMEOUT); } } @@ -159,6 +164,11 @@ static int read_timeout(int fd, char *buf, int len) continue; } + if (n == -1 && + (errno == EWOULDBLOCK || errno == EAGAIN)) { + continue; + } + if (n == 0) { if (eof_error) { @@ -364,19 +374,35 @@ static void writefd_unbuffered(int fd,char *buf,int len) if (FD_ISSET(fd, &w_fds)) { int ret, n = len-total; - if (n > PIPE_BUF) n = PIPE_BUF; - - ret = write(fd,buf+total,n?n:1); + ret = write(fd,buf+total,n); if (ret == -1 && errno == EINTR) { continue; } + if (ret == -1 && + (errno == EWOULDBLOCK || errno == EAGAIN)) { + continue; + } + if (ret <= 0) { rprintf(FERROR,"erroring writing %d bytes - exiting\n", len); exit_cleanup(RERR_STREAMIO); } + /* Sleep after writing to limit I/O bandwidth */ + if (bwlimit) + { + tv.tv_sec = 0; + tv.tv_usec = ret * 1000 / bwlimit; + while (tv.tv_usec > 1000000) + { + tv.tv_sec++; + tv.tv_usec -= 1000000; + } + select(0, NULL, NULL, NULL, &tv); + } + total += ret; if (io_timeout) @@ -409,8 +435,8 @@ static void mplex_write(int fd, enum logcode code, char *buf, int len) SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len); - if (n > (sizeof(buf)-4)) { - n = sizeof(buf)-4; + if (n > (sizeof(buffer)-4)) { + n = sizeof(buffer)-4; } memcpy(&buffer[4], buf, n); @@ -419,7 +445,9 @@ static void mplex_write(int fd, enum logcode code, char *buf, int len) len -= n; buf += n; - writefd_unbuffered(fd, buf, len); + if (len) { + writefd_unbuffered(fd, buf, len); + } } @@ -429,7 +457,7 @@ void io_flush(void) if (!io_buffer_count || no_flush) return; if (io_multiplexing_out) { - mplex_write(fd, 0, io_buffer, io_buffer_count); + mplex_write(fd, FNONE, io_buffer, io_buffer_count); } else { writefd_unbuffered(fd, io_buffer, io_buffer_count); } @@ -599,3 +627,4 @@ void io_close_input(int fd) { buffer_f_in = -1; } +