Avoid reading ACL/xattr info on filetypes not being copied.
[rsync/rsync.git] / xattrs.c
index e6a7156..3a7cb25 100644 (file)
--- a/xattrs.c
+++ b/xattrs.c
@@ -33,6 +33,9 @@ extern int am_generator;
 extern int read_only;
 extern int list_only;
 extern int preserve_xattrs;
+extern int preserve_links;
+extern int preserve_devices;
+extern int preserve_specials;
 extern int checksum_seed;
 
 #define RSYNC_XAL_INITIAL 5
@@ -139,7 +142,7 @@ static ssize_t get_xattr_names(const char *fname)
                  got_error:
                        rsyserr(FERROR_XFER, errno,
                                "get_xattr_names: llistxattr(\"%s\",%s) failed",
-                               fname, big_num(arg));
+                               full_fname(fname), big_num(arg));
                        return -1;
                }
                list_len = sys_llistxattr(fname, NULL, 0);
@@ -175,7 +178,7 @@ static char *get_xattr_data(const char *fname, const char *name, size_t *len_ptr
                        return NULL;
                rsyserr(FERROR_XFER, errno,
                        "get_xattr_data: lgetxattr(\"%s\",\"%s\",0) failed",
-                       fname, name);
+                       full_fname(fname), name);
                return NULL;
        }
 
@@ -192,11 +195,11 @@ static char *get_xattr_data(const char *fname, const char *name, size_t *len_ptr
                        if (len == (size_t)-1) {
                                rsyserr(FERROR_XFER, errno,
                                    "get_xattr_data: lgetxattr(\"%s\",\"%s\",%ld)"
-                                   " failed", fname, name, (long)datum_len);
+                                   " failed", full_fname(fname), name, (long)datum_len);
                        } else {
                                rprintf(FERROR_XFER,
                                    "get_xattr_data: lgetxattr(\"%s\",\"%s\",%ld)"
-                                   " returned %ld\n", fname, name,
+                                   " returned %ld\n", full_fname(fname), name,
                                    (long)datum_len, (long)len);
                        }
                        free(ptr);
@@ -285,18 +288,24 @@ 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;
+       if (S_ISREG(sxp->st.st_mode) || S_ISDIR(sxp->st.st_mode)) {
+               /* Everyone supports this. */
+       } else if (S_ISLNK(sxp->st.st_mode)) {
+#ifndef NO_SYMLINK_XATTRS
+               if (!preserve_links)
 #endif
-#ifdef NO_DEVICE_XATTRS
-       if (IS_DEVICE(sxp->st.st_mode))
-               return 0;
+                       return 0;
+       } else if (IS_SPECIAL(sxp->st.st_mode)) {
+#ifndef NO_SPECIAL_XATTRS
+               if (!preserve_specials)
 #endif
-#ifdef NO_SYMLINK_XATTRS
-       if (S_ISLNK(sxp->st.st_mode))
-               return 0;
+                       return 0;
+       } else if (IS_DEVICE(sxp->st.st_mode)) {
+#ifndef NO_DEVICE_XATTRS
+               if (!preserve_devices)
 #endif
+                       return 0;
+       }
 
        if (rsync_xal_get(fname, sxp->xattr) < 0) {
                free_xattr(sxp);
@@ -337,7 +346,7 @@ int copy_xattrs(const char *source, const char *dest)
                        int save_errno = errno ? errno : EINVAL;
                        rsyserr(FERROR_XFER, errno,
                                "copy_xattrs: lsetxattr(\"%s\",\"%s\") failed",
-                               dest, name);
+                               full_fname(dest), name);
                        errno = save_errno;
                        return -1;
                }
@@ -822,7 +831,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
                        else if (sys_lsetxattr(fname, name, ptr, len) < 0) {
                                rsyserr(FERROR_XFER, errno,
                                        "rsync_xal_set: lsetxattr(\"%s\",\"%s\") failed",
-                                       fname, name);
+                                       full_fname(fname), name);
                                ret = -1;
                        } else /* make sure caller sets mtime */
                                sxp->st.st_mtime = (time_t)-1;
@@ -843,7 +852,7 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
                if (sys_lsetxattr(fname, name, rxas[i].datum, rxas[i].datum_len) < 0) {
                        rsyserr(FERROR_XFER, errno,
                                "rsync_xal_set: lsetxattr(\"%s\",\"%s\") failed",
-                               fname, name);
+                               full_fname(fname), name);
                        ret = -1;
                } else /* make sure caller sets mtime */
                        sxp->st.st_mtime = (time_t)-1;
@@ -872,8 +881,8 @@ static int rsync_xal_set(const char *fname, item_list *xalp,
                if (i == xalp->count) {
                        if (sys_lremovexattr(fname, name) < 0) {
                                rsyserr(FERROR_XFER, errno,
-                                       "rsync_xal_clear: lremovexattr(\"%s\",\"%s\") failed",
-                                       fname, name);
+                                       "rsync_xal_set: lremovexattr(\"%s\",\"%s\") failed",
+                                       full_fname(fname), name);
                                ret = -1;
                        } else /* make sure caller sets mtime */
                                sxp->st.st_mtime = (time_t)-1;
@@ -935,7 +944,7 @@ int set_xattr_acl(const char *fname, int is_access_acl, const char *buf, size_t
        if (sys_lsetxattr(fname, name, buf, buf_len) < 0) {
                rsyserr(FERROR_XFER, errno,
                        "set_xattr_acl: lsetxattr(\"%s\",\"%s\") failed",
-                       fname, name);
+                       full_fname(fname), name);
                return -1;
        }
        return 0;