This patches creates two new command line options as follows:
- --delete-dir
- --delete-suffix
+ --backup-dir-rm
+ --backup-suffix-rm=SUFFIX
-The delete-dir and delete-suffix options give the ability to store
-backup of deleted files on the receiver in different directories
-or with different suffix than the backup of files that have been
-changed but that are still on the source drive. Both commands can
-be combined.
+The backup-dir-rm and backup-suffix-rm options give the ability to store
+backup of removed files on the receiver in different directories or with
+different suffix than the backup of files that have been changed but that
+are still on the source drive. Both commands can be combined.
The default behaviour if one or both of the options are not specified
is the previous behaviour, both backups use the same directory or
extern int verbose;
extern int backup_suffix_len;
-+extern int delete_suffix_len;
++extern int backup_suffix_rm_len;
extern int backup_dir_len;
-+extern int delete_dir_len;
++extern int backup_dir_rm_len;
extern unsigned int backup_dir_remainder;
-+extern unsigned int delete_dir_remainder;
++extern unsigned int backup_dir_rm_remainder;
extern char backup_dir_buf[MAXPATHLEN];
-+extern char delete_dir_buf[MAXPATHLEN];
++extern char backup_dir_rm_buf[MAXPATHLEN];
extern char *backup_suffix;
-+extern char *delete_suffix;
++extern char *backup_suffix_rm;
extern char *backup_dir;
-+extern char *delete_dir;
++extern char *backup_dir_rm;
extern int am_root;
extern int preserve_devices;
+static char *get_delete_name(char *fname)
+{
-+ if (delete_dir) {
-+ if (stringjoin(delete_dir_buf + delete_dir_len, delete_dir_remainder,
-+ fname, delete_suffix, NULL) < delete_dir_remainder)
-+ return delete_dir_buf;
++ if (backup_dir_rm) {
++ if (stringjoin(backup_dir_rm_buf + backup_dir_rm_len, backup_dir_rm_remainder,
++ fname, backup_suffix_rm, NULL) < backup_dir_rm_remainder)
++ return backup_dir_rm_buf;
+ } else {
-+ if (stringjoin(delete_dir_buf, MAXPATHLEN,
-+ fname, delete_suffix, NULL) < MAXPATHLEN)
-+ return delete_dir_buf;
++ if (stringjoin(backup_dir_rm_buf, MAXPATHLEN,
++ fname, backup_suffix_rm, NULL) < MAXPATHLEN)
++ return backup_dir_rm_buf;
+ }
+
+ rprintf(FERROR, "delete filename too long\n");
{
STRUCT_STAT st;
- char *rel = fullpath + backup_dir_len;
-+ int dir_len = deleting ? delete_dir_len : backup_dir_len;
++ int dir_len = deleting ? backup_dir_rm_len : backup_dir_len;
+ char *rel = fullpath + dir_len;
char *end = rel + strlen(rel);
char *p = end;
return make_simple_backup(fname);
}
+
-+/* backup switch routine called only when backing-up deleted file */
++/* backup switch routine called only when backing-up removed file */
+int safe_delete(char *fname)
+{
+ int ret;
+ deleting = 0;
+ return ret;
+}
---- orig/flist.c 2005-01-25 12:14:14
+--- orig/flist.c 2005-01-28 19:08:20
+++ flist.c 2005-01-24 02:21:33
@@ -47,6 +47,8 @@ extern char curr_dir[MAXPATHLEN];
extern unsigned int curr_dir_len;
extern char *backup_dir;
extern char *backup_suffix;
-+extern char *delete_dir;
-+extern char *delete_suffix;
++extern char *backup_dir_rm;
++extern char *backup_suffix_rm;
extern int filesfrom_fd;
extern int one_file_system;
extern int implied_dirs;
extern int make_backups;
extern int backup_suffix_len;
-+extern int delete_suffix_len;
++extern int backup_suffix_rm_len;
extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
-@@ -1659,10 +1662,14 @@ char *f_name(struct file_struct *f)
+@@ -1674,10 +1677,14 @@ char *f_name(struct file_struct *f)
return f_name_to(f, names[n]);
}
- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
+ if (k > 0 && strcmp(fn+k, backup_suffix) == 0)
+ return 1;
-+ k += backup_suffix_len - delete_suffix_len;
-+ return k > 0 && strcmp(fn+k, delete_suffix) == 0;
++ k += backup_suffix_len - backup_suffix_rm_len;
++ return k > 0 && strcmp(fn+k, backup_suffix_rm) == 0;
}
void delete_in_dir(struct file_list *flist, char *fname)
-@@ -1716,11 +1723,12 @@ void delete_in_dir(struct file_list *fli
+@@ -1731,11 +1738,12 @@ void delete_in_dir(struct file_list *fli
|| (delete_during && S_ISDIR(mode)
&& !S_ISDIR(flist->files[j]->mode))) {
char *f = f_name(del_flist->files[i]);
- if (make_backups && (backup_dir || !is_backup_file(f))
+ int backup_file = is_backup_file(f);
-+ if (make_backups && (delete_dir || !backup_file)
++ if (make_backups && (backup_dir_rm || !backup_file)
&& !S_ISDIR(mode)) {
- make_backup(f);
+ safe_delete(f);
safe_fname(f));
}
} else {
---- orig/options.c 2005-01-25 12:14:14
-+++ options.c 2004-11-27 18:37:18
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:17:35
@@ -119,10 +119,14 @@ int no_detach = 0;
int write_batch = 0;
int read_batch = 0;
int backup_dir_len = 0;
-+int delete_dir_len = 0;
++int backup_dir_rm_len = 0;
int backup_suffix_len;
-+int delete_suffix_len;
++int backup_suffix_rm_len;
unsigned int backup_dir_remainder;
-+unsigned int delete_dir_remainder;
++unsigned int backup_dir_rm_remainder;
char *backup_suffix = NULL;
-+char *delete_suffix = NULL;
++char *backup_suffix_rm = NULL;
char *tmpdir = NULL;
char *partial_dir = NULL;
char *basis_dir[MAX_BASIS_DIRS+1];
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
-+char *delete_dir = NULL;
++char *backup_dir_rm = NULL;
char backup_dir_buf[MAXPATHLEN];
-+char delete_dir_buf[MAXPATHLEN];
++char backup_dir_rm_buf[MAXPATHLEN];
int rsync_port = 0;
int compare_dest = 0;
int copy_dest = 0;
-@@ -251,7 +257,9 @@ void usage(enum logcode F)
- rprintf(F," --no-implied-dirs don't send implied dirs with -R\n");
+@@ -256,6 +262,8 @@ void usage(enum logcode F)
rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
- rprintf(F," --backup-dir make backups into this directory\n");
-+ rprintf(F," --delete-dir make backups of deleted files into this directory\n");
- rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
-+ rprintf(F," --delete-suffix=SUFFIX deleted files suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
- rprintf(F," -u, --update update only (don't overwrite newer files)\n");
+ rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n");
+ rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
++ rprintf(F," --backup-dir-rm make backups of removed files into current dir\n");
++ rprintf(F," --backup-suffix-rm=SUF set removed-files suffix (defaults to --suffix)\n");
+ rprintf(F," -u, --update skip files that are newer on the receiver\n");
rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
rprintf(F," -d, --dirs transfer directories without recursing\n");
-@@ -342,6 +350,7 @@ static struct poptOption long_options[]
+@@ -348,6 +356,7 @@ static struct poptOption long_options[]
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
{"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
-+ {"delete-suffix", 0, POPT_ARG_STRING, &delete_suffix, 0, 0, 0 },
++ {"backup-suffix-rm", 0, POPT_ARG_STRING, &backup_suffix_rm, 0, 0, 0 },
{"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
{"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
{"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
-@@ -416,6 +425,7 @@ static struct poptOption long_options[]
+@@ -424,6 +433,7 @@ static struct poptOption long_options[]
{"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
{"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
-+ {"delete-dir", 0, POPT_ARG_STRING, &delete_dir, 0, 0, 0 },
++ {"backup-dir-rm", 0, POPT_ARG_STRING, &backup_dir_rm, 0, 0, 0 },
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
{"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
{"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
-@@ -918,6 +928,8 @@ int parse_arguments(int *argc, const cha
+@@ -932,6 +942,8 @@ int parse_arguments(int *argc, const cha
partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
if (backup_dir)
backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
-+ if (delete_dir)
-+ delete_dir = sanitize_path(NULL, delete_dir, NULL, 0);
++ if (backup_dir_rm)
++ backup_dir_rm = sanitize_path(NULL, backup_dir_rm, NULL, 0);
if (files_from)
files_from = sanitize_path(NULL, files_from, NULL, 0);
}
-@@ -944,6 +956,12 @@ int parse_arguments(int *argc, const cha
+@@ -958,6 +970,12 @@ int parse_arguments(int *argc, const cha
if (check_filter(elp, backup_dir, 1) < 0)
goto options_rejected;
}
-+ /* Clean delete_dir same as for backup_dir */
-+ if (delete_dir) {
-+ clean_fname(delete_dir, 1);
-+ if (check_exclude(elp, delete_dir, 1) < 0)
++ /* Clean backup_dir_rm same as for backup_dir */
++ if (backup_dir_rm) {
++ clean_fname(backup_dir_rm, 1);
++ if (check_exclude(elp, backup_dir_rm, 1) < 0)
+ goto options_rejected;
+ }
}
if (server_filter_list.head && files_from) {
clean_fname(files_from, 1);
-@@ -964,6 +982,16 @@ int parse_arguments(int *argc, const cha
+@@ -978,6 +996,16 @@ int parse_arguments(int *argc, const cha
backup_suffix);
return 0;
}
-+ /* if deleted_suffix not supplied, default to backup_suffix */
-+ if (!delete_suffix)
-+ delete_suffix = delete_dir ? "" : backup_suffix;
-+ delete_suffix_len = strlen(delete_suffix);
-+ if (strchr(delete_suffix, '/') != NULL) {
++ /* if suffix_rm not supplied, default to backup_suffix */
++ if (!backup_suffix_rm)
++ backup_suffix_rm = backup_dir_rm ? "" : backup_suffix;
++ backup_suffix_rm_len = strlen(backup_suffix_rm);
++ if (strchr(backup_suffix_rm, '/') != NULL) {
+ snprintf(err_buf, sizeof err_buf,
-+ "--delete-suffix cannot contain slashes: %s\n",
-+ delete_suffix);
++ "--backup-suffix-rm cannot contain slashes: %s\n",
++ backup_suffix_rm);
+ return 0;
+ }
if (backup_dir) {
backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf);
backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len;
-@@ -983,6 +1011,31 @@ int parse_arguments(int *argc, const cha
+@@ -997,6 +1025,31 @@ int parse_arguments(int *argc, const cha
"--suffix cannot be a null string without --backup-dir\n");
return 0;
}
-+ /* If delete_dir not supplied default to backup_dir if it has been supplied */
-+ if (backup_dir && !delete_dir) {
-+ delete_dir = backup_dir;
-+ delete_dir_len = backup_dir_len;
-+ delete_dir_remainder = backup_dir_remainder;
-+ strlcpy(delete_dir_buf, backup_dir_buf, sizeof backup_dir_buf);
-+ } else if (delete_dir) {
-+ delete_dir_len = strlcpy(delete_dir_buf, delete_dir, sizeof delete_dir_buf);
-+ delete_dir_remainder = sizeof delete_dir_buf - delete_dir_len;
-+ if (delete_dir_remainder < 32) {
++ /* If backup_dir_rm not supplied default to backup_dir if it has been supplied */
++ if (backup_dir && !backup_dir_rm) {
++ backup_dir_rm = backup_dir;
++ backup_dir_rm_len = backup_dir_len;
++ backup_dir_rm_remainder = backup_dir_remainder;
++ strlcpy(backup_dir_rm_buf, backup_dir_buf, sizeof backup_dir_buf);
++ } else if (backup_dir_rm) {
++ backup_dir_rm_len = strlcpy(backup_dir_rm_buf, backup_dir_rm, sizeof backup_dir_rm_buf);
++ backup_dir_rm_remainder = sizeof backup_dir_rm_buf - backup_dir_rm_len;
++ if (backup_dir_rm_remainder < 32) {
+ snprintf(err_buf, sizeof err_buf,
-+ "the --delete-dir path is WAY too long.\n");
++ "the --backup-dir-rm path is WAY too long.\n");
+ return 0;
+ }
-+ if (delete_dir_buf[delete_dir_len - 1] != '/') {
-+ delete_dir_buf[delete_dir_len++] = '/';
-+ delete_dir_buf[delete_dir_len] = '\0';
++ if (backup_dir_rm_buf[backup_dir_rm_len - 1] != '/') {
++ backup_dir_rm_buf[backup_dir_rm_len++] = '/';
++ backup_dir_rm_buf[backup_dir_rm_len] = '\0';
+ }
+ if (verbose > 1 && !am_sender)
-+ rprintf(FINFO, "delete_dir is %s\n", delete_dir_buf);
-+ } else if (!delete_suffix_len && (!am_server || !am_sender)) {
++ rprintf(FINFO, "backup_dir_rm is %s\n", backup_dir_rm_buf);
++ } else if (!backup_suffix_rm_len && (!am_server || !am_sender)) {
+ snprintf(err_buf, sizeof err_buf,
-+ "--delete-suffix cannot be a null string without --delete-dir\n");
++ "--backup-suffix-rm cannot be a null string without --backup-dir-rm\n");
+ return 0;
+ }
if (do_progress && !verbose)
verbose = 1;
-@@ -1196,6 +1249,10 @@ void server_options(char **args,int *arg
+@@ -1214,6 +1267,10 @@ void server_options(char **args,int *arg
args[ac++] = "--backup-dir";
args[ac++] = backup_dir;
}
-+ if (delete_dir) {
-+ args[ac++] = "--delete-dir";
-+ args[ac++] = delete_dir;
++ if (backup_dir_rm) {
++ args[ac++] = "--backup-dir-rm";
++ args[ac++] = backup_dir_rm;
+ }
/* Only send --suffix if it specifies a non-default value. */
if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
-@@ -1204,7 +1261,13 @@ void server_options(char **args,int *arg
+@@ -1222,7 +1279,13 @@ void server_options(char **args,int *arg
goto oom;
args[ac++] = arg;
}
-
-+ /* Only send --delete-suffix if it specifies a non-default value. */
-+ if (strcmp(delete_suffix, delete_dir ? "" : BACKUP_SUFFIX) != 0) {
++ /* Only send --backup-suffix-rm if it specifies a non-default value. */
++ if (strcmp(backup_suffix_rm, backup_dir_rm ? "" : BACKUP_SUFFIX) != 0) {
+ /* We use the following syntax to avoid weirdness with '~'. */
-+ if (asprintf(&arg, "--delete-suffix=%s", delete_suffix) < 0)
++ if (asprintf(&arg, "--backup-suffix-rm=%s", backup_suffix_rm) < 0)
+ goto oom;
+ args[ac++] = arg;
+ }
[Patched update to have context and apply to latest CVS source.]
---- orig/generator.c 2005-01-24 06:20:37
+--- orig/generator.c 2005-01-25 12:14:14
+++ generator.c 2004-11-11 22:15:27
@@ -43,6 +43,7 @@ extern int inplace;
extern int make_backups;
if (st->st_size != file->length)
return 0;
---- orig/options.c 2005-01-25 03:26:51
-+++ options.c 2004-11-17 19:41:59
-@@ -89,6 +89,7 @@ int keep_partial = 0;
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:14:15
+@@ -88,6 +88,7 @@ int keep_partial = 0;
int safe_symlinks = 0;
int copy_unsafe_links = 0;
int size_only = 0;
int daemon_bwlimit = 0;
int bwlimit = 0;
size_t bwlimit_writemax = 0;
-@@ -292,6 +293,7 @@ void usage(enum logcode F)
+@@ -298,6 +299,7 @@ void usage(enum logcode F)
rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
- rprintf(F," -I, --ignore-times turn off mod time & file size quick check\n");
- rprintf(F," --size-only ignore mod time for quick check (use size)\n");
-+ rprintf(F," --date-only ignore size for quick check (use mod time)\n");
- rprintf(F," --modify-window=NUM compare mod times with reduced accuracy\n");
+ rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
+ rprintf(F," --size-only skip files that match in size\n");
++ rprintf(F," --date-only skip files that match in mod-time\n");
+ rprintf(F," --modify-window=NUM compare mod-times with reduced accuracy\n");
rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n");
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
-@@ -346,6 +348,7 @@ static struct poptOption long_options[]
+@@ -352,6 +354,7 @@ static struct poptOption long_options[]
{"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
{"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
{"size-only", 0, POPT_ARG_NONE, &size_only, 0, 0, 0 },
{"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
{"one-file-system", 'x', POPT_ARG_NONE, &one_file_system, 0, 0, 0 },
{"existing", 0, POPT_ARG_NONE, &only_existing, 0, 0, 0 },
-@@ -1221,6 +1224,9 @@ void server_options(char **args,int *arg
+@@ -1241,6 +1244,9 @@ void server_options(char **args,int *arg
if (size_only)
args[ac++] = "--size-only";
if (modify_window_set) {
if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
goto oom;
---- orig/rsync.yo 2005-01-25 03:26:51
-+++ rsync.yo 2004-07-03 20:16:51
-@@ -357,6 +357,7 @@ verb(
+--- orig/rsync.yo 2005-01-28 17:12:14
++++ rsync.yo 2005-01-28 19:14:37
+@@ -360,6 +360,7 @@ verb(
--timeout=TIME set I/O timeout in seconds
- -I, --ignore-times turn off mod time & file size quick check
- --size-only ignore mod time for quick check (use size)
-+ --date-only ignore size for quick check (use mod time)
- --modify-window=NUM compare mod times with reduced accuracy
+ -I, --ignore-times don't skip files that match size and time
+ --size-only skip files that match in size
++ --date-only skip files that match in mod-time
+ --modify-window=NUM compare mod-times with reduced accuracy
-T --temp-dir=DIR create temporary files in directory DIR
--compare-dest=DIR also compare received files relative to DIR
-@@ -444,6 +445,12 @@ regardless of timestamp. This is useful
+@@ -448,6 +449,12 @@ regardless of timestamp. This is useful
after using another mirroring system which may not preserve timestamps
exactly.
#define RERR_SIGNAL 20 /* status returned when sent SIGUSR1, SIGINT */
#define RERR_WAITCHILD 21 /* some error returned by waitpid() */
---- orig/flist.c 2005-01-25 00:53:58
+--- orig/flist.c 2005-01-28 19:08:20
+++ flist.c 2005-01-21 19:10:03
@@ -69,6 +69,7 @@ extern int delete_excluded;
extern int max_delete;
extern struct filter_list_struct filter_list;
extern struct filter_list_struct server_filter_list;
-@@ -358,7 +359,10 @@ void send_file_entry(struct file_struct
+@@ -356,7 +357,10 @@ void send_file_entry(struct file_struct
io_write_phase = "send_file_entry";
flags = base_flags;
-@@ -574,6 +578,9 @@ void receive_file_entry(struct file_stru
+@@ -572,6 +576,9 @@ void receive_file_entry(struct file_stru
strlcpy(lastname, thisname, MAXPATHLEN);
if (sanitize_paths)
@@ -1088,6 +1095,9 @@ struct file_list *send_file_list(int f,
-
start_write = stats.total_written;
+ gettimeofday(&start_tv, NULL);
+ if (!am_server)
+ init_fname_convert();
flist = flist_new(f == -1 ? WITHOUT_HLINK : WITH_HLINK,
"send_file_list");
-@@ -1278,6 +1288,9 @@ struct file_list *send_file_list(int f,
+@@ -1291,6 +1301,9 @@ struct file_list *send_file_list(int f,
stats.num_files = flist->count;
}
if (verbose > 3)
output_flist(flist, f < 0 ? "delete" : who_am_i());
-@@ -1299,6 +1312,9 @@ struct file_list *recv_file_list(int f)
+@@ -1312,6 +1325,9 @@ struct file_list *recv_file_list(int f)
start_read = stats.total_read;
flist = flist_new(WITH_HLINK, "recv_file_list");
received_flist = flist;
-@@ -1352,6 +1368,9 @@ struct file_list *recv_file_list(int f)
+@@ -1365,6 +1381,9 @@ struct file_list *recv_file_list(int f)
io_error |= read_int(f);
}
+ if (verbose > 2)
+ rprintf(FINFO, "Converted filename: %s -> %s\n", src, dest);
+}
---- orig/generator.c 2005-01-24 06:20:37
+--- orig/generator.c 2005-01-25 12:14:14
+++ generator.c 2004-07-03 20:18:02
@@ -235,6 +235,12 @@ static void generate_and_send_sums(int f
*
*/
static void recv_generator(char *fname, struct file_list *flist,
struct file_struct *file, int i,
---- orig/log.c 2004-09-07 19:54:51
+--- orig/log.c 2005-01-28 19:08:20
+++ log.c 2004-07-03 20:18:02
@@ -57,6 +57,7 @@ struct {
{ RERR_STREAMIO , "error in rsync protocol data stream" },
{ RERR_SIGNAL , "received SIGUSR1 or SIGINT" },
{ RERR_WAITCHILD , "some error returned by waitpid()" },
{ RERR_MALLOC , "error allocating core memory buffers" },
---- orig/main.c 2005-01-24 01:43:10
+--- orig/main.c 2005-01-28 19:08:20
+++ main.c 2004-07-22 00:31:47
-@@ -335,7 +335,7 @@ static pid_t do_cmd(char *cmd, char *mac
+@@ -355,7 +355,7 @@ static pid_t do_cmd(char *cmd, char *mac
whole_file = 1;
ret = local_child(argc, args, f_in, f_out, child_main);
} else
if (dir)
free(dir);
---- orig/options.c 2005-01-25 03:26:51
-+++ options.c 2005-01-15 21:28:07
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:29:38
@@ -129,6 +129,7 @@ char *basis_dir[MAX_BASIS_DIRS+1];
char *config_file = NULL;
char *shell_cmd = NULL;
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
-@@ -298,6 +299,7 @@ void usage(enum logcode F)
+@@ -303,6 +304,7 @@ void usage(enum logcode F)
+ rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
- rprintf(F," -P equivalent to --partial --progress\n");
+ rprintf(F," --fname-convert=CMD invoke CMD for filename conversion\n");
rprintf(F," -z, --compress compress file data\n");
- rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
+ rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
-@@ -401,6 +403,7 @@ static struct poptOption long_options[]
+@@ -408,6 +410,7 @@ static struct poptOption long_options[]
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
if (pid == -1) {
rsyserr(FERROR, errno, "fork");
exit_cleanup(RERR_IPC);
---- orig/syscall.c 2005-01-19 20:11:10
+--- orig/syscall.c 2005-01-28 17:12:14
+++ syscall.c 2004-07-02 21:39:00
-@@ -270,3 +270,34 @@ char *d_name(struct dirent *di)
+@@ -259,3 +259,34 @@ char *d_name(struct dirent *di)
return di->d_name;
#endif
}
+
+ return result;
+}
---- orig/util.c 2005-01-20 23:05:34
+--- orig/util.c 2005-01-28 19:08:20
+++ util.c 2004-07-03 20:18:02
@@ -1213,3 +1213,55 @@ void *_realloc_array(void *ptr, unsigned
return malloc(size * num);
Be sure to run "make proto" before "make".
---- orig/generator.c 2005-01-23 07:55:40
+--- orig/generator.c 2005-01-25 12:14:14
+++ generator.c 2005-01-19 18:39:15
-@@ -45,6 +45,7 @@ extern int size_only;
+@@ -47,6 +47,7 @@ extern int size_only;
extern OFF_T max_size;
extern int io_timeout;
extern int protocol_version;
extern int always_checksum;
extern char *partial_dir;
extern char *basis_dir[];
-@@ -225,6 +226,88 @@ static void generate_and_send_sums(int f
+@@ -227,6 +228,88 @@ static void generate_and_send_sums(int f
unmap_file(mapbuf);
}
if (dry_run || read_batch)
return;
---- orig/main.c 2005-01-23 01:48:52
+--- orig/main.c 2005-01-28 19:08:20
+++ main.c 2005-01-14 18:33:15
@@ -49,6 +49,7 @@ extern int keep_dirlinks;
extern int preserve_hard_links;
extern int relative_paths;
extern int rsync_port;
extern int whole_file;
-@@ -465,7 +466,8 @@ static int do_recv(int f_in,int f_out,st
+@@ -485,7 +486,8 @@ static int do_recv(int f_in,int f_out,st
int pid;
int status = 0;
int error_pipe[2], name_pipe[2];
/* The receiving side mustn't obey this, or an existing symlink that
* points to an identical file won't be replaced by the referent. */
---- orig/options.c 2005-01-23 01:53:35
-+++ options.c 2005-01-15 21:08:13
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:31:20
@@ -90,6 +90,7 @@ int copy_unsafe_links = 0;
int size_only = 0;
int daemon_bwlimit = 0;
size_t bwlimit_writemax = 0;
int only_existing = 0;
int opt_ignore_existing = 0;
-@@ -293,6 +294,7 @@ void usage(enum logcode F)
+@@ -303,6 +304,7 @@ void usage(enum logcode F)
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
+ rprintf(F," --fuzzy find similar file for basis when no dest file\n");
- rprintf(F," -P equivalent to --partial --progress\n");
rprintf(F," -z, --compress compress file data\n");
- rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
-@@ -393,6 +395,7 @@ static struct poptOption long_options[]
+ rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
+ rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
+@@ -408,6 +410,7 @@ static struct poptOption long_options[]
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
-@@ -1251,6 +1254,9 @@ void server_options(char **args,int *arg
+@@ -1315,6 +1318,9 @@ void server_options(char **args,int *arg
if (!implied_dirs && !am_sender)
args[ac++] = "--no-implied-dirs";
*argc = ac;
return;
---- orig/receiver.c 2005-01-23 07:55:58
+--- orig/receiver.c 2005-01-28 19:08:20
+++ receiver.c 2005-01-15 21:21:02
-@@ -251,6 +251,27 @@ static int receive_data(int f_in, char *
+@@ -252,6 +252,27 @@ static int receive_data(int f_in, char *
}
static void discard_receive_data(int f_in, OFF_T length)
{
receive_data(f_in, NULL, -1, 0, NULL, -1, length);
-@@ -381,6 +402,10 @@ int recv_files(int f_in, struct file_lis
+@@ -390,6 +411,10 @@ int recv_files(int f_in, struct file_lis
case FNAMECMP_BACKUP:
fnamecmp = get_backup_name(fname);
break;
default:
if (j >= basis_dir_cnt) {
rprintf(FERROR,
---- orig/rsync.h 2005-01-21 00:35:26
+--- orig/rsync.h 2005-01-28 19:08:20
+++ rsync.h 2005-01-19 18:36:47
-@@ -128,6 +128,7 @@
+@@ -130,6 +130,7 @@
#define FNAMECMP_FNAME 0x80
#define FNAMECMP_PARTIAL_DIR 0x81
#define FNAMECMP_BACKUP 0x82
/* For calling delete_file() */
#define DEL_DIR (1<<0)
---- orig/rsync.yo 2005-01-23 02:57:49
-+++ rsync.yo 2005-01-15 21:48:52
-@@ -360,6 +360,7 @@ verb(
+--- orig/rsync.yo 2005-01-28 17:12:14
++++ rsync.yo 2005-01-28 19:31:36
+@@ -365,6 +365,7 @@ verb(
--compare-dest=DIR also compare received files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
+ --fuzzy find similar file for basis when no dest
- -P equivalent to --partial --progress
-z, --compress compress file data
- -C, --cvs-exclude auto ignore files in the same way CVS does
-@@ -896,6 +897,14 @@ Note that rsync versions prior to 2.6.1
+ -C, --cvs-exclude auto-ignore files in the same way CVS does
+ -f, --filter=RULE add a file-filtering RULE
+@@ -949,6 +950,14 @@ Note that rsync versions prior to 2.6.1
(or implied by -a). You can work-around this bug by avoiding the -o option
when sending to an old rsync.
dit(bf(-z, --compress)) With this option, rsync compresses any data from
the files that it sends to the destination machine. This
option is useful on slow connections. The compression method used is the
---- orig/util.c 2005-01-20 23:05:34
+--- orig/util.c 2005-01-28 19:08:20
+++ util.c 2005-01-19 17:30:51
@@ -1213,3 +1213,108 @@ void *_realloc_array(void *ptr, unsigned
return malloc(size * num);
+
+extern char *link_by_hash_dir;
+
-+#ifdef HAVE_LINK
++#if HAVE_LINK
+
+char* make_hash_name(struct file_struct *file)
+{
+}
+
+#endif
---- orig/options.c 2005-01-25 03:26:51
-+++ options.c 2004-11-27 18:19:42
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:32:26
@@ -132,6 +132,7 @@ char *log_format = NULL;
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char backup_dir_buf[MAXPATHLEN];
int rsync_port = 0;
int compare_dest = 0;
-@@ -297,6 +298,7 @@ void usage(enum logcode F)
+@@ -303,6 +304,7 @@ void usage(enum logcode F)
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
+ rprintf(F," --link-by-hash=DIR create hardlinks by hash to DIR for regular files\n");
- rprintf(F," -P equivalent to --partial --progress\n");
rprintf(F," -z, --compress compress file data\n");
- rprintf(F," -C, --cvs-exclude auto ignore files in the same way CVS does\n");
-@@ -335,7 +337,7 @@ void usage(enum logcode F)
+ rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
+ rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
+@@ -341,7 +343,7 @@ void usage(enum logcode F)
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_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
OPT_REFUSED_BASE = 9000};
static struct poptOption long_options[] = {
-@@ -401,6 +403,7 @@ static struct poptOption long_options[]
+@@ -408,6 +410,7 @@ static struct poptOption long_options[]
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
-@@ -788,6 +791,21 @@ int parse_arguments(int *argc, const cha
+@@ -802,6 +805,21 @@ int parse_arguments(int *argc, const cha
basis_dir[basis_dir_cnt++] = (char *)arg;
break;
default:
/* A large opt value means that set_refuse_options()
* turned this option off (opt-BASE is its index). */
-@@ -1277,6 +1295,11 @@ void server_options(char **args,int *arg
+@@ -1299,6 +1317,11 @@ void server_options(char **args,int *arg
}
}
if (files_from && (!am_sender || remote_filesfrom_file)) {
if (remote_filesfrom_file) {
args[ac++] = "--files-from";
---- orig/receiver.c 2005-01-24 01:43:10
+--- orig/receiver.c 2005-01-28 19:08:20
+++ receiver.c 2005-01-15 21:29:13
@@ -36,6 +36,7 @@ extern int preserve_hard_links;
extern int preserve_perms;
extern char *partial_dir;
extern char *basis_dir[];
extern int basis_dir_cnt;
-@@ -131,12 +132,13 @@ static int get_tmpname(char *fnametmp, c
+@@ -132,12 +133,13 @@ static int get_tmpname(char *fnametmp, c
static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
int32 len;
OFF_T offset = 0;
OFF_T offset2;
-@@ -156,6 +158,9 @@ static int receive_data(int f_in, char *
+@@ -157,6 +159,9 @@ static int receive_data(int f_in, char *
} else
mapbuf = NULL;
sum_init(checksum_seed);
while ((i = recv_token(f_in, &data)) != 0) {
-@@ -172,6 +177,8 @@ static int receive_data(int f_in, char *
+@@ -173,6 +178,8 @@ static int receive_data(int f_in, char *
cleanup_got_literal = 1;
sum_update(data, i);
if (fd != -1 && write_file(fd,data,i) != i)
goto report_write_error;
-@@ -198,6 +205,8 @@ static int receive_data(int f_in, char *
+@@ -199,6 +206,8 @@ static int receive_data(int f_in, char *
see_token(map, len);
sum_update(map, len);
}
if (inplace) {
-@@ -238,6 +247,8 @@ static int receive_data(int f_in, char *
+@@ -239,6 +248,8 @@ static int receive_data(int f_in, char *
}
sum_end(file_sum1);
if (mapbuf)
unmap_file(mapbuf);
-@@ -253,7 +264,7 @@ static int receive_data(int f_in, char *
+@@ -254,7 +265,7 @@ static int receive_data(int f_in, char *
static void discard_receive_data(int f_in, OFF_T length)
{
}
-@@ -486,8 +497,12 @@ int recv_files(int f_in, struct file_lis
+@@ -495,8 +506,12 @@ int recv_files(int f_in, struct file_lis
rprintf(FINFO, "%s\n", safe_fname(fname));
/* recv file data */
-+#ifdef HAVE_LINK
++#if HAVE_LINK
+ if (link_by_hash_dir)
+ file->u.sum = (char*)malloc(MD4_SUM_LENGTH);
+#endif
log_recv(file, &initial_stats);
---- orig/rsync.c 2005-01-24 00:57:24
+--- orig/rsync.c 2005-01-28 19:08:20
+++ rsync.c 2004-08-13 18:14:34
@@ -35,6 +35,7 @@ extern int force_delete;
extern int recurse;
extern char *backup_dir;
extern int inplace;
-@@ -280,7 +281,12 @@ void finish_transfer(char *fname, char *
+@@ -281,7 +282,12 @@ void finish_transfer(char *fname, char *
/* move tmp file over real file */
if (verbose > 2)
rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);
- ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS);
-+#ifdef HAVE_LINK
++#if HAVE_LINK
+ if (link_by_hash_dir)
+ ret = link_by_hash(fnametmp, fname, file);
+ else
if (ret < 0) {
rsyserr(FERROR, errno, "%s %s -> \"%s\"",
ret == -2 ? "copy" : "rename",
---- orig/rsync.h 2005-01-25 00:53:58
+--- orig/rsync.h 2005-01-28 19:08:20
+++ rsync.h 2004-07-03 20:20:15
-@@ -545,6 +545,14 @@ struct stats {
+@@ -599,6 +599,14 @@ struct stats {
int current_file_index;
};
/* we need this function because of the silly way in which duplicate
entries are handled in the file lists - we can't change this
+--- orig/rsync.yo 2005-01-28 17:12:14
++++ rsync.yo 2005-01-28 19:32:45
+@@ -365,6 +365,7 @@ verb(
+ --compare-dest=DIR also compare received files relative to DIR
+ --copy-dest=DIR ... and include copies of unchanged files
+ --link-dest=DIR hardlink to files in DIR when unchanged
++ --link-by-hash=DIR create hardlinks by hash to DIR for regular files
+ -z, --compress compress file data
+ -C, --cvs-exclude auto-ignore files in the same way CVS does
+ -f, --filter=RULE add a file-filtering RULE
handle relative symlinks properly, and that has not yet been fixed
in this modified version.
---- orig/flist.c 2005-01-24 00:18:21
+--- orig/flist.c 2005-01-28 19:08:20
+++ flist.c 2004-07-16 16:58:04
-@@ -50,6 +50,7 @@ extern int filesfrom_fd;
+@@ -52,6 +52,7 @@ extern int filesfrom_fd;
extern int one_file_system;
extern int keep_dirlinks;
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_perms;
extern int preserve_devices;
-@@ -726,6 +727,30 @@ void receive_file_entry(struct file_stru
+@@ -740,6 +741,30 @@ void receive_file_entry(struct file_stru
}
/**
* Create a file_struct for a named file by reading its stat()
* information and performing extensive checks against global
-@@ -850,7 +875,13 @@ skip_excludes:
+@@ -864,7 +889,13 @@ skip_filters:
basename_len = strlen(basename) + 1; /* count the '\0' */
#if SUPPORT_LINKS
#else
linkname_len = 0;
#endif
---- orig/options.c 2005-01-24 00:18:21
-+++ options.c 2004-07-16 16:12:29
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:33:24
@@ -42,6 +42,7 @@ int archive_mode = 0;
int keep_dirlinks = 0;
int copy_links = 0;
int preserve_hard_links = 0;
int preserve_perms = 0;
int preserve_devices = 0;
-@@ -253,6 +254,7 @@ void usage(enum logcode F)
+@@ -260,6 +261,7 @@ void usage(enum logcode F)
rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
rprintf(F," -d, --dirs transfer directories without recursing\n");
rprintf(F," -l, --links copy symlinks as symlinks\n");
+ rprintf(F," --links-depth=NUM follow symlinks up to NUM depth\n");
- rprintf(F," -L, --copy-links copy the referent of all symlinks\n");
- rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n");
- rprintf(F," --safe-links ignore \"unsafe\" symlinks\n");
-@@ -360,6 +362,7 @@ static struct poptOption long_options[]
+ rprintf(F," -L, --copy-links transform symlink into referent file/dir\n");
+ rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n");
+ rprintf(F," --safe-links ignore symlinks that point outside the source tree\n");
+@@ -378,6 +380,7 @@ static struct poptOption long_options[]
{"inplace", 0, POPT_ARG_NONE, &inplace, 0, 0, 0 },
{"dirs", 'd', POPT_ARG_VAL, &xfer_dirs, 2, 0, 0 },
{"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
{"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 },
{"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
{"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
+--- orig/rsync.yo 2005-01-28 17:12:14
++++ rsync.yo 2005-01-28 19:33:40
+@@ -322,6 +322,7 @@ verb(
+ --inplace update destination files in-place
+ -d, --dirs transfer directories without recursing
+ -l, --links copy symlinks as symlinks
++ --links-depth=NUM follow symlinks up to NUM depth
+ -L, --copy-links transform symlink into referent file/dir
+ --copy-unsafe-links only "unsafe" symlinks are transformed
+ --safe-links ignore symlinks that point outside the tree
Do we need configure support for mktime()?
---- orig/io.c 2005-01-19 20:11:10
+--- orig/io.c 2005-01-28 06:51:59
+++ io.c 2004-07-17 15:28:36
@@ -51,6 +51,7 @@ extern int eol_nulls;
extern int csum_length;
if (!am_server && !am_daemon) {
rprintf(FERROR, "io timeout after %d seconds - exiting\n",
(int)(t-last_io));
---- orig/options.c 2005-01-25 03:26:51
-+++ options.c 2005-01-01 21:19:56
-@@ -102,6 +102,7 @@ int blocking_io = -1;
- int checksum_seed = 0;
+--- orig/options.c 2005-01-28 19:08:20
++++ options.c 2005-01-28 19:35:23
+@@ -102,6 +102,7 @@ int checksum_seed = 0;
int inplace = 0;
+ int delay_updates = 0;
long block_size = 0; /* "long" because popt can't set an int32. */
+time_t stop_at_utime = 0;
/** Network address family. **/
-@@ -319,6 +320,8 @@ void usage(enum logcode F)
- rprintf(F," --password-file=FILE get password from FILE\n");
+@@ -325,6 +326,8 @@ void usage(enum logcode F)
+ rprintf(F," --password-file=FILE read 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=KBPS limit I/O bandwidth; KBytes per second\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 batch to FILE\n");
- rprintf(F," --read-batch=FILE read a batch from FILE\n");
- #ifdef INET6
-@@ -336,6 +339,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP
+ rprintf(F," --write-batch=FILE write a batched update to FILE\n");
+ rprintf(F," --read-batch=FILE read a batched update from FILE\n");
+ #if INET6
+@@ -342,6 +345,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP
OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
OPT_REFUSED_BASE = 9000};
static struct poptOption long_options[] = {
-@@ -415,6 +419,8 @@ static struct poptOption long_options[]
+@@ -423,6 +427,8 @@ static struct poptOption long_options[]
{"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 },
{"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 },
{"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
{"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
-@@ -788,6 +794,36 @@ int parse_arguments(int *argc, const cha
+@@ -802,6 +808,36 @@ int parse_arguments(int *argc, const cha
basis_dir[basis_dir_cnt++] = (char *)arg;
break;
default:
/* A large opt value means that set_refuse_options()
* turned this option off (opt-BASE is its index). */
-@@ -1192,6 +1228,15 @@ void server_options(char **args,int *arg
+@@ -1210,6 +1246,15 @@ void server_options(char **args,int *arg
args[ac++] = arg;
}
if (backup_dir) {
args[ac++] = "--backup-dir";
args[ac++] = backup_dir;
---- orig/rsync.yo 2005-01-25 03:26:51
-+++ rsync.yo 2004-07-15 02:44:40
-@@ -384,6 +384,8 @@ verb(
- --password-file=FILE get password from FILE
+--- orig/rsync.yo 2005-01-28 17:12:14
++++ rsync.yo 2005-01-28 19:35:35
+@@ -387,6 +387,8 @@ verb(
+ --password-file=FILE read password from FILE
--list-only list the files instead of copying them
- --bwlimit=KBPS limit I/O bandwidth, KBytes per second
+ --bwlimit=KBPS limit I/O bandwidth; KBytes per second
+ --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 batch to FILE
- --read-batch=FILE read a batch from FILE
- --checksum-seed=NUM set block/file checksum seed
-@@ -1090,6 +1092,19 @@ transfer was too fast, it will wait befo
+ --write-batch=FILE write a batched update to FILE
+ --read-batch=FILE read a batched update from FILE
+ --checksum-seed=NUM set block/file checksum seed (advanced)
+@@ -1124,6 +1126,19 @@ transfer was too fast, it will wait befo
result is an average transfer rate equaling the specified limit. A value
of zero specifies no limit.
dit(bf(--write-batch=FILE)) Record a file that can later be applied to
another identical destination with --read-batch. See the "BATCH MODE"
section for details.
---- orig/util.c 2005-01-20 23:05:34
+--- orig/util.c 2005-01-28 19:08:20
+++ util.c 2004-07-03 20:23:22
@@ -126,6 +126,132 @@ void overflow(char *str)
exit_cleanup(RERR_MALLOC);