X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/08571358b19618268310c975448be5f49dd6c667..eca2adb4b3a4ca095116f54e9e0a6df19f0bd149:/io.c diff --git a/io.c b/io.c index 63df2504..a83276d5 100644 --- a/io.c +++ b/io.c @@ -52,6 +52,19 @@ extern int io_timeout; extern struct stats stats; +/** + * The connection might be dropped at some point; perhaps because the + * remote instance crashed. Just giving the offset on the stream is + * not very helpful. So instead we try to make io_phase_name point to + * something useful. + * + * @todo Perhaps we want some simple stack functionality, but there's + * no need to overdo it. + **/ +const char *io_write_phase = "unknown"; +const char *io_read_phase = "unknown"; + + /** Ignore EOF errors while reading a module listing if the remote version is 24 or less. */ int kludge_around_eof = False; @@ -405,15 +418,15 @@ static void sleep_for_bwlimit(int bytes_written) if (!bwlimit) return; + + assert(bytes_written > 0); + assert(bwlimit > 0); - tv.tv_sec = 0; tv.tv_usec = bytes_written * 1000 / bwlimit; + tv.tv_sec = tv.tv_usec / 1000000; + tv.tv_usec = tv.tv_usec % 1000000; - while (tv.tv_usec > 1000000) { - tv.tv_sec++; - tv.tv_usec -= 1000000; - } - select(0, NULL, NULL, NULL, tv); + select(0, NULL, NULL, NULL, &tv); } @@ -491,8 +504,8 @@ static void writefd_unbuffered(int fd,char *buf,size_t len) * across the stream */ io_multiplexing_close(); rprintf(FERROR, RSYNC_NAME - ": writefd_unbuffered failed to write %ld bytes: %s\n", - (long) len, + ": writefd_unbuffered failed to write %ld bytes: phase \"%s\": %s\n", + (long) len, io_write_phase, strerror(errno)); exit_cleanup(RERR_STREAMIO); }