./configure (optional if already run)
make
+based-on: 40afd365cc8ca968fd16e161d24df5b8a8a520cc
diff --git a/io.c b/io.c
--- a/io.c
+++ b/io.c
-@@ -54,6 +54,7 @@ extern int protocol_version;
+@@ -53,6 +53,7 @@ extern int protocol_version;
extern int remove_source_files;
extern int preserve_hard_links;
extern struct stats stats;
extern struct file_list *cur_flist;
#ifdef ICONV_OPTION
extern int filesfrom_convert;
-@@ -219,16 +220,24 @@ static void check_timeout(void)
+@@ -123,11 +124,19 @@ static void check_timeout(void)
{
- time_t t;
+ time_t t, chk;
+- if (!io_timeout || ignore_timeout)
+ if ((!io_timeout || ignore_timeout) && !stop_at_utime)
-+ return;
-+
-+ t = time(NULL);
-+
+ 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 = time(NULL);
-+ last_io_in = t;
- return;
- }
++ if (!io_timeout || ignore_timeout)
++ return;
++
+ if (!last_io_in)
+ last_io_in = t;
-- t = time(NULL);
--
- if (t - last_io_in >= io_timeout) {
- if (!am_server && !am_daemon) {
- rprintf(FERROR, "io timeout after %d seconds -- exiting\n",
diff --git a/options.c b/options.c
--- a/options.c
+++ b/options.c
-@@ -113,6 +113,7 @@ size_t bwlimit_writemax = 0;
+@@ -111,6 +111,7 @@ size_t bwlimit_writemax = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
int need_messages_from_generator = 0;
int max_delete = INT_MIN;
OFF_T max_size = 0;
OFF_T min_size = 0;
-@@ -424,6 +425,8 @@ void usage(enum logcode F)
+@@ -423,6 +424,8 @@ void usage(enum logcode F)
rprintf(F," --password-file=FILE read daemon-access password from FILE\n");
rprintf(F," --list-only list the files instead of copying them\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
rprintf(F," --write-batch=FILE write a batched update to FILE\n");
rprintf(F," --only-write-batch=FILE like --write-batch but w/o updating destination\n");
rprintf(F," --read-batch=FILE read a batched update from FILE\n");
-@@ -446,7 +449,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
+@@ -445,7 +448,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, OPT_HELP,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_MIN_SIZE, OPT_CHMOD,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
OPT_SERVER, OPT_REFUSED_BASE = 9000};
static struct poptOption long_options[] = {
-@@ -626,6 +629,8 @@ static struct poptOption long_options[] = {
+@@ -625,6 +628,8 @@ static struct poptOption long_options[] = {
{"no-timeout", 0, POPT_ARG_VAL, &io_timeout, 0, 0, 0 },
{"contimeout", 0, POPT_ARG_INT, &connect_timeout, 0, 0, 0 },
{"no-contimeout", 0, POPT_ARG_VAL, &connect_timeout, 0, 0, 0 },
{"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
{"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
{"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
-@@ -1260,6 +1265,36 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -1259,6 +1264,36 @@ int parse_arguments(int *argc_p, const char ***argv_p)
return 0;
#endif
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -1911,6 +1946,15 @@ void server_options(char **args, int *argc_p)
+@@ -1924,6 +1959,15 @@ void server_options(char **args, int *argc_p)
args[ac++] = arg;
}
diff --git a/rsync.yo b/rsync.yo
--- a/rsync.yo
+++ b/rsync.yo
-@@ -418,6 +418,8 @@ to the detailed description below for a complete description. verb(
+@@ -435,6 +435,8 @@ to the detailed description below for a complete description. verb(
--password-file=FILE read daemon-access password from FILE
--list-only list the files instead of copying them
--bwlimit=KBPS limit I/O bandwidth; KBytes per second
--write-batch=FILE write a batched update to FILE
--only-write-batch=FILE like --write-batch but w/o updating dest
--read-batch=FILE read a batched update from FILE
-@@ -2025,6 +2027,19 @@ transfer was too fast, it will wait before sending the next data block. The
+@@ -2153,6 +2155,19 @@ transfer was too fast, it will wait before sending the next data block. The
result is an average transfer rate equaling the specified limit. A value
of zero specifies no limit.
+ return val;
+}
+
+ /* This returns 0 for success, 1 for a symlink if symlink time-setting
+ * is not possible, or -1 for any other error. */
int set_modtime(const char *fname, time_t modtime, mode_t mode)
- {
- #if !defined HAVE_LUTIMES || !defined HAVE_UTIMES