if ((am_root && preserve_devices && IS_DEVICE(file->mode))
--- old/compat.c
+++ new/compat.c
-@@ -50,6 +50,8 @@ void setup_protocol(int f_out,int f_in)
- preserve_gid = ++flist_extra_cnt;
+@@ -58,6 +58,8 @@ void setup_protocol(int f_out,int f_in)
+ preserve_gid = ++file_extra_cnt;
if (preserve_acls && !am_sender)
- preserve_acls = ++flist_extra_cnt;
+ preserve_acls = ++file_extra_cnt;
+ if (preserve_xattrs && !am_sender)
-+ preserve_xattrs = ++flist_extra_cnt;
++ preserve_xattrs = ++file_extra_cnt;
if (remote_protocol == 0) {
if (!read_batch)
--- old/configure.in
+++ new/configure.in
-@@ -878,6 +878,40 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_
+@@ -883,6 +883,40 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_
AC_MSG_RESULT(no)
)
--- old/flist.c
+++ new/flist.c
-@@ -42,6 +42,7 @@ extern int one_file_system;
+@@ -43,6 +43,7 @@ extern int one_file_system;
extern int copy_dirlinks;
extern int keep_dirlinks;
extern int preserve_acls;
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_devices;
-@@ -812,6 +813,10 @@ static struct file_struct *recv_file_ent
+@@ -865,6 +866,10 @@ static struct file_struct *recv_file_ent
if (preserve_acls)
receive_acl(file, f);
#endif
+ receive_xattr(file, f );
+#endif
- return file;
- }
-@@ -1082,7 +1087,7 @@ static struct file_struct *send_file_nam
- unsigned short flags)
+ if (S_ISREG(mode) || S_ISLNK(mode))
+ stats.total_size += file_length;
+@@ -1137,7 +1142,7 @@ static struct file_struct *send_file_nam
+ int flags, int filter_flags)
{
struct file_struct *file;
-#ifdef SUPPORT_ACLS
statx sx;
#endif
-@@ -1102,6 +1107,13 @@ static struct file_struct *send_file_nam
+@@ -1156,6 +1161,13 @@ static struct file_struct *send_file_nam
return NULL;
}
#endif
maybe_emit_filelist_progress(flist->count + flist_count_offset);
-@@ -1113,6 +1125,10 @@ static struct file_struct *send_file_nam
+@@ -1167,6 +1179,10 @@ static struct file_struct *send_file_nam
if (preserve_acls)
send_acl(&sx, f);
#endif
int preserve_perms = 0;
int preserve_executability = 0;
int preserve_devices = 0;
-@@ -200,6 +201,7 @@ static void print_rsync_version(enum log
+@@ -201,6 +202,7 @@ static void print_rsync_version(enum log
char const *have_inplace = "no ";
char const *hardlinks = "no ";
char const *acls = "no ";
char const *links = "no ";
char const *ipv6 = "no ";
STRUCT_STAT *dumstat;
-@@ -219,7 +221,9 @@ static void print_rsync_version(enum log
+@@ -220,7 +222,9 @@ static void print_rsync_version(enum log
#ifdef SUPPORT_ACLS
acls = "";
#endif
#ifdef SUPPORT_LINKS
links = "";
#endif
-@@ -238,8 +242,8 @@ static void print_rsync_version(enum log
+@@ -239,8 +243,8 @@ static void print_rsync_version(enum log
(int)(sizeof (int64) * 8));
rprintf(f, " %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
got_socketpair, hardlinks, links, ipv6, have_inplace);
#ifdef MAINTAINER_MODE
rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
-@@ -285,7 +289,7 @@ void usage(enum logcode F)
+@@ -286,7 +290,7 @@ void usage(enum logcode F)
rprintf(F," -q, --quiet suppress non-error messages\n");
rprintf(F," --no-motd suppress daemon-mode MOTD (see manpage caveat)\n");
rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
rprintf(F," --no-OPTION turn off an implied OPTION (e.g. --no-D)\n");
rprintf(F," -r, --recursive recurse into directories\n");
rprintf(F," -R, --relative use relative path names\n");
-@@ -310,6 +314,9 @@ void usage(enum logcode F)
+@@ -311,6 +315,9 @@ void usage(enum logcode F)
#ifdef SUPPORT_ACLS
rprintf(F," -A, --acls preserve ACLs (implies --perms)\n");
#endif
rprintf(F," -o, --owner preserve owner (super-user only)\n");
rprintf(F," -g, --group preserve group\n");
rprintf(F," --devices preserve device files (super-user only)\n");
-@@ -433,6 +440,9 @@ static struct poptOption long_options[]
+@@ -434,6 +441,9 @@ static struct poptOption long_options[]
{"acls", 'A', POPT_ARG_NONE, 0, 'A', 0, 0 },
{"no-acls", 0, POPT_ARG_VAL, &preserve_acls, 0, 0, 0 },
{"no-A", 0, POPT_ARG_VAL, &preserve_acls, 0, 0, 0 },
{"times", 't', POPT_ARG_VAL, &preserve_times, 1, 0, 0 },
{"no-times", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
{"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 },
-@@ -1115,6 +1125,17 @@ int parse_arguments(int *argc, const cha
+@@ -1122,6 +1132,17 @@ int parse_arguments(int *argc, const cha
return 0;
#endif
default:
/* A large opt value means that set_refuse_options()
-@@ -1562,6 +1583,10 @@ void server_options(char **args,int *arg
+@@ -1590,6 +1611,10 @@ void server_options(char **args,int *arg
if (preserve_acls)
argstr[x++] = 'A';
#endif
+ if (preserve_xattrs)
+ argstr[x++] = 'X';
+#endif
- if (preserve_uid)
- argstr[x++] = 'o';
- if (preserve_gid)
+ if (recurse)
+ argstr[x++] = 'r';
+ if (always_checksum)
--- old/rsync.c
+++ new/rsync.c
@@ -33,6 +33,7 @@
extern int preserve_perms;
extern int preserve_executability;
extern int preserve_times;
-@@ -271,6 +272,10 @@ int set_file_attrs(char *fname, struct f
+@@ -321,6 +322,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);
* will enable owner-writability using chmod, if necessary.
--- old/rsync.h
+++ new/rsync.h
-@@ -511,6 +511,10 @@ struct idev_node {
+@@ -554,6 +554,10 @@ struct idev_node {
#define ACLS_NEED_MASK 1
#endif
#define GID_NONE ((gid_t)-1)
union file_extras {
-@@ -563,6 +567,7 @@ extern int preserve_gid;
- #define F_UID(f) REQ_EXTRA(f, preserve_uid)->unum
- #define F_GID(f) REQ_EXTRA(f, preserve_gid)->unum
+@@ -574,6 +578,7 @@ extern int file_extra_cnt;
+ extern int preserve_uid;
+ extern int preserve_gid;
+ extern int preserve_acls;
++extern int preserve_xattrs;
+
+ #define FILE_STRUCT_LEN (offsetof(struct file_struct, basename))
+ #define EXTRA_LEN (sizeof (union file_extras))
+@@ -607,6 +612,7 @@ extern int preserve_acls;
+ #define F_OWNER(f) REQ_EXTRA(f, preserve_uid)->unum
+ #define F_GROUP(f) REQ_EXTRA(f, preserve_gid)->unum
#define F_ACL(f) REQ_EXTRA(f, preserve_acls)->unum
+#define F_XATTR(f) REQ_EXTRA(f, preserve_xattrs)->unum
/* These items are per-entry optional and mutally exclusive: */
#define F_HL_GNUM(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
-@@ -738,6 +743,9 @@ typedef struct {
+@@ -798,6 +804,9 @@ typedef struct {
struct rsync_acl *acc_acl; /* access ACL */
struct rsync_acl *def_acl; /* default ACL */
#endif
-o, --owner preserve owner (super-user only)
-g, --group preserve group
--devices preserve device files (super-user only)
-@@ -818,6 +819,11 @@ The ACL-sending protocol used by this ve
+@@ -835,6 +836,11 @@ The ACL-sending protocol used by this ve
the patch that was shipped with 2.6.8. Sending ACLs to an older version
of the ACL patch is not supported.
transfer. The resulting value is treated as though it was the permissions
--- old/xattr.c
+++ new/xattr.c
-@@ -0,0 +1,415 @@
+@@ -0,0 +1,413 @@
+/*
+ * Extended Attribute support for rsync.
+ * Written by Jay Fenlason, vaguely based on the ACLs patch.
+extern int am_root;
+extern int read_only;
+extern int list_only;
-+extern int preserve_xattrs;
-+extern unsigned int file_struct_len;
+
+#define RSYNC_XAL_INITIAL 5
+#define RSYNC_XAL_LIST_INITIAL 100