Add conditional support for excluding types of files from xattr ops.
authorWayne Davison <wayned@samba.org>
Sat, 8 Aug 2009 20:21:26 +0000 (13:21 -0700)
committerWayne Davison <wayned@samba.org>
Sat, 8 Aug 2009 20:21:26 +0000 (13:21 -0700)
flist.c
xattrs.c

diff --git a/flist.c b/flist.c
index 1dee087..7208efa 100644 (file)
--- 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;
index 0eceb39..7df6784 100644 (file)
--- 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);
 }