*************** *** 50,55 **** extern int preserve_hard_links; extern char *filesfrom_host; extern struct stats stats; extern struct file_list *the_file_list; const char phase_unknown[] = "unknown"; --- 50,56 ---- extern int preserve_hard_links; extern char *filesfrom_host; extern struct stats stats; + extern time_t stop_at_utime; extern struct file_list *the_file_list; const char phase_unknown[] = "unknown"; *************** *** 147,162 **** { time_t t; if (!io_timeout || ignore_timeout) return; if (!last_io_in) { - last_io_in = time(NULL); return; } - t = time(NULL); - if (t - last_io_in >= io_timeout) { if (!am_server && !am_daemon) { rprintf(FERROR, "io timeout after %d seconds -- exiting\n", --- 148,171 ---- { time_t t; + if ((!io_timeout || ignore_timeout) && !stop_at_utime) + return; + + t = time(NULL); + + if (stop_at_utime && t >= stop_at_utime) { + rprintf(FERROR, "run-time limit exceeded\n"); + exit_cleanup(RERR_TIMEOUT); + } + if (!io_timeout || ignore_timeout) return; if (!last_io_in) { + last_io_in = t; return; } if (t - last_io_in >= io_timeout) { if (!am_server && !am_daemon) { rprintf(FERROR, "io timeout after %d seconds -- exiting\n",