Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revised the logic for when to call log_exit() to handle the
[rsync/rsync.git]
/
generator.c
diff --git
a/generator.c
b/generator.c
index
26970ce
..
c11672f
100644
(file)
--- a/
generator.c
+++ b/
generator.c
@@
-606,10
+606,16
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
char *cmpbuf, STRUCT_STAT *stp, int itemizing,
int maybe_ATTRS_REPORT, enum logcode code)
{
char *cmpbuf, STRUCT_STAT *stp, int itemizing,
int maybe_ATTRS_REPORT, enum logcode code)
{
+ int save_ignore_times = ignore_times;
+ int save_size_only = size_only;
int best_match = -1;
int match_level = 0;
int j = 0;
int best_match = -1;
int match_level = 0;
int j = 0;
+ /* We can't let these send-affecting options affect our checking
+ * for identical files in the alternate basis dirs. */
+ ignore_times = size_only = 0;
+
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
if (link_stat(cmpbuf, stp, 0) < 0 || !S_ISREG(stp->st_mode))
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
if (link_stat(cmpbuf, stp, 0) < 0 || !S_ISREG(stp->st_mode))
@@
-628,7
+634,7
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
case 2:
if (!unchanged_attrs(file, stp))
continue;
case 2:
if (!unchanged_attrs(file, stp))
continue;
- if (
(always_checksum || ignore_times)
+ if (
always_checksum
&& cmp_time(stp->st_mtime, file->modtime))
continue;
best_match = j;
&& cmp_time(stp->st_mtime, file->modtime))
continue;
best_match = j;
@@
-638,6
+644,9
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
break;
} while (basis_dir[++j] != NULL);
break;
} while (basis_dir[++j] != NULL);
+ ignore_times = save_ignore_times;
+ size_only = save_size_only;
+
if (!match_level)
return -1;
if (!match_level)
return -1;
@@
-648,8
+657,8
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
match_level = 0;
}
match_level = 0;
}
-#ifdef HAVE_LINK
if (match_level == 3 && !copy_dest) {
if (match_level == 3 && !copy_dest) {
+#ifdef SUPPORT_HARD_LINKS
if (link_dest) {
if (hard_link_one(file, ndx, fname, 0, stp,
cmpbuf, 1,
if (link_dest) {
if (hard_link_one(file, ndx, fname, 0, stp,
cmpbuf, 1,
@@
-658,7
+667,9
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
goto try_a_copy;
if (preserve_hard_links && file->link_u.links)
hard_link_cluster(file, ndx, itemizing, code);
goto try_a_copy;
if (preserve_hard_links && file->link_u.links)
hard_link_cluster(file, ndx, itemizing, code);
- } else if (itemizing)
+ } else
+#endif
+ if (itemizing)
itemize(file, ndx, 0, stp, 0, 0, NULL);
if (verbose > 1 && maybe_ATTRS_REPORT) {
code = daemon_log_format_has_i || dry_run
itemize(file, ndx, 0, stp, 0, 0, NULL);
if (verbose > 1 && maybe_ATTRS_REPORT) {
code = daemon_log_format_has_i || dry_run
@@
-667,7
+678,6
@@
static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
}
return -2;
}
}
return -2;
}
-#endif
if (match_level >= 2) {
try_a_copy: /* Copy the file locally. */
if (match_level >= 2) {
try_a_copy: /* Copy the file locally. */
@@
-731,9
+741,10
@@
static int try_dests_non(struct file_struct *file, char *fname, int ndx,
} else {
rprintf(FERROR,
"internal: try_dests_non() called with invalid mode (%o)\n",
} else {
rprintf(FERROR,
"internal: try_dests_non() called with invalid mode (%o)\n",
- file->mode);
+
(int)
file->mode);
exit_cleanup(RERR_UNSUPPORTED);
}
exit_cleanup(RERR_UNSUPPORTED);
}
+#ifdef SUPPORT_HARD_LINKS
if (link_dest
#ifndef CAN_HARDLINK_SYMLINK
&& !S_ISLNK(file->mode)
if (link_dest
#ifndef CAN_HARDLINK_SYMLINK
&& !S_ISLNK(file->mode)
@@
-751,6
+762,7
@@
static int try_dests_non(struct file_struct *file, char *fname, int ndx,
if (preserve_hard_links && file->link_u.links)
hard_link_cluster(file, ndx, itemizing, code);
}
if (preserve_hard_links && file->link_u.links)
hard_link_cluster(file, ndx, itemizing, code);
}
+#endif
if (itemizing && log_format_has_i && verbose > 1) {
int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE
+ (link_dest ? ITEM_XNAME_FOLLOWS : 0);
if (itemizing && log_format_has_i && verbose > 1) {
int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE
+ (link_dest ? ITEM_XNAME_FOLLOWS : 0);
@@
-848,7
+860,7
@@
static void recv_generator(char *fname, struct file_struct *file, int ndx,
char *dn = file->dirname ? file->dirname : ".";
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
if (relative_paths && !implied_dirs
char *dn = file->dirname ? file->dirname : ".";
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
if (relative_paths && !implied_dirs
- &&
do
_stat(dn, &st) < 0
+ &&
safe
_stat(dn, &st) < 0
&& create_directory_path(fname) < 0) {
rsyserr(FERROR, errno,
"recv_generator: mkdir %s failed",
&& create_directory_path(fname) < 0) {
rsyserr(FERROR, errno,
"recv_generator: mkdir %s failed",