int ignore_perishable = 0;
int non_perishable_cnt = 0;
+int maybe_ATTRS_REPORT = 0;
static int deletion_count = 0; /* used to implement --max-delete */
static int deldelay_size = 0, deldelay_cnt = 0;
int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st)
{
- if (preserve_perms
- && (unsigned)(st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
+ if (preserve_perms && !BITS_EQUAL(st->st_mode, file->mode, CHMOD_BITS))
return 0;
if (am_root && preserve_uid && st->st_uid != F_UID(file))
&& (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
|| (keep_time && cmp_time(file->modtime, st->st_mtime) != 0))
iflags |= ITEM_REPORT_TIME;
- if ((unsigned)(st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
+ if (!BITS_EQUAL(st->st_mode, file->mode, CHMOD_BITS))
iflags |= ITEM_REPORT_PERMS;
if (preserve_uid && am_root && F_UID(file) != st->st_uid)
iflags |= ITEM_REPORT_OWNER;
void check_for_finished_hlinks(int itemizing, enum logcode code)
{
struct file_struct *file;
+ char fbuf[MAXPATHLEN];
int ndx;
while ((ndx = get_hlink_num()) != -1) {
if (!F_IS_HLINKED(file))
continue;
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, f_name(file, fbuf), NULL, itemizing, code, -1);
}
}
#endif
* value if we found an alternate basis file. */
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)
+ enum logcode code)
{
int best_match = -1;
int match_level = 0;
if (match_level == 3 && !copy_dest) {
#ifdef SUPPORT_HARD_LINKS
if (link_dest) {
- int i = itemizing && (verbose > 1 || stdout_format_has_i > 1);
- if (hard_link_one(file, ndx, fname, 0, stp,
- cmpbuf, 1, i, code) < 0)
+ if (!hard_link_one(file, fname, cmpbuf, 1))
goto try_a_copy;
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, j);
+ finish_hard_link(file, fname, stp, itemizing, code, j);
+ if (itemizing && (verbose > 1 || stdout_format_has_i > 1)) {
+ itemize(file, ndx, 1, stp,
+ ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS,
+ 0, "");
+ }
} else
#endif
if (itemizing)
itemize(file, ndx, 0, stp, 0, 0, NULL);
- if (verbose > 1 && maybe_ATTRS_REPORT) {
+ if (verbose > 1 && maybe_ATTRS_REPORT)
rprintf(FCLIENT, "%s is uptodate\n", fname);
- }
return -2;
}
if (match_level >= 2) {
+#ifdef SUPPORT_HARD_LINKS
try_a_copy: /* Copy the file locally. */
+#endif
if (copy_file(cmpbuf, fname, file->mode) < 0) {
if (verbose) {
rsyserr(FINFO, errno, "copy_file %s => %s",
}
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, j);
+ finish_hard_link(file, fname, stp, itemizing, code, -1);
#endif
return -2;
}
* value if we found an alternate basis file. */
static int try_dests_non(struct file_struct *file, char *fname, int ndx,
char *cmpbuf, STRUCT_STAT *stp, int itemizing,
- int maybe_ATTRS_REPORT, enum logcode code)
+ enum logcode code)
{
char lnk[MAXPATHLEN];
int best_match = -1;
return j;
}
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, NULL, itemizing, code, -1);
} else
#endif
match_level = 2;
* Note that f_out is set to -1 when doing final directory-permission and
* modification-time repair. */
static void recv_generator(char *fname, struct file_struct *file, int ndx,
- int itemizing, int maybe_ATTRS_REPORT,
- enum logcode code, int f_out)
+ int itemizing, enum logcode code, int f_out)
{
static int missing_below = -1, excluded_below = -1;
static const char *parent_dirname = "";
}
if (statret != 0 && basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
- itemizing, maybe_ATTRS_REPORT, code);
+ itemizing, code);
if (j == -2) {
itemizing = 0;
code = FNONE;
}
#ifdef SUPPORT_HARD_LINKS
- if (preserve_hard_links && F_IS_HLINKED(file)
- && hard_link_check(file, ndx, fname, statret, &st,
- itemizing, code, HL_CHECK_MASTER))
+ if (preserve_hard_links && F_HLINK_NOT_FIRST(file)
+ && hard_link_check(file, ndx, fname, statret, &st, itemizing, code))
return;
#endif
set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT);
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, &st, itemizing, code, -1);
#endif
if (remove_source_files == 1)
goto return_with_success;
return;
} else if (basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
- itemizing, maybe_ATTRS_REPORT, code);
+ itemizing, code);
if (j == -2) {
#ifndef CAN_HARDLINK_SYMLINK
if (link_dest) {
statret = 1;
}
#ifdef SUPPORT_HARD_LINKS
- if (preserve_hard_links && F_IS_HLINKED(file)
- && hard_link_check(file, ndx, fname, -1, &st,
- itemizing, code, HL_SKIP))
+ if (preserve_hard_links && F_HLINK_NOT_LAST(file))
return;
#endif
if (do_symlink(sl, fname) != 0) {
rprintf(code, "%s -> %s\n", fname, sl);
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, NULL, itemizing, code, -1);
#endif
/* This does not check remove_source_files == 1
* because this is one of the items that the old
t = "special file";
}
if (statret == 0
- && (unsigned)(st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
+ && BITS_EQUAL(st.st_mode, file->mode, _S_IFMT)
&& st.st_rdev == rdev) {
/* The device or special file is identical. */
if (itemizing)
set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT);
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, &st, itemizing, code, -1);
#endif
if (remove_source_files == 1)
goto return_with_success;
return;
} else if (basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
- itemizing, maybe_ATTRS_REPORT, code);
+ itemizing, code);
if (j == -2) {
#ifndef CAN_HARDLINK_SPECIAL
if (link_dest) {
statret = 1;
}
#ifdef SUPPORT_HARD_LINKS
- if (preserve_hard_links && F_IS_HLINKED(file)
- && hard_link_check(file, ndx, fname, -1, &st,
- itemizing, code, HL_SKIP))
+ if (preserve_hard_links && F_HLINK_NOT_LAST(file))
return;
#endif
if (verbose > 2) {
rprintf(code, "%s\n", fname);
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, NULL, itemizing, code, -1);
#endif
if (remove_source_files == 1)
goto return_with_success;
if (statret != 0 && basis_dir[0] != NULL) {
int j = try_dests_reg(file, fname, ndx, fnamecmpbuf, &st,
- itemizing, maybe_ATTRS_REPORT, code);
+ itemizing, code);
if (j == -2) {
if (remove_source_files == 1)
goto return_with_success;
if (statret != 0) {
#ifdef SUPPORT_HARD_LINKS
- if (preserve_hard_links && F_IS_HLINKED(file)
- && hard_link_check(file, ndx, fname, statret, &st,
- itemizing, code, HL_SKIP))
+ if (preserve_hard_links && F_HLINK_NOT_LAST(file))
return;
#endif
if (stat_errno == ENOENT)
do_unlink(partialptr);
handle_partial_dir(partialptr, PDIR_DELETE);
}
- if (itemizing) {
- itemize(file, ndx, real_ret, &real_st,
- 0, 0, NULL);
- }
+ if (itemizing)
+ itemize(file, ndx, statret, &st, 0, 0, NULL);
set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT);
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, &st, itemizing, code, -1);
#endif
if (remove_source_files != 1)
return;
pretend_missing:
/* pretend the file didn't exist */
#ifdef SUPPORT_HARD_LINKS
- if (preserve_hard_links && F_IS_HLINKED(file)
- && hard_link_check(file, ndx, fname, statret, &st,
- itemizing, code, HL_SKIP))
+ if (preserve_hard_links && F_HLINK_NOT_LAST(file))
return;
#endif
statret = real_ret = -1;
notify_others:
if (remove_source_files && !delay_updates && !phase)
increment_active_files(ndx, itemizing, code);
+#ifdef SUPPORT_HARD_LINKS
+ if (preserve_hard_links && F_IS_HLINKED(file))
+ file->flags |= FLAG_SENT;
+#endif
write_int(f_out, ndx);
if (itemizing) {
int iflags = ITEM_TRANSFER;
if (!do_xfers) {
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_IS_HLINKED(file))
- hard_link_cluster(file, ndx, itemizing, code, -1);
+ finish_hard_link(file, fname, &st, itemizing, code, -1);
#endif
return;
}
{
int i;
char fbuf[MAXPATHLEN];
- int itemizing, maybe_ATTRS_REPORT;
+ int itemizing;
enum logcode code;
int lull_mod = allowed_lull * 5;
int need_retouch_dir_times = preserve_times && !omit_dir_times;
strlcpy(fbuf, local_name, sizeof fbuf);
else
f_name(file, fbuf);
- recv_generator(fbuf, file, i, itemizing, maybe_ATTRS_REPORT,
- code, f_out);
+ recv_generator(fbuf, file, i, itemizing, code, f_out);
/* We need to ensure that any dirs we create have writeable
* permissions during the time we are putting files within
else if (!(i % 200))
maybe_flush_socket();
}
- recv_generator(NULL, NULL, 0, 0, 0, code, -1);
+ recv_generator(NULL, NULL, 0, 0, code, -1);
if (delete_during)
delete_in_dir(NULL, NULL, NULL, NULL);
strlcpy(fbuf, local_name, sizeof fbuf);
else
f_name(file, fbuf);
- recv_generator(fbuf, file, i, itemizing, maybe_ATTRS_REPORT,
- code, f_out);
+ recv_generator(fbuf, file, i, itemizing, code, f_out);
}
phase++;
continue;
}
recv_generator(f_name(file, NULL), file, i, itemizing,
- maybe_ATTRS_REPORT, code, -1);
+ code, -1);
if (allowed_lull && !(++j % lull_mod))
maybe_send_keepalive();
else if (!(j % 200))
maybe_flush_socket();
}
}
- recv_generator(NULL, NULL, 0, 0, 0, code, -1);
+ recv_generator(NULL, NULL, 0, 0, code, -1);
if (max_delete >= 0 && deletion_count > max_delete) {
rprintf(FINFO,