X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e982d591465013c547ab2371d4818345dac819ff..0a23e33630d96f6083b40bc98d7a12d7ad7632f6:/hlink.c diff --git a/hlink.c b/hlink.c index cdafa9fa..05813985 100644 --- a/hlink.c +++ b/hlink.c @@ -21,6 +21,7 @@ */ #include "rsync.h" +#include "inums.h" extern int dry_run; extern int list_only; @@ -29,6 +30,7 @@ extern int inc_recurse; extern int do_xfers; extern int link_dest; extern int preserve_acls; +extern int preserve_xattrs; extern int make_backups; extern int protocol_version; extern int remove_source_files; @@ -73,7 +75,7 @@ struct ht_int64_node *idev_find(int64 dev, int64 ino) if (DEBUG_GTE(HLINK, 3)) { rprintf(FINFO, "[%s] created hashtable for dev %s\n", - who_am_i(), big_num(dev, 0)); + who_am_i(), big_num(dev)); } } } else @@ -393,6 +395,9 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname, int j = 0; #ifdef SUPPORT_ACLS alt_sx.acc_acl = alt_sx.def_acl = NULL; +#endif +#ifdef SUPPORT_XATTRS + alt_sx.xattr = NULL; #endif do { pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); @@ -422,19 +427,37 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname, sxp->st = alt_sx.st; #ifdef SUPPORT_ACLS if (preserve_acls && !S_ISLNK(file->mode)) { - if (!ACL_READY(*sxp)) + free_acl(sxp); + if (!ACL_READY(alt_sx)) get_acl(cmpbuf, sxp); else { sxp->acc_acl = alt_sx.acc_acl; sxp->def_acl = alt_sx.def_acl; + alt_sx.acc_acl = alt_sx.def_acl = NULL; } } #endif - } +#ifdef SUPPORT_XATTRS + if (preserve_xattrs) { + free_xattr(sxp); + if (!XATTR_READY(alt_sx)) + get_xattr(cmpbuf, sxp); + else { + sxp->xattr = alt_sx.xattr; + alt_sx.xattr = NULL; + } + } +#endif + } else { #ifdef SUPPORT_ACLS - else if (preserve_acls) - free_acl(&alt_sx); + if (preserve_acls) + free_acl(&alt_sx); +#endif +#ifdef SUPPORT_XATTRS + if (preserve_xattrs) + free_xattr(&alt_sx); #endif + } } if (maybe_hard_link(file, ndx, fname, statret, sxp, prev_name, &prev_st, @@ -501,6 +524,9 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, #ifdef SUPPORT_ACLS prev_sx.acc_acl = prev_sx.def_acl = NULL; #endif +#ifdef SUPPORT_XATTRS + prev_sx.xattr = NULL; +#endif while ((ndx = prev_ndx) >= 0) { int val; @@ -516,6 +542,10 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, #ifdef SUPPORT_ACLS if (preserve_acls) free_acl(&prev_sx); +#endif +#ifdef SUPPORT_XATTRS + if (preserve_xattrs) + free_xattr(&prev_sx); #endif if (val < 0) continue;