- This patch needs to be rewritten to more efficiently handle large xattrs.
+ - Extraneous xattr values need to be removed from files that are not being
+ recreated.
+
- We need to affect the itemized output to know when xattrs are being updated.
- We need to affect the --link-dest option to avoid hard-linking two files
}
--- old/lib/sysxattr.c
+++ new/lib/sysxattr.c
-@@ -0,0 +1,61 @@
+@@ -0,0 +1,71 @@
+/*
+ * Extended attribute support for rsync.
+ *
+ return lsetxattr(path, name, value, size, flags);
+}
+
++int sys_lremovexattr(const char *path, const char *name)
++{
++ return lremovexattr(path, name);
++}
++
+ssize_t sys_llistxattr(const char *path, char *list, size_t size)
+{
+ return llistxattr(path, list, size);
+ return setxattr(path, name, value, size, 0, XATTR_NOFOLLOW | flags);
+}
+
++int sys_lremovexattr(const char *path, const char *name)
++{
++ return removexattr(path, name, XATTR_NOFOLLOW);
++}
++
+ssize_t sys_llistxattr(const char *path, char *list, size_t size)
+{
+ return listxattr(path, list, size, XATTR_NOFOLLOW);
+#endif /* No xattrs */
--- old/lib/sysxattr.h
+++ new/lib/sysxattr.h
-@@ -0,0 +1,19 @@
+@@ -0,0 +1,25 @@
+#ifdef SUPPORT_XATTRS
+#if defined HAVE_ATTR_XATTR_H
+#include <attr/xattr.h>
+
+#if defined HAVE_LINUX_XATTRS || defined HAVE_OSX_XATTRS
+
++/* Linux 2.4 does not define this as a distinct errno value: */
++#ifndef ENOATTR
++#define ENOATTR ENODATA
++#endif
++
+ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size);
+int sys_lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags);
++int sys_lremovexattr(const char *path, const char *name);
+ssize_t sys_llistxattr(const char *path, char *list, size_t size);
+
+#else
extern int preserve_perms;
extern int preserve_executability;
extern int preserve_times;
-@@ -229,6 +230,10 @@ int set_file_attrs(char *fname, struct f
- if (preserve_acls && set_acl(fname, file, sxp) == 0)
- updated = 1;
- #endif
+@@ -219,6 +220,10 @@ int set_file_attrs(char *fname, struct f
+ if (daemon_chmod_modes && !S_ISLNK(new_mode))
+ new_mode = tweak_mode(new_mode, daemon_chmod_modes);
+
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs && set_xattr(fname, file, sxp) == 0)
+ updated = 1;
+#endif
-
- #ifdef HAVE_CHMOD
- if ((sxp->st.st_mode & CHMOD_BITS) != (new_mode & CHMOD_BITS)) {
+ #ifdef SUPPORT_ACLS
+ /* It's OK to call set_acl() now, even for a dir, as the generator
+ * will enable owner-writability using chmod, if necessary.
--- old/rsync.h
+++ new/rsync.h
@@ -501,6 +501,10 @@ struct idev {
transfer. The resulting value is treated as though it was the permissions
--- old/xattr.c
+++ new/xattr.c
-@@ -0,0 +1,367 @@
+@@ -0,0 +1,368 @@
+/*
+ * Extended Attribute support for rsync.
+ * Written by Jay Fenlason, vaguely based on the ACLs patch.
+ } else {
+ rprintf(FERROR,
+ "rsync_xal_get: lgetxattr(%s,%s)"
-+ " returned %d instead of %d\n",
-+ fname, name, size, datum_size);
++ " returned %ld instead of %ld\n",
++ fname, name,
++ (long)size, (long)datum_size);
+ }
+ return -1;
+ }