extern int copy_dirlinks;
extern int keep_dirlinks;
extern int preserve_acls;
+extern int preserve_xattrs;
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_devices;
if (dir && !push_dir(dir, 0)) {
io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(dir));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(dir), curr_dir);
return 0;
}
if (preserve_acls && !S_ISLNK(mode))
receive_acl(file, f);
#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ receive_xattr(file, f );
+#endif
if (S_ISREG(mode) || S_ISLNK(mode))
stats.total_size += file_length;
int flags, int filter_flags)
{
struct file_struct *file;
-#ifdef SUPPORT_ACLS
+#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS
statx sx;
#endif
return NULL;
}
#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs && f >= 0) {
+ sx.xattr = NULL;
+ if (get_xattr(fname, &sx) < 0)
+ return NULL;
+ }
+#endif
maybe_emit_filelist_progress(flist->count + flist_count_offset);
send_acl(&sx, f);
free_acl(&sx);
}
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs) {
+ F_XATTR(file) = send_xattr(&sx, f);
+ free_xattr(&sx);
+ }
#endif
}
return file;
disable_buffering = io_start_buffering_out(f);
if (filesfrom_fd >= 0) {
if (argv[0] && !push_dir(argv[0], 0)) {
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(argv[0]));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(argv[0]), curr_dir);
exit_cleanup(RERR_FILESELECT);
}
use_ff_fd = 1;
} else if (!push_flist_dir(lastdir, lastdir_len)) {
push_error:
io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(dir));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(dir), curr_dir);
continue;
}
}