{
struct sum_struct *s;
int32 i;
- int lull_mod = allowed_lull * 5;
+ int lull_mod = protocol_version >= 31 ? 0 : allowed_lull * 5;
OFF_T offset = 0;
if (!(s = new(struct sum_struct)))
s->sums[i].len = s->blength;
offset += s->sums[i].len;
- if (allowed_lull && !(i % lull_mod))
- maybe_send_keepalive();
+ if (lull_mod && !(i % lull_mod))
+ maybe_send_keepalive(time(NULL), True);
if (DEBUG_GTE(DELTASUM, 3)) {
rprintf(FINFO,
void successful_send(int ndx)
{
char fname[MAXPATHLEN];
+ char *failed_op;
struct file_struct *file;
struct file_list *flist;
+ STRUCT_STAT st;
if (!remove_source_files)
return;
return;
f_name(file, fname);
- if (do_unlink(fname) == 0) {
+ if (do_lstat(fname, &st) < 0) {
+ failed_op = "re-lstat";
+ goto failed;
+ }
+
+ if (st.st_size != F_LENGTH(file) || st.st_mtime != file->modtime
+#ifdef ST_MTIME_NSEC
+ || (NSEC_BUMP(file) && (uint32)st.ST_MTIME_NSEC != F_MOD_NSEC(file))
+#endif
+ ) {
+ rprintf(FERROR, "ERROR: Skipping sender remove for changed file: %s\n", fname);
+ return;
+ }
+
+ if (do_unlink(fname) < 0) {
+ failed_op = "remove";
+ failed:
+ if (errno == ENOENT)
+ rprintf(FINFO, "sender file already removed: %s\n", fname);
+ else
+ rsyserr(FERROR, errno, "sender failed to %s %s", failed_op, fname);
+ } else {
if (INFO_GTE(REMOVE, 1))
rprintf(FINFO, "sender removed %s\n", fname);
- } else
- rsyserr(FERROR, errno, "sender failed to remove %s", fname);
+ }
}
static void write_ndx_and_attrs(int f_out, int ndx, int iflags,
if (iflags & ITEM_XNAME_FOLLOWS)
write_vstring(f_out, buf, len);
#ifdef SUPPORT_XATTRS
- if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
+ if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
+ && (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
send_xattr_request(fname, file, f_out);
#endif
}
rprintf(FINFO, "send_files(%d, %s%s%s)\n", ndx, path,slash,fname);
#ifdef SUPPORT_XATTRS
- if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
+ if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
+ && (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
recv_xattr_request(file, f_in);
#endif
rsyserr(FERROR_XFER, errno, "fstat failed");
free_sums(s);
close(fd);
- exit_cleanup(RERR_PROTOCOL);
+ exit_cleanup(RERR_FILEIO);
}
if (st.st_size) {