Fix hfs_receiver_check() on a relative path.
[rsync-patches.git] / time-limit.diff
index b29d8e7dcf79950cd541e0665ccb1a97e2055966..8d1ebffae13466ffd54b929d8a9674de01d69010 100644 (file)
@@ -9,45 +9,39 @@ To use this patch, run these commands for a successful build:
     ./configure                              (optional if already run)
     make
 
+based-on: a59a7b242393699fedeb4f66911e3fc9b4fadd73
 diff --git a/io.c b/io.c
 --- a/io.c
 +++ b/io.c
-@@ -54,6 +54,7 @@ extern int protocol_version;
- extern int remove_source_files;
+@@ -58,6 +58,7 @@ extern int remove_source_files;
  extern int preserve_hard_links;
+ extern BOOL extra_flist_sending_enabled;
  extern struct stats stats;
 +extern time_t stop_at_utime;
  extern struct file_list *cur_flist;
  #ifdef ICONV_OPTION
  extern int filesfrom_convert;
-@@ -182,16 +183,24 @@ static void check_timeout(void)
- {
-       time_t t;
+@@ -168,11 +169,19 @@ static void check_timeout(BOOL allow_keepalive)
+        * generator might be blocked trying to send checksums, it needs to
+        * know that the receiver is active).  Thus, as long as one or the
+        * other is successfully doing work, the generator will not timeout. */
+-      if (!io_timeout)
++      if (!io_timeout && !stop_at_utime)
+               return;
+       t = time(NULL);
  
-+      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 = time(NULL);
-+              last_io_in = t;
-               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",
++      if (!io_timeout)
++              return;
++
+       if (allow_keepalive) {
+               /* This may put data into iobuf.msg w/o flushing. */
+               maybe_send_keepalive(t, 0);
 diff --git a/options.c b/options.c
 --- a/options.c
 +++ b/options.c
@@ -59,25 +53,24 @@ diff --git a/options.c b/options.c
  int max_delete = INT_MIN;
  OFF_T max_size = 0;
  OFF_T min_size = 0;
-@@ -424,6 +425,8 @@ void usage(enum logcode F)
+@@ -788,6 +789,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,"     --bwlimit=RATE          limit socket I/O bandwidth\n");
 +  rprintf(F,"     --stop-at=y-m-dTh:m     Stop rsync at year-month-dayThour:minute\n");
 +  rprintf(F,"     --time-limit=MINS       Stop rsync after MINS minutes have elapsed\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,
-       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,
+@@ -812,6 +815,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
        OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_ONLY_WRITE_BATCH, OPT_MAX_SIZE,
--      OPT_NO_D, OPT_APPEND, OPT_NO_ICONV,
-+      OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_STOP_AT, OPT_TIME_LIMIT,
+       OPT_NO_D, OPT_APPEND, OPT_NO_ICONV, OPT_INFO, OPT_DEBUG,
+       OPT_USERMAP, OPT_GROUPMAP, OPT_CHOWN, OPT_BWLIMIT,
++      OPT_STOP_AT, OPT_TIME_LIMIT,
        OPT_SERVER, OPT_REFUSED_BASE = 9000};
  
  static struct poptOption long_options[] = {
-@@ -626,6 +629,8 @@ static struct poptOption long_options[] = {
+@@ -1005,6 +1009,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 },
@@ -86,7 +79,7 @@ diff --git a/options.c b/options.c
    {"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)
+@@ -1780,6 +1786,36 @@ int parse_arguments(int *argc_p, const char ***argv_p)
                        return 0;
  #endif
  
@@ -123,7 +116,7 @@ diff --git a/options.c b/options.c
                default:
                        /* A large opt value means that set_refuse_options()
                         * turned this option off. */
-@@ -1912,6 +1947,15 @@ void server_options(char **args, int *argc_p)
+@@ -2506,6 +2542,15 @@ void server_options(char **args, int *argc_p)
                args[ac++] = arg;
        }
  
@@ -142,18 +135,18 @@ diff --git a/options.c b/options.c
 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(
+@@ -433,6 +433,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
+      --bwlimit=RATE          limit socket I/O bandwidth
 +     --stop-at=y-m-dTh:m     Stop rsync at year-month-dayThour:minute
 +     --time-limit=MINS       Stop rsync after MINS minutes have elapsed
       --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
- result is an average transfer rate equaling the specified limit. A value
- of zero specifies no limit.
+@@ -2418,6 +2420,19 @@ files can show up as being rapidly sent when the data is quickly buffered,
+ while other can show up as very slow when the flushing of the output buffer
+ occurs.  This may be fixed in a future version.
  
 +dit(bf(--stop-at=y-m-dTh:m)) This option allows you to specify at what
 +time to stop rsync, in year-month-dayThour:minute numeric format (e.g.
@@ -174,7 +167,7 @@ diff --git a/rsync.yo b/rsync.yo
 diff --git a/util.c b/util.c
 --- a/util.c
 +++ b/util.c
-@@ -123,6 +123,133 @@ NORETURN void overflow_exit(const char *str)
+@@ -125,6 +125,133 @@ NORETURN void overflow_exit(const char *str)
        exit_cleanup(RERR_MALLOC);
  }
  
@@ -305,6 +298,6 @@ diff --git a/util.c b/util.c
 +      return val;
 +}
 +
- int set_modtime(const char *fname, time_t modtime, mode_t mode)
- {
- #if !defined HAVE_LUTIMES || !defined HAVE_UTIMES
+ /* 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, uint32 mod_nsec, mode_t mode)