X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/25c2a6ac0e1f45a0c4fcc425ddaa5e9027a868ac..16edf86595a5a990a942fa045dfb523dae1fe6cb:/flist.c diff --git a/flist.c b/flist.c index bd0ad00e..23def370 100644 --- a/flist.c +++ b/flist.c @@ -43,6 +43,7 @@ extern int one_file_system; 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; @@ -337,8 +338,8 @@ int push_flist_dir(const char *dir, int len) 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; } @@ -888,6 +889,10 @@ static struct file_struct *recv_file_entry(struct file_list *flist, 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; @@ -1160,7 +1165,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, int flags, int filter_flags) { struct file_struct *file; -#ifdef SUPPORT_ACLS +#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS statx sx; #endif @@ -1179,6 +1184,13 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, 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); @@ -1191,6 +1203,12 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, 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; @@ -1439,8 +1457,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) 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; @@ -1568,8 +1586,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } 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; } }