From 0d5ebab1d6df5169c5834c02c978fd5bb67421ca Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 8 Aug 2009 13:21:26 -0700 Subject: [PATCH] Add conditional support for excluding types of files from xattr ops. --- flist.c | 1 + xattrs.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/flist.c b/flist.c index 1dee0874..7208efa4 100644 --- a/flist.c +++ b/flist.c @@ -1476,6 +1476,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, #endif #ifdef SUPPORT_XATTRS if (preserve_xattrs) { + sx.st.st_mode = file->mode; if (get_xattr(fname, &sx) < 0) { io_error |= IOERR_GENERAL; return NULL; diff --git a/xattrs.c b/xattrs.c index 0eceb393..7df67848 100644 --- a/xattrs.c +++ b/xattrs.c @@ -284,6 +284,20 @@ int get_xattr(const char *fname, stat_x *sxp) { sxp->xattr = new(item_list); *sxp->xattr = empty_xattr; + +#ifdef NO_SPECIAL_XATTRS + if (IS_SPECIAL(sxp->st.st_mode)) + return 0; +#endif +#ifdef NO_DEVICE_XATTRS + if (IS_DEVICE(sxp->st.st_mode)) + return 0; +#endif +#ifdef NO_SYMLINK_XATTRS + if (S_ISLNK(sxp->st.st_mode)) + return 0; +#endif + if (rsync_xal_get(fname, sxp->xattr) < 0) { free_xattr(sxp); return -1; @@ -884,6 +898,25 @@ int set_xattr(const char *fname, const struct file_struct *file, return -1; } +#ifdef NO_SPECIAL_XATTRS + if (IS_SPECIAL(sxp->st.st_mode)) { + errno = ENOTSUP; + return -1; + } +#endif +#ifdef NO_DEVICE_XATTRS + if (IS_DEVICE(sxp->st.st_mode)) { + errno = ENOTSUP; + return -1; + } +#endif +#ifdef NO_SYMLINK_XATTRS + if (S_ISLNK(sxp->st.st_mode)) { + errno = ENOTSUP; + return -1; + } +#endif + ndx = F_XATTR(file); return rsync_xal_set(fname, lst + ndx, fnamecmp, sxp); } -- 2.34.1