int maybe_ATTRS_REPORT, enum logcode code)
{
int save_ignore_times = ignore_times;
-@@ -618,7 +629,7 @@ static int try_dests_reg(struct file_str
+@@ -617,7 +628,7 @@ static int try_dests_reg(struct file_str
do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
continue;
switch (match_level) {
case 0:
-@@ -626,16 +637,20 @@ static int try_dests_reg(struct file_str
+@@ -625,16 +636,20 @@ static int try_dests_reg(struct file_str
match_level = 1;
/* FALL THROUGH */
case 1:
+#endif
+ if (!unchanged_attrs(file, sxp))
continue;
- if (always_checksum
+ if (always_checksum && preserve_times
- && cmp_time(stp->st_mtime, file->modtime))
+ && cmp_time(sxp->st.st_mtime, file->modtime))
continue;
best_match = j;
match_level = 3;
-@@ -653,14 +668,14 @@ static int try_dests_reg(struct file_str
+@@ -651,14 +666,14 @@ static int try_dests_reg(struct file_str
if (j != best_match) {
j = best_match;
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
cmpbuf, 1,
itemizing && verbose > 1,
code) < 0)
-@@ -669,8 +684,13 @@ static int try_dests_reg(struct file_str
+@@ -667,8 +682,13 @@ static int try_dests_reg(struct file_str
hard_link_cluster(file, ndx, itemizing, code);
} else
#endif
if (verbose > 1 && maybe_ATTRS_REPORT) {
code = logfile_format_has_i || dry_run
? FCLIENT : FINFO;
-@@ -688,8 +708,13 @@ static int try_dests_reg(struct file_str
+@@ -686,8 +706,13 @@ static int try_dests_reg(struct file_str
}
return -1;
}
set_file_attrs(fname, file, NULL, 0);
if (maybe_ATTRS_REPORT
&& ((!itemizing && verbose && match_level == 2)
-@@ -714,13 +739,18 @@ static int try_dests_non(struct file_str
+@@ -712,13 +737,18 @@ static int try_dests_non(struct file_str
enum logcode code)
{
char fnamebuf[MAXPATHLEN];
continue;
if (S_ISLNK(file->mode)) {
#ifdef SUPPORT_LINKS
-@@ -733,10 +763,10 @@ static int try_dests_non(struct file_str
+@@ -731,10 +761,10 @@ static int try_dests_non(struct file_str
#endif
continue;
} else if (IS_SPECIAL(file->mode)) {
continue;
} else {
rprintf(FERROR,
-@@ -767,7 +797,15 @@ static int try_dests_non(struct file_str
+@@ -765,7 +795,15 @@ static int try_dests_non(struct file_str
int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE
+ (link_dest ? ITEM_XNAME_FOLLOWS : 0);
char *lp = link_dest ? "" : NULL;
}
if (verbose > 1 && maybe_ATTRS_REPORT) {
code = logfile_format_has_i || dry_run
-@@ -781,6 +819,7 @@ static int try_dests_non(struct file_str
+@@ -779,6 +817,7 @@ static int try_dests_non(struct file_str
}
static int phase = 0;
/* Acts on the_file_list->file's ndx'th item, whose name is fname. If a dir,
* make sure it exists, and has the right permissions/timestamp info. For
-@@ -802,7 +841,8 @@ static void recv_generator(char *fname,
+@@ -800,7 +839,8 @@ static void recv_generator(char *fname,
static int need_fuzzy_dirlist = 0;
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
struct file_struct *back_file = NULL;
int statret, real_ret, stat_errno;
char *fnamecmp, *partialptr, *backupptr = NULL;
-@@ -853,6 +893,9 @@ static void recv_generator(char *fname,
+@@ -851,6 +891,9 @@ static void recv_generator(char *fname,
dry_run--;
missing_below = -1;
}
if (dry_run > 1) {
statret = -1;
stat_errno = ENOENT;
-@@ -860,7 +903,7 @@ static void recv_generator(char *fname,
+@@ -858,7 +901,7 @@ static void recv_generator(char *fname,
char *dn = file->dirname ? file->dirname : ".";
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
if (relative_paths && !implied_dirs
&& create_directory_path(fname) < 0) {
rsyserr(FERROR, errno,
"recv_generator: mkdir %s failed",
-@@ -872,6 +915,10 @@ static void recv_generator(char *fname,
+@@ -870,6 +913,10 @@ static void recv_generator(char *fname,
}
if (fuzzy_basis)
need_fuzzy_dirlist = 1;
}
parent_dirname = dn;
-@@ -880,7 +927,7 @@ static void recv_generator(char *fname,
+@@ -878,7 +925,7 @@ static void recv_generator(char *fname,
need_fuzzy_dirlist = 0;
}
keep_dirlinks && S_ISDIR(file->mode));
stat_errno = errno;
}
-@@ -898,8 +945,9 @@ static void recv_generator(char *fname,
+@@ -896,8 +943,9 @@ static void recv_generator(char *fname,
* mode based on the local permissions and some heuristics. */
if (!preserve_perms) {
int exists = statret == 0
}
if (S_ISDIR(file->mode)) {
-@@ -908,8 +956,8 @@ static void recv_generator(char *fname,
+@@ -906,8 +954,8 @@ static void recv_generator(char *fname,
* file of that name and it is *not* a directory, then
* we need to delete it. If it doesn't exist, then
* (perhaps recursively) create it. */
return;
statret = -1;
}
-@@ -918,7 +966,11 @@ static void recv_generator(char *fname,
+@@ -916,7 +964,11 @@ static void recv_generator(char *fname,
dry_run++;
}
if (itemizing && f_out != -1) {
statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
}
if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
-@@ -930,19 +982,19 @@ static void recv_generator(char *fname,
+@@ -928,19 +980,19 @@ static void recv_generator(char *fname,
full_fname(fname));
}
}
if (preserve_links && S_ISLNK(file->mode)) {
#ifdef SUPPORT_LINKS
-@@ -960,7 +1012,7 @@ static void recv_generator(char *fname,
+@@ -958,7 +1010,7 @@ static void recv_generator(char *fname,
char lnk[MAXPATHLEN];
int len;
&& (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) {
lnk[len] = 0;
/* A link already pointing to the
-@@ -968,10 +1020,10 @@ static void recv_generator(char *fname,
+@@ -966,10 +1018,10 @@ static void recv_generator(char *fname,
* required. */
if (strcmp(lnk, file->u.link) == 0) {
if (itemizing) {
maybe_ATTRS_REPORT);
if (preserve_hard_links
&& file->link_u.links) {
-@@ -984,9 +1036,9 @@ static void recv_generator(char *fname,
+@@ -982,9 +1034,9 @@ static void recv_generator(char *fname,
}
/* Not the right symlink (or not a symlink), so
* delete it. */
statret = -1;
} else if (basis_dir[0] != NULL) {
if (try_dests_non(file, fname, ndx, itemizing,
-@@ -1002,7 +1054,7 @@ static void recv_generator(char *fname,
+@@ -1000,7 +1052,7 @@ static void recv_generator(char *fname,
}
}
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (do_symlink(file->u.link,fname) != 0) {
-@@ -1011,7 +1063,7 @@ static void recv_generator(char *fname,
+@@ -1009,7 +1061,7 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code && verbose) {
-@@ -1045,18 +1097,22 @@ static void recv_generator(char *fname,
+@@ -1043,18 +1095,22 @@ static void recv_generator(char *fname,
itemizing = code = 0;
}
}
statret = -1;
if (verbose > 2) {
rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
-@@ -1069,7 +1125,7 @@ static void recv_generator(char *fname,
+@@ -1067,7 +1123,7 @@ static void recv_generator(char *fname,
} else {
set_file_attrs(fname, file, NULL, 0);
if (itemizing) {
ITEM_LOCAL_CHANGE, 0, NULL);
}
if (code && verbose)
-@@ -1081,12 +1137,12 @@ static void recv_generator(char *fname,
+@@ -1079,12 +1135,12 @@ static void recv_generator(char *fname,
}
} else {
if (itemizing)
}
if (!S_ISREG(file->mode)) {
-@@ -1120,7 +1176,7 @@ static void recv_generator(char *fname,
+@@ -1118,7 +1174,7 @@ static void recv_generator(char *fname,
}
if (update_only && statret == 0
if (verbose > 1)
rprintf(FINFO, "%s is newer\n", fname);
return;
-@@ -1129,18 +1185,18 @@ static void recv_generator(char *fname,
+@@ -1127,18 +1183,18 @@ static void recv_generator(char *fname,
fnamecmp = fname;
fnamecmp_type = FNAMECMP_FNAME;
if (j != -1) {
fnamecmp = fnamecmpbuf;
fnamecmp_type = j;
-@@ -1149,7 +1205,7 @@ static void recv_generator(char *fname,
+@@ -1147,7 +1203,7 @@ static void recv_generator(char *fname,
}
real_ret = statret;
if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL
&& link_stat(partialptr, &partial_st, 0) == 0
-@@ -1168,7 +1224,7 @@ static void recv_generator(char *fname,
+@@ -1166,7 +1222,7 @@ static void recv_generator(char *fname,
rprintf(FINFO, "fuzzy basis selected for %s: %s\n",
fname, fnamecmpbuf);
}
statret = 0;
fnamecmp = fnamecmpbuf;
fnamecmp_type = FNAMECMP_FUZZY;
-@@ -1177,7 +1233,7 @@ static void recv_generator(char *fname,
+@@ -1175,7 +1231,7 @@ static void recv_generator(char *fname,
if (statret != 0) {
if (preserve_hard_links && file->link_u.links
itemizing, code, HL_SKIP))
return;
if (stat_errno == ENOENT)
-@@ -1187,31 +1243,44 @@ static void recv_generator(char *fname,
+@@ -1185,31 +1241,44 @@ static void recv_generator(char *fname,
return;
}
fnamecmp = partialptr;
fnamecmp_type = FNAMECMP_PARTIAL_DIR;
statret = 0;
-@@ -1235,17 +1304,21 @@ static void recv_generator(char *fname,
+@@ -1233,17 +1302,21 @@ static void recv_generator(char *fname,
pretend_missing:
/* pretend the file didn't exist */
if (preserve_hard_links && file->link_u.links
}
if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
close(fd);
-@@ -1256,7 +1329,7 @@ static void recv_generator(char *fname,
+@@ -1254,7 +1327,7 @@ static void recv_generator(char *fname,
full_fname(backupptr));
free(back_file);
close(fd);
}
if ((f_copy = do_open(backupptr,
O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
-@@ -1264,14 +1337,14 @@ static void recv_generator(char *fname,
+@@ -1262,14 +1335,14 @@ static void recv_generator(char *fname,
full_fname(backupptr));
free(back_file);
close(fd);
}
if (verbose > 2)
-@@ -1289,24 +1362,32 @@ static void recv_generator(char *fname,
+@@ -1287,24 +1360,32 @@ static void recv_generator(char *fname,
iflags |= ITEM_BASIS_TYPE_FOLLOWS;
if (fnamecmp_type == FNAMECMP_FUZZY)
iflags |= ITEM_XNAME_FOLLOWS;
if (f_copy >= 0) {
close(f_copy);
-@@ -1319,6 +1400,13 @@ static void recv_generator(char *fname,
+@@ -1317,6 +1398,13 @@ static void recv_generator(char *fname,
}
close(fd);
}
void generate_files(int f_out, struct file_list *flist, char *local_name)
-@@ -1378,6 +1466,8 @@ void generate_files(int f_out, struct fi
+@@ -1376,6 +1464,8 @@ void generate_files(int f_out, struct fi
* notice that and let us know via the redo pipe (or its closing). */
ignore_timeout = 1;