--- old/compat.c
+++ new/compat.c
-@@ -94,6 +94,8 @@ void setup_protocol(int f_out,int f_in)
+@@ -95,6 +95,8 @@ void setup_protocol(int f_out,int f_in)
preserve_uid = ++file_extra_cnt;
if (preserve_gid)
preserve_gid = ++file_extra_cnt;
if (preserve_xattrs)
--- old/flist.c
+++ new/flist.c
-@@ -51,6 +51,7 @@ extern int preserve_devices;
+@@ -52,6 +52,7 @@ extern int preserve_devices;
extern int preserve_specials;
extern int preserve_uid;
extern int preserve_gid;
extern int relative_paths;
extern int implied_dirs;
extern int file_extra_cnt;
-@@ -154,6 +155,7 @@ void show_flist_stats(void)
+@@ -158,6 +159,7 @@ void show_flist_stats(void)
static void list_file_entry(struct file_struct *f)
{
char permbuf[PERMSTRING_SIZE];
double len;
if (!F_IS_ACTIVE(f)) {
-@@ -168,14 +170,16 @@ static void list_file_entry(struct file_
+@@ -172,14 +174,16 @@ static void list_file_entry(struct file_
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
f_name(f, NULL));
}
}
-@@ -344,6 +348,7 @@ int push_pathname(const char *dir, int l
+@@ -338,6 +342,7 @@ int push_pathname(const char *dir, int l
static void send_file_entry(int f, struct file_struct *file, int ndx)
{
static time_t modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
-@@ -439,6 +444,13 @@ static void send_file_entry(int f, struc
+@@ -433,6 +438,13 @@ static void send_file_entry(int f, struc
flags |= XMIT_SAME_TIME;
else
modtime = file->modtime;
#ifdef SUPPORT_HARD_LINKS
if (tmp_dev != 0) {
-@@ -510,6 +522,8 @@ static void send_file_entry(int f, struc
+@@ -504,6 +516,8 @@ static void send_file_entry(int f, struc
}
if (!(flags & XMIT_SAME_MODE))
write_int(f, to_wire_mode(mode));
if (preserve_uid && !(flags & XMIT_SAME_UID)) {
if (protocol_version < 30)
write_int(f, uid);
-@@ -596,7 +610,7 @@ static void send_file_entry(int f, struc
+@@ -590,7 +604,7 @@ static void send_file_entry(int f, struc
static struct file_struct *recv_file_entry(struct file_list *flist,
int xflags, int f)
{
static mode_t mode;
static int64 dev;
static dev_t rdev;
-@@ -731,6 +745,16 @@ static struct file_struct *recv_file_ent
+@@ -726,6 +740,16 @@ static struct file_struct *recv_file_ent
}
if (!(xflags & XMIT_SAME_MODE))
mode = from_wire_mode(read_int(f));
if (chmod_modes && !S_ISLNK(mode))
mode = tweak_mode(mode, chmod_modes);
-@@ -859,6 +883,8 @@ static struct file_struct *recv_file_ent
+@@ -854,6 +878,8 @@ static struct file_struct *recv_file_ent
F_GROUP(file) = gid;
file->flags |= gid_flags;
}
#ifdef ICONV_OPTION
if (ic_ndx)
F_NDX(file) = flist->count + flist->ndx_start;
-@@ -1172,6 +1198,8 @@ struct file_struct *make_file(const char
+@@ -1173,6 +1199,8 @@ struct file_struct *make_file(const char
F_OWNER(file) = st.st_uid;
if (preserve_gid)
F_GROUP(file) = st.st_gid;
if (preserve_hard_links && F_IS_HLINKED(file))
finish_hard_link(file, fname, &sxp->st, itemizing, code, j);
if (itemizing && (verbose > 1 || stdout_format_has_i > 1)) {
-@@ -1743,7 +1749,7 @@ static void touch_up_dirs(struct file_li
+@@ -1749,7 +1755,7 @@ static void touch_up_dirs(struct file_li
if (!(file->mode & S_IWUSR))
do_chmod(fname, file->mode);
if (need_retouch_dir_times)
- set_modtime(fname, file->modtime, file->mode);
+ set_times(fname, file->modtime, file->modtime, file->mode);
- if (allowed_lull && !(++j % lull_mod))
+ if (allowed_lull && !(counter % lull_mod))
maybe_send_keepalive();
- else if (!(j % 200))
+ else if (!(counter & 0xFF))
--- old/log.c
+++ new/log.c
@@ -34,6 +34,7 @@ extern int msg_fd_out;
int update_only = 0;
int cvs_exclude = 0;
int dry_run = 0;
-@@ -334,8 +335,9 @@ void usage(enum logcode F)
+@@ -335,8 +336,9 @@ void usage(enum logcode F)
rprintf(F," --devices preserve device files (super-user only)\n");
rprintf(F," --specials preserve special files\n");
rprintf(F," -D same as --devices --specials\n");
rprintf(F," --super receiver attempts super-user activities\n");
#ifdef SUPPORT_XATTRS
rprintf(F," --fake-super store/recover privileged attrs using xattrs\n");
-@@ -468,6 +470,9 @@ static struct poptOption long_options[]
+@@ -471,6 +473,9 @@ static struct poptOption long_options[]
{"times", 't', POPT_ARG_VAL, &preserve_times, 1, 0, 0 },
{"no-times", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
{"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
{"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 },
{"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
{"super", 0, POPT_ARG_VAL, &am_root, 2, 0, 0 },
-@@ -1652,6 +1657,8 @@ void server_options(char **args,int *arg
+@@ -1668,6 +1673,8 @@ void server_options(char **args,int *arg
argstr[x++] = 'D';
if (preserve_times)
argstr[x++] = 't';
extern int preserve_times;
extern int omit_dir_times;
extern int am_root;
-@@ -271,6 +272,7 @@ int set_file_attrs(const char *fname, st
+@@ -275,6 +276,7 @@ int set_file_attrs(const char *fname, st
int updated = 0;
statx sx2;
int change_uid, change_gid;
mode_t new_mode = file->mode;
if (!sxp) {
-@@ -308,18 +310,36 @@ int set_file_attrs(const char *fname, st
+@@ -312,18 +314,36 @@ int set_file_attrs(const char *fname, st
set_stat_xattr(fname, file);
#endif
--- old/compat.c
+++ new/compat.c
-@@ -48,6 +48,7 @@ extern int preserve_hard_links;
+@@ -49,6 +49,7 @@ extern int preserve_hard_links;
extern int need_messages_from_generator;
extern int delete_mode, delete_before, delete_during, delete_after;
extern int delete_excluded;
extern int make_backups;
extern char *shell_cmd; /* contains VER.SUB string if client is a pre-release */
extern char *backup_dir, *backup_suffix;
-@@ -205,7 +206,7 @@ void setup_protocol(int f_out,int f_in)
+@@ -206,7 +207,7 @@ void setup_protocol(int f_out,int f_in)
} else if (protocol_version >= 30) {
if (recurse && allow_inc_recurse && !preserve_hard_links
&& !delete_before && !delete_after && !delay_updates
-- && !prune_empty_dirs)
-+ && !prune_empty_dirs && !detect_renamed)
+- && !prune_empty_dirs && !use_qsort)
++ && !prune_empty_dirs && !use_qsort && !detect_renamed)
inc_recurse = 1;
need_messages_from_generator = 1;
}
--- old/flist.c
+++ new/flist.c
-@@ -59,6 +59,7 @@ extern int non_perishable_cnt;
+@@ -60,6 +60,7 @@ extern int non_perishable_cnt;
extern int prune_empty_dirs;
extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
extern int sanitize_paths;
extern struct stats stats;
-@@ -95,6 +96,8 @@ static int64 tmp_dev, tmp_ino;
+@@ -98,6 +99,8 @@ static int64 tmp_dev, tmp_ino;
#endif
static char tmp_sum[MAX_DIGEST_LEN];
+
static char empty_sum[MAX_DIGEST_LEN];
static int flist_count_offset; /* for --delete --progress */
-
-@@ -261,6 +264,45 @@ static int is_excluded(char *fname, int
+ static int dir_count = 0;
+@@ -265,6 +268,45 @@ static int is_excluded(char *fname, int
return 0;
}
static void send_directory(int f, struct file_list *flist,
char *fbuf, int len, int flags);
-@@ -1855,6 +1897,25 @@ struct file_list *send_file_list(int f,
+@@ -1915,6 +1957,25 @@ struct file_list *send_file_list(int f,
if (verbose > 2)
rprintf(FINFO, "send_file_list done\n");
+ }
+
if (inc_recurse) {
- #ifdef ICONV_OPTION
- if (!need_unsorted_flist)
+ add_dirs_to_tree(-1, flist, dir_count);
+ if (send_dir_ndx < 0) {
--- old/generator.c
+++ new/generator.c
@@ -80,6 +80,7 @@ extern char *basis_dir[];
rsyserr(FERROR, stat_errno, "recv_generator: failed to stat %s",
full_fname(fname));
goto cleanup;
-@@ -1861,6 +2017,12 @@ void generate_files(int f_out, const cha
+@@ -1867,6 +2023,12 @@ void generate_files(int f_out, const cha
if (verbose > 2)
rprintf(FINFO, "generator starting pid=%ld\n", (long)getpid());
if (delete_before && !solo_file && cur_flist->count > 0)
do_delete_pass();
if (delete_during == 2) {
-@@ -1871,7 +2033,7 @@ void generate_files(int f_out, const cha
+@@ -1877,7 +2039,7 @@ void generate_files(int f_out, const cha
}
do_progress = 0;
whole_file = 0;
if (verbose >= 2) {
rprintf(FINFO, "delta-transmission %s\n",
-@@ -1898,7 +2060,7 @@ void generate_files(int f_out, const cha
+@@ -1904,7 +2066,7 @@ void generate_files(int f_out, const cha
dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
} else
dirdev = MAKEDEV(0, 0);
}
}
for (i = cur_flist->low; i <= cur_flist->high; i++) {
-@@ -1960,7 +2122,21 @@ void generate_files(int f_out, const cha
+@@ -1966,7 +2128,21 @@ void generate_files(int f_out, const cha
} while ((cur_flist = cur_flist->next) != NULL);
if (delete_during)
int numeric_ids = 0;
int allow_8bit_chars = 0;
int force_delete = 0;
-@@ -373,6 +374,7 @@ void usage(enum logcode F)
+@@ -374,6 +375,7 @@ void usage(enum logcode F)
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," -y, --fuzzy find similar file for basis if no dest file\n");
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");
-@@ -541,6 +543,7 @@ static struct poptOption long_options[]
+@@ -546,6 +548,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 },
+ {"detect-renamed", 0, POPT_ARG_NONE, &detect_renamed, 0, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
{"compress", 'z', POPT_ARG_NONE, 0, 'z', 0, 0 },
- {"compress-level", 0, POPT_ARG_INT, &def_compress_level, 'z', 0, 0 },
-@@ -1472,7 +1475,7 @@ int parse_arguments(int *argc, const cha
+ {"no-compress", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 },
+@@ -1488,7 +1491,7 @@ int parse_arguments(int *argc, const cha
inplace = 1;
}
partial_dir = tmp_partialdir;
if (inplace) {
-@@ -1481,6 +1484,7 @@ int parse_arguments(int *argc, const cha
+@@ -1497,6 +1500,7 @@ int parse_arguments(int *argc, const cha
snprintf(err_buf, sizeof err_buf,
"--%s cannot be used with --%s\n",
append_mode ? "append" : "inplace",
delay_updates ? "delay-updates" : "partial-dir");
return 0;
}
-@@ -1820,6 +1824,8 @@ void server_options(char **args,int *arg
+@@ -1836,6 +1840,8 @@ void server_options(char **args,int *arg
args[ac++] = "--super";
if (size_only)
args[ac++] = "--size-only";
if (modify_window_set) {
--- old/rsync.yo
+++ new/rsync.yo
-@@ -367,6 +367,7 @@ to the detailed description below for a
+@@ -373,6 +373,7 @@ to the detailed description below for a
--modify-window=NUM compare mod-times with reduced accuracy
-T, --temp-dir=DIR create temporary files in directory DIR
-y, --fuzzy find similar file for basis if no dest file
--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
-@@ -1347,6 +1348,15 @@ Note that the use of the bf(--delete) op
+@@ -1353,6 +1354,15 @@ Note that the use of the bf(--delete) op
fuzzy-match files, so either use bf(--delete-after) or specify some
filename exclusions if you need to prevent this.
int preserve_links = 0;
int preserve_hard_links = 0;
int preserve_acls = 0;
-@@ -366,6 +367,7 @@ void usage(enum logcode F)
+@@ -367,6 +368,7 @@ void usage(enum logcode F)
rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n");
rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n");
rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
rprintf(F," --timeout=TIME set I/O timeout in seconds\n");
rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n");
-@@ -567,6 +569,7 @@ static struct poptOption long_options[]
- {"only-write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 },
+@@ -580,6 +582,7 @@ static struct poptOption long_options[]
{"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
- {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
+ {"from0", '0', POPT_ARG_VAL, &eol_nulls, 1, 0, 0},
+ {"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0},
+ {"fsync", 0, POPT_ARG_NONE, &do_fsync, 0, 0, 0 },
- {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
+ {"numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 1, 0, 0 },
+ {"no-numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 0, 0, 0 },
{"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
- {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
-@@ -1869,6 +1872,9 @@ void server_options(char **args,int *arg
+@@ -1885,6 +1888,9 @@ void server_options(char **args,int *arg
args[ac++] = tmpdir;
}
extern int ignore_errors;
extern int numeric_ids;
extern int recurse;
-@@ -2390,7 +2391,7 @@ enum fnc_type { t_PATH, t_ITEM };
+@@ -2453,7 +2454,7 @@ enum fnc_type { t_PATH, t_ITEM };
int f_name_cmp(struct file_struct *f1, struct file_struct *f2)
{
int dif;
enum fnc_state state1, state2;
enum fnc_type type1, type2;
enum fnc_type t_path = protocol_version >= 29 ? t_PATH : t_ITEM;
-@@ -2500,7 +2501,15 @@ int f_name_cmp(struct file_struct *f1, s
+@@ -2563,7 +2564,15 @@ int f_name_cmp(struct file_struct *f1, s
if (type1 != type2)
return type1 == t_PATH ? 1 : -1;
}
--- old/options.c
+++ new/options.c
-@@ -113,6 +113,7 @@ OFF_T max_size = 0;
+@@ -114,6 +114,7 @@ OFF_T max_size = 0;
OFF_T min_size = 0;
int ignore_errors = 0;
int modify_window = 0;
int blocking_io = -1;
int checksum_seed = 0;
int inplace = 0;
-@@ -388,6 +389,7 @@ void usage(enum logcode F)
+@@ -389,6 +390,7 @@ void usage(enum logcode F)
rprintf(F," --include-from=FILE read include patterns from FILE\n");
rprintf(F," --files-from=FILE read list of source-file names from FILE\n");
rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n");
rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n");
rprintf(F," --port=PORT specify double-colon alternate port number\n");
rprintf(F," --sockopts=OPTIONS specify custom TCP options\n");
-@@ -567,6 +569,8 @@ static struct poptOption long_options[]
+@@ -577,6 +579,8 @@ static struct poptOption long_options[]
+ {"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 },
{"only-write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 },
- {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
- {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
+ {"ignore-case", 0, POPT_ARG_VAL, &ignore_case, 1, 0, 0 },
+ {"no-ignore-case", 0, POPT_ARG_VAL, &ignore_case, 0, 0, 0 },
- {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
- {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
- {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
-@@ -1834,6 +1838,9 @@ void server_options(char **args,int *arg
+ {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
+ {"from0", '0', POPT_ARG_VAL, &eol_nulls, 1, 0, 0},
+ {"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0},
+@@ -1850,6 +1854,9 @@ void server_options(char **args,int *arg
args[ac++] = arg;
}
--- old/flist.c
+++ new/flist.c
-@@ -58,6 +58,7 @@ extern int copy_links;
+@@ -62,6 +62,7 @@ extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
extern int sanitize_paths;
extern struct stats stats;
extern char curr_dir[MAXPATHLEN];
-@@ -1246,6 +1247,9 @@ static void send_directory(int f, struct
+@@ -1463,6 +1464,9 @@ static void send_directory(int f, struct
}
send_file_name(f, flist, fbuf, NULL, flags, filter_flags);
fbuf[len] = '\0';
--- old/options.c
+++ new/options.c
-@@ -102,6 +102,7 @@ int size_only = 0;
+@@ -105,6 +105,7 @@ int size_only = 0;
int daemon_bwlimit = 0;
int bwlimit = 0;
int fuzzy_basis = 0;
size_t bwlimit_writemax = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
-@@ -374,6 +375,7 @@ void usage(enum logcode F)
+@@ -405,6 +406,7 @@ 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");
-@@ -514,6 +516,7 @@ static struct poptOption long_options[]
- {"log-format", 0, POPT_ARG_STRING, &stdout_format, 0, 0, 0 }, /* DEPRECATED */
+@@ -567,6 +569,7 @@ static struct poptOption long_options[]
{"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
- {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
+ {"no-itemize-changes",0, POPT_ARG_VAL, &itemize_changes, 0, 0, 0 },
+ {"no-i", 0, POPT_ARG_VAL, &itemize_changes, 0, 0, 0 },
+ {"slow-down", 0, POPT_ARG_LONG, &sleep_asec, 0, 0, 0 },
- {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
- {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
- {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
+ {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
+ {"no-bwlimit", 0, POPT_ARG_VAL, &bwlimit, 0, 0, 0 },
+ {"backup", 'b', POPT_ARG_VAL, &make_backups, 1, 0, 0 },
/**
* If 1, send the whole file as literal data rather than trying to
-@@ -350,6 +351,7 @@ void usage(enum logcode F)
+@@ -351,6 +352,7 @@ void usage(enum logcode F)
rprintf(F," --existing skip creating new files on receiver\n");
rprintf(F," --ignore-existing skip updating files that already exist on receiver\n");
rprintf(F," --remove-source-files sender removes synchronized files (non-dirs)\n");
rprintf(F," --del an alias for --delete-during\n");
rprintf(F," --delete delete extraneous files from destination dirs\n");
rprintf(F," --delete-before receiver deletes before transfer, not during\n");
-@@ -559,6 +561,7 @@ static struct poptOption long_options[]
- {"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
+@@ -570,6 +572,7 @@ static struct poptOption long_options[]
{"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
- {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
+ {"no-bwlimit", 0, POPT_ARG_VAL, &bwlimit, 0, 0, 0 },
+ {"backup", 'b', POPT_ARG_VAL, &make_backups, 1, 0, 0 },
+ {"source-backup", 0, POPT_ARG_NONE, &make_source_backups, 0, 0, 0},
+ {"no-backup", 0, POPT_ARG_VAL, &make_backups, 0, 0, 0 },
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
{"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
- {"list-only", 0, POPT_ARG_VAL, &list_only, 2, 0, 0 },
-@@ -1820,7 +1823,8 @@ void server_options(char **args,int *arg
+@@ -1836,7 +1839,8 @@ void server_options(char **args,int *arg
args[ac++] = "--super";
if (size_only)
args[ac++] = "--size-only";
if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
--- old/rsync.yo
+++ new/rsync.yo
-@@ -344,6 +344,7 @@ to the detailed description below for a
+@@ -350,6 +350,7 @@ to the detailed description below for a
--existing skip creating new files on receiver
--ignore-existing skip updating files that exist on receiver
--remove-source-files sender removes synchronized files (non-dir)
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before transfer (default)
-@@ -998,6 +999,15 @@ dit(bf(--remove-source-files)) This tell
+@@ -1004,6 +1005,15 @@ dit(bf(--remove-source-files)) This tell
side the files (meaning non-directories) that are a part of the transfer
and have been successfully duplicated on the receiving side.
extern struct stats stats;
+extern time_t stop_at_utime;
extern struct file_list *cur_flist, *first_flist;
-
- const char phase_unknown[] = "unknown";
-@@ -172,16 +173,24 @@ static void check_timeout(void)
+ #ifdef ICONV_OPTION
+ extern iconv_t ic_send, ic_recv;
+@@ -179,16 +180,24 @@ static void check_timeout(void)
{
time_t t;
rprintf(FERROR, "io timeout after %d seconds -- exiting\n",
--- old/options.c
+++ new/options.c
-@@ -108,6 +108,7 @@ size_t bwlimit_writemax = 0;
+@@ -109,6 +109,7 @@ size_t bwlimit_writemax = 0;
int ignore_existing = 0;
int ignore_non_existing = 0;
int need_messages_from_generator = 0;
int max_delete = -1;
OFF_T max_size = 0;
OFF_T min_size = 0;
-@@ -390,6 +391,8 @@ void usage(enum logcode F)
+@@ -405,6 +406,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");
-@@ -411,7 +414,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP
+@@ -429,7 +432,7 @@ enum {OPT_VERSION = 1000, OPT_DAEMON, OP
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[] = {
-@@ -540,6 +543,8 @@ static struct poptOption long_options[]
- {"log-format", 0, POPT_ARG_STRING, &stdout_format, 0, 0, 0 }, /* DEPRECATED */
- {"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 },
- {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
+@@ -584,6 +587,8 @@ static struct poptOption long_options[]
+ {"no-numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 0, 0, 0 },
+ {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
+ {"no-timeout", 0, POPT_ARG_VAL, &io_timeout, 0, 0, 0 },
+ {"stop-at", 0, POPT_ARG_STRING, 0, OPT_STOP_AT, 0, 0 },
+ {"time-limit", 0, POPT_ARG_STRING, 0, OPT_TIME_LIMIT, 0, 0 },
- {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
- {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
- {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
-@@ -1148,6 +1153,36 @@ int parse_arguments(int *argc, const cha
+ {"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 },
+@@ -1196,6 +1201,36 @@ int parse_arguments(int *argc, const cha
return 0;
#endif
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -1715,6 +1750,15 @@ void server_options(char **args,int *arg
+@@ -1802,6 +1837,15 @@ void server_options(char **args,int *arg
args[ac++] = arg;
}
args[ac++] = backup_dir;
--- old/rsync.yo
+++ new/rsync.yo
-@@ -397,6 +397,8 @@ to the detailed description below for a
+@@ -404,6 +404,8 @@ to the detailed description below for a
--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
-@@ -1797,6 +1799,19 @@ transfer was too fast, it will wait befo
+@@ -1839,6 +1841,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.
--- old/flist.c
+++ new/flist.c
-@@ -61,6 +61,8 @@ extern int copy_links;
+@@ -62,6 +62,8 @@ extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
extern int sanitize_paths;
extern struct stats stats;
extern char curr_dir[MAXPATHLEN];
-@@ -742,7 +744,7 @@ static struct file_struct *recv_file_ent
+@@ -737,7 +739,7 @@ static struct file_struct *recv_file_ent
uid = (uid_t)read_varint(f);
if (xflags & XMIT_USER_NAME_FOLLOWS)
uid = recv_user_name(f, uid);
uid = match_uid(uid);
}
}
-@@ -754,7 +756,7 @@ static struct file_struct *recv_file_ent
+@@ -749,7 +751,7 @@ static struct file_struct *recv_file_ent
gid_flags = 0;
if (xflags & XMIT_GROUP_NAME_FOLLOWS)
gid = recv_group_name(f, gid, &gid_flags);
gid = match_gid(gid, &gid_flags);
}
}
-@@ -1886,8 +1888,13 @@ struct file_list *recv_file_list(int f)
+@@ -1938,8 +1940,13 @@ struct file_list *recv_file_list(int f)
int dstart, flags;
int64 start_read;
else if (inc_recurse && verbose && !am_server && !first_flist)
--- old/options.c
+++ new/options.c
-@@ -156,6 +156,8 @@ char *rsync_path = RSYNC_PATH;
+@@ -157,6 +157,8 @@ char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
char backup_dir_buf[MAXPATHLEN];
char *sockopts = NULL;
int rsync_port = 0;
int compare_dest = 0;
int copy_dest = 0;
-@@ -367,6 +369,8 @@ void usage(enum logcode F)
+@@ -368,6 +370,8 @@ void usage(enum logcode F)
rprintf(F," --delay-updates put all updated files into place at transfer's end\n");
rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n");
rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
rprintf(F," --timeout=TIME set I/O timeout in seconds\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");
-@@ -568,6 +572,8 @@ static struct poptOption long_options[]
- {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 },
- {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0},
- {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
+@@ -582,6 +586,8 @@ static struct poptOption long_options[]
+ {"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0},
+ {"numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 1, 0, 0 },
+ {"no-numeric-ids", 0, POPT_ARG_VAL, &numeric_ids, 0, 0, 0 },
+ {"usermap", 0, POPT_ARG_STRING, &usermap, 0, 0, 0 },
+ {"groupmap", 0, POPT_ARG_STRING, &groupmap, 0, 0, 0 },
{"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 },
+ {"no-timeout", 0, POPT_ARG_VAL, &io_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 },
-@@ -1857,6 +1863,18 @@ void server_options(char **args,int *arg
+@@ -1873,6 +1879,18 @@ void server_options(char **args,int *arg
args[ac++] = "--numeric-ids";
if (am_sender) {