X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/489b0a72c48105c2db422ca7e745625400ceedb3..b06103cc7d4f1827bb8f8a83ca07b56a48930e63:/xattrs.diff diff --git a/xattrs.diff b/xattrs.diff index 4b05252..fe696d0 100644 --- a/xattrs.diff +++ b/xattrs.diff @@ -2,14 +2,12 @@ Depends-On-Patch: acls.diff After applying this patch, run these commands for a successful build: - autoconf - autoheader - ./configure --with-acl-support --with-xattr-support - make proto + ./prepare-source + ./configure --enable-acl-support --enable-xattr-support make ---- orig/Makefile.in 2005-07-07 23:11:55 -+++ Makefile.in 2005-07-07 23:15:20 +--- old/Makefile.in ++++ new/Makefile.in @@ -27,13 +27,13 @@ VERSION=@VERSION@ HEADERS=byteorder.h config.h errcode.h proto.h rsync.h smb_acls.h lib/pool_alloc.h @@ -21,48 +19,65 @@ After applying this patch, run these commands for a successful build: OBJS1=rsync.o generator.o receiver.o cleanup.o sender.o exclude.o util.o \ main.o checksum.o match.o syscall.o log.o backup.o OBJS2=options.o flist.o io.o compat.o hlink.o token.o uidlist.o socket.o \ -- fileio.o batch.o clientname.o acls.o -+ fileio.o batch.o clientname.o acls.o xattr.o +- fileio.o batch.o clientname.o chmod.o acls.o ++ fileio.o batch.o clientname.o chmod.o acls.o xattr.o OBJS3=progress.o pipe.o DAEMON_OBJ = params.o loadparm.o clientserver.o access.o connection.o authenticate.o popt_OBJS=popt/findme.o popt/popt.o popt/poptconfig.o \ ---- orig/backup.c 2004-10-06 00:13:09 -+++ backup.c 2005-03-03 01:20:46 -@@ -136,6 +136,7 @@ static int make_bak_dir(char *fullpath) - do_lchown(fullpath, st.st_uid, st.st_gid); - do_chmod(fullpath, st.st_mode); - (void)DUP_ACL(end, fullpath, st.st_mode); -+ (void)DUP_XATTR(end, fullpath ); +--- old/backup.c ++++ new/backup.c +@@ -29,6 +29,7 @@ extern char *backup_dir; + + extern int am_root; + extern int preserve_acls; ++extern int preserve_xattrs; + extern int preserve_devices; + extern int preserve_specials; + extern int preserve_links; +@@ -137,6 +138,10 @@ static int make_bak_dir(char *fullpath) + if (preserve_acls) + dup_acl(end, fullpath, st.st_mode); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ dup_xattr(end, fullpath ); ++#endif } } *p = '/'; -@@ -189,6 +190,7 @@ static int keep_backup(char *fname) - return 0; - - PUSH_KEEP_BACKUP_ACL(file, fname, buf); -+ PUSH_KEEP_BACKUP_XATTR(file, fname, buf); +@@ -194,6 +199,10 @@ static int keep_backup(char *fname) + if (preserve_acls) + push_keep_backup_acl(file, fname, buf); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ push_keep_backup_xattr(file, fname, buf); ++#endif /* Check to see if this is a device file, or link */ - if (IS_DEVICE(file->mode) && am_root && preserve_devices) { -@@ -265,6 +267,7 @@ static int keep_backup(char *fname) - } - set_perms(buf, file, NULL, 0); - CLEANUP_KEEP_BACKUP_ACL(); -+ CLEANUP_KEEP_BACKUP_XATTR(); + if ((am_root && preserve_devices && IS_DEVICE(file->mode)) +@@ -274,6 +283,10 @@ static int keep_backup(char *fname) + if (preserve_acls) + cleanup_keep_backup_acl(); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ cleanup_keep_backup_xattr(); ++#endif free(file); if (verbose > 1) { ---- orig/configure.in 2004-08-19 19:53:27 -+++ configure.in 2005-05-12 22:57:53 -@@ -822,6 +822,30 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_ +--- old/configure.in ++++ new/configure.in +@@ -814,6 +814,30 @@ samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_ AC_MSG_RESULT(no) ) +AC_CHECK_HEADERS(attr/xattr.h) +AC_MSG_CHECKING(whether to support extended attributes) -+AC_ARG_WITH(xattr-support, -+[ --with-xattr-support Include extended attribute support (default=no)], -+[ case "$withval" in ++AC_ARG_ENABLE(xattr-support, ++AC_HELP_STRING([--enable-xattr-support], [Include extended attribute support (default=no)]), ++[ case "$enableval" in + yes) + case "$host_os" in + *linux*) @@ -85,60 +100,72 @@ After applying this patch, run these commands for a successful build: AC_CONFIG_FILES([Makefile lib/dummy zlib/dummy popt/dummy shconfig]) AC_OUTPUT ---- orig/flist.c 2005-07-29 02:49:06 -+++ flist.c 2005-05-12 22:55:41 -@@ -976,6 +976,8 @@ static struct file_struct *send_file_nam - return NULL; - if (MAKE_ACL(file, fname) < 0) +--- old/flist.c ++++ new/flist.c +@@ -45,6 +45,7 @@ extern int one_file_system; + extern int copy_dirlinks; + extern int keep_dirlinks; + extern int preserve_acls; ++extern int preserve_xattrs; + extern int preserve_links; + extern int preserve_hard_links; + extern int preserve_devices; +@@ -975,6 +976,10 @@ static struct file_struct *send_file_nam + if (preserve_acls && make_acl(file, fname) < 0) return NULL; -+ if (!MAKE_XATTR(file, fname)) + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs && make_xattr(file, fname) < 0) + return NULL; ++#endif maybe_emit_filelist_progress(flist->count + flist_count_offset); -@@ -985,9 +987,11 @@ static struct file_struct *send_file_nam - flist->files[flist->count++] = file; - send_file_entry(file, f, base_flags); - SEND_ACL(file, f); -+ SEND_XATTR(file, f); +@@ -987,12 +992,20 @@ static struct file_struct *send_file_nam + if (preserve_acls) + send_acl(file, f); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ send_xattr(file, f); ++#endif } else { + #ifdef SUPPORT_ACLS /* Cleanup unsent ACL(s). */ - SEND_ACL(file, -1); -+ SEND_XATTR(file, -1); + if (preserve_acls) + send_acl(file, -1); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ send_xattr(file, -1); ++#endif } return file; } -@@ -1334,6 +1338,7 @@ struct file_list *recv_file_list(int f) - file = receive_file_entry(flist, flags, f); - - RECEIVE_ACL(file, f); -+ RECEIVE_XATTR(file, f ); +@@ -1385,6 +1398,10 @@ struct file_list *recv_file_list(int f) + if (preserve_acls) + receive_acl(file, f); + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs) ++ receive_xattr(file, f ); ++#endif - if (S_ISREG(file->mode)) + if (S_ISREG(file->mode) || S_ISLNK(file->mode)) stats.total_size += file->length; -@@ -1358,6 +1363,7 @@ struct file_list *recv_file_list(int f) - clean_flist(flist, relative_paths, 1); - - SORT_FILE_ACL_INDEX_LISTS(); -+ SORT_FILE_XATTR_INDEX_LISTS(); - - if (f >= 0) { - /* Now send the uid/gid list. This was introduced in ---- orig/generator.c 2005-05-12 23:34:00 -+++ generator.c 2005-05-12 23:21:08 -@@ -729,6 +729,10 @@ static void recv_generator(char *fname, - if (f_out == -1) - SET_ACL(fname, file); +@@ -1412,6 +1429,10 @@ struct file_list *recv_file_list(int f) + if (preserve_acls) + sort_file_acl_index_lists(); #endif +#ifdef SUPPORT_XATTRS -+ if (f_out == -1) -+ SET_XATTR(fname, file); ++ if (preserve_xattrs) ++ sort_file_xattr_index_lists(); +#endif - if (delete_during && f_out != -1 && !phase && dry_run < 2 - && (file->flags & FLAG_DEL_HERE)) - delete_in_dir(the_file_list, fname, file); ---- orig/lib/sysxattr.c 2005-05-12 23:23:15 -+++ lib/sysxattr.c 2005-05-12 23:23:15 + + if (f >= 0) { + recv_uid_list(f, flist); +--- old/lib/sysxattr.c ++++ new/lib/sysxattr.c @@ -0,0 +1,41 @@ +/* Extended attribute support for rsync. */ +/* This file Copyright (C) 2004 Red Hat, Inc. */ @@ -161,7 +188,7 @@ After applying this patch, run these commands for a successful build: + +#include "rsync.h" + -+#if defined(HAVE_LINUX_XATTRS) ++#if defined HAVE_LINUX_XATTRS + +ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size) +{ @@ -181,10 +208,10 @@ After applying this patch, run these commands for a successful build: +#else + +#endif /* No xattrs */ ---- orig/lib/sysxattr.h 2005-05-12 23:56:31 -+++ lib/sysxattr.h 2005-05-12 23:56:31 +--- old/lib/sysxattr.h ++++ new/lib/sysxattr.h @@ -0,0 +1,9 @@ -+#if defined(HAVE_LINUX_XATTRS) ++#if defined HAVE_LINUX_XATTRS + +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); @@ -193,17 +220,17 @@ After applying this patch, run these commands for a successful build: +#else + +#endif /* No xattrs */ ---- orig/options.c 2005-08-27 21:15:29 -+++ options.c 2005-08-27 21:29:40 -@@ -44,6 +44,7 @@ int copy_links = 0; +--- old/options.c ++++ new/options.c +@@ -46,6 +46,7 @@ int copy_links = 0; int preserve_links = 0; int preserve_hard_links = 0; int preserve_acls = 0; +int preserve_xattrs = 0; int preserve_perms = 0; + int preserve_executability = 0; int preserve_devices = 0; - int preserve_uid = 0; -@@ -183,6 +184,7 @@ static void print_rsync_version(enum log +@@ -196,6 +197,7 @@ static void print_rsync_version(enum log char const *have_inplace = "no "; char const *hardlinks = "no "; char const *acls = "no "; @@ -211,7 +238,7 @@ After applying this patch, run these commands for a successful build: char const *links = "no "; char const *ipv6 = "no "; STRUCT_STAT *dumstat; -@@ -202,7 +204,9 @@ static void print_rsync_version(enum log +@@ -215,7 +217,9 @@ static void print_rsync_version(enum log #ifdef SUPPORT_ACLS acls = ""; #endif @@ -222,27 +249,29 @@ After applying this patch, run these commands for a successful build: #ifdef SUPPORT_LINKS links = ""; #endif -@@ -217,9 +221,9 @@ static void print_rsync_version(enum log - "Copyright (C) 1996-2005 by Andrew Tridgell and others\n"); +@@ -229,9 +233,9 @@ static void print_rsync_version(enum log + rprintf(f, "Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.\n"); rprintf(f, "\n"); rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, " -- "%shard links, %sACLs, %ssymlinks, batchfiles, \n", -+ "%shard links, %sACLs, %sxattrs, %ssymlinks, batchfiles, \n", +- "%shard links, %sACLs, %ssymlinks, batchfiles,\n", ++ "%shard links, %sACLs, %sxattrs, %ssymlinks, batchfiles,\n", (int) (sizeof (OFF_T) * 8), - got_socketpair, hardlinks, acls, links); + got_socketpair, hardlinks, acls, xattrs, links); /* Note that this field may not have type ino_t. It depends * on the complicated interaction between largefile feature -@@ -291,6 +295,7 @@ void usage(enum logcode F) - rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n"); - rprintf(F," -p, --perms preserve permissions\n"); +@@ -304,6 +308,9 @@ void usage(enum logcode F) + #ifdef SUPPORT_ACLS rprintf(F," -A, --acls preserve ACLs (implies --perms)\n"); + #endif ++#ifdef SUPPORT_XATTRS + rprintf(F," -X, --xattrs preserve extended attributes (implies --perms)\n"); - rprintf(F," -o, --owner preserve owner (root only)\n"); ++#endif + rprintf(F," --chmod=CHMOD change destination permissions\n"); + rprintf(F," -o, --owner preserve owner (super-user only)\n"); rprintf(F," -g, --group preserve group\n"); - rprintf(F," -D, --devices preserve devices (root only)\n"); -@@ -395,6 +400,9 @@ static struct poptOption long_options[] +@@ -422,6 +429,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 }, @@ -252,9 +281,9 @@ After applying this patch, run these commands for a successful build: {"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 }, -@@ -943,6 +951,17 @@ int parse_arguments(int *argc, const cha +@@ -1096,6 +1106,17 @@ int parse_arguments(int *argc, const cha return 0; - #endif /* SUPPORT_ACLS */ + #endif + case 'X': +#ifdef SUPPORT_XATTRS @@ -270,98 +299,80 @@ After applying this patch, run these commands for a successful build: default: /* A large opt value means that set_refuse_options() -@@ -1359,6 +1378,8 @@ void server_options(char **args,int *arg - argstr[x++] = 'H'; +@@ -1544,6 +1565,10 @@ void server_options(char **args,int *arg if (preserve_acls) argstr[x++] = 'A'; + #endif ++#ifdef SUPPORT_XATTRS + if (preserve_xattrs) + argstr[x++] = 'X'; ++#endif if (preserve_uid) argstr[x++] = 'o'; if (preserve_gid) ---- orig/rsync.c 2004-07-03 20:11:58 -+++ rsync.c 2005-03-03 01:31:22 -@@ -146,6 +146,14 @@ int set_perms(char *fname,struct file_st - if (SET_ACL(fname, file) == 0) - updated = 1; - } -+ /* If this is a directory, SET_XATTR() will be called on the cleanup -+ * receive_generator() pass--if we called it here, we might clobber -+ * writability on the directory (SELinux security contexts are stored -+ * in xattrs). everything else is OK to do now. */ -+ if (!S_ISDIR(st->st_mode)) { -+ if (SET_XATTR(fname, file) == 0) +--- old/rsync.c ++++ new/rsync.c +@@ -34,6 +34,7 @@ extern int verbose; + extern int dry_run; + extern int daemon_log_format_has_i; + extern int preserve_acls; ++extern int preserve_xattrs; + extern int preserve_perms; + extern int preserve_executability; + extern int preserve_times; +@@ -215,6 +216,10 @@ int set_file_attrs(char *fname, struct f + if (preserve_acls && set_acl(fname, file, &st->st_mode) == 0) + updated = 1; + #endif ++#ifdef SUPPORT_XATTRS ++ if (preserve_xattrs && set_xattr(fname, file) == 0) + updated = 1; -+ } ++#endif - if (verbose > 1 && flags & PERMS_REPORT) { - enum logcode code = daemon_log_format_has_i || dry_run ---- orig/rsync.h 2005-07-29 02:25:55 -+++ rsync.h 2005-05-12 23:19:46 -@@ -684,6 +684,38 @@ struct stats { - #endif /* SUPPORT_ACLS */ + #ifdef HAVE_CHMOD + if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) { +--- old/rsync.h ++++ new/rsync.h +@@ -672,6 +672,14 @@ struct chmod_mode_struct; + #endif #include "smb_acls.h" +#ifdef HAVE_LINUX_XATTRS +#define SUPPORT_XATTRS 1 +#endif + -+#ifdef SUPPORT_XATTRS -+#ifdef HAVE_ATTR_XATTR_H ++#if defined SUPPORT_XATTRS && defined HAVE_ATTR_XATTR_H +#include +#endif -+#define MAKE_XATTR(file, fname) make_xattr(file, fname) -+#define SEND_XATTR(file, f) send_xattr(file, f) -+#define RECEIVE_XATTR(file, f) receive_xattr(file, f) -+#define SORT_FILE_XATTR_INDEX_LISTS() sort_file_xattr_index_lists() -+#define SET_XATTR(fname, file) set_xattr(fname, file) -+#define NEXT_XATTR_UID() next_xattr_uid() -+#define XATTR_UID_MAP(uid) xattr_uid_map(uid) -+#define PUSH_KEEP_BACKUP_XATTR(file, orig, dest) \ -+ push_keep_backup_xattr(file, orig, dest) -+#define CLEANUP_KEEP_BACKUP_XATTR() cleanup_keep_backup_xattr() -+#define DUP_XATTR(orig, dest) dup_xattr(orig, dest) -+#else /* SUPPORT_XATTRS */ -+#define MAKE_XATTR(file, fname) 1 /* checked return value */ -+#define SEND_XATTR(file, f) -+#define RECEIVE_XATTR(file, f) -+#define SORT_FILE_XATTR_INDEX_LISTS() -+#define SET_XATTR(fname, file) 0 /* checked return value */ -+#define NEXT_XATTR_UID() -+#define XATTR_UID_MAP(uid) -+#define PUSH_KEEP_BACKUP_XATTR(file, orig, dest) -+#define CLEANUP_KEEP_BACKUP_XATTR() -+#define DUP_XATTR(src, orig) 0 /* checked return value */ -+#endif /* SUPPORT_XATTRS */ + #include "proto.h" /* We have replacement versions of these if they're missing. */ ---- orig/rsync.yo 2004-07-03 20:11:58 -+++ rsync.yo 2005-03-03 01:33:53 -@@ -319,6 +319,7 @@ to the detailed description below for a - -K, --keep-dirlinks treat symlinked dir on receiver as dir +--- old/rsync.yo ++++ new/rsync.yo +@@ -322,6 +322,7 @@ to the detailed description below for a -p, --perms preserve permissions - -A, --acls preserve ACLs (implies -p) [local option] -+ -X, --xattrs preserve extended attributes (implies -p) [local option] - -o, --owner preserve owner (root only) + -E, --executability preserve executability + -A, --acls preserve ACLs (implies -p) [non-standard] ++ -X, --xattrs preserve extended attrs (implies -p) [n.s.] + --chmod=CHMOD change destination permissions + -o, --owner preserve owner (super-user only) -g, --group preserve group - -D, --devices preserve devices (root only) -@@ -671,6 +672,11 @@ ACLs to be the same as the local ACLs. - remote machine's rsync supports this option also. This is a non-standard - option. +@@ -802,6 +803,11 @@ dit(bf(-A, --acls)) This option causes r + ACLs to be the same as the source ACLs. This nonstandard option only + works if the remote rsync also supports it. bf(--acls) implies bf(--perms). +dit(bf(-X, --xattrs)) This option causes rsync to update the remote +extended attributes to be the same as the local ones. This will work +only if the remote machine's rsync supports this option also. This is +a non-standard option. + - dit(bf(-o, --owner)) This option causes rsync to set the owner of the - destination file to be the same as the source file. On most systems, - only the super-user can set file ownership. By default, the preservation ---- orig/xattr.c 2005-05-13 06:10:34 -+++ xattr.c 2005-05-13 06:10:34 -@@ -0,0 +1,546 @@ + dit(bf(--chmod)) This option tells rsync to apply one or more + comma-separated "chmod" strings to the permission of the files in the + transfer. The resulting value is treated as though it was the permissions +--- old/xattr.c ++++ new/xattr.c +@@ -0,0 +1,521 @@ +/* Extended Attribute support for rsync */ +/* Copyright (C) 2004 Red Hat, Inc */ +/* Written by Jay Fenlason, vaguely based on the ACLs patch */ @@ -386,7 +397,6 @@ After applying this patch, run these commands for a successful build: + +#ifdef SUPPORT_XATTRS + -+extern int preserve_xattrs; +extern int dry_run; + +#define RSYNC_XAL_INITIAL 5 @@ -472,7 +482,7 @@ After applying this patch, run these commands for a successful build: + return strcmp(xa1->name, xa2->name); +} + -+static BOOL rsync_xal_get(const char *fname, rsync_xal *x) ++static int rsync_xal_get(const char *fname, rsync_xal *x) +{ + ssize_t name_size; + ssize_t datum_size; @@ -497,13 +507,13 @@ After applying this patch, run these commands for a successful build: + } + if (name_size < 0) { + if (errno == ENOTSUP) -+ return False; ++ return -1; + if (errno == ERANGE) { + name_size = sys_llistxattr(fname, NULL, 0); + if (name_size < 0) { + rprintf(FERROR, "%s: rsync_xal_get: llistxattr: %s\n", -+ fname, strerror(errno)); -+ return False; ++ fname, strerror(errno)); ++ return -1; + } + namebuf = realloc_array(namebuf, char, name_size + 1); + if (!namebuf) @@ -514,18 +524,18 @@ After applying this patch, run these commands for a successful build: + rprintf(FERROR, + "%s: rsync_xal_get: re-llistxattr failed: %s\n", + fname, strerror(errno)); -+ return False; ++ return -1; + } + } else { + rprintf(FERROR, + "%s: rsync_xal_get: llistxattr failed: %s\n", + fname, strerror(errno)); -+ return False; ++ return -1; + } + } + rsync_xal_free(x); + if (name_size == 0) -+ return True; ++ return 0; + for (left = name_size, name = namebuf; left > 0 ; left -= len, name += len) { + len = strlen(name) + 1; + @@ -547,14 +557,14 @@ After applying this patch, run these commands for a successful build: + } + if (datum_size < 0) { + if (errno == ENOTSUP) -+ return False; ++ return -1; + if (errno == ERANGE) { + datum_size = sys_lgetxattr(fname, name, NULL, 0); + if (datum_size < 0) { + rprintf(FERROR, + "%s: rsync_xal_get: lgetxattr %s failed: %s\n", + fname, name, strerror(errno)); -+ return False; ++ return -1; + } + datumbuf = realloc_array(datumbuf, char, datum_size + 1); + if (!datumbuf) @@ -565,13 +575,13 @@ After applying this patch, run these commands for a successful build: + rprintf(FERROR, + "%s: rsync_xal_get: re-lgetxattr of %s failed: %s\n", + name, fname, strerror(errno)); -+ return False; ++ return -1; + } + } else { + rprintf(FERROR, + "%s: rsync_xal_get: lgetxattr %s failed: %s\n", + fname, name, strerror(errno)); -+ return False; ++ return -1; + } + } + ptr = new_array(char, len + datum_size); @@ -589,20 +599,17 @@ After applying this patch, run these commands for a successful build: + if (x->count > 1) { + qsort(x->rxas, x->count, sizeof (rsync_xa), rsync_xal_compare_names); + } -+ return True; ++ return 0; +} + + +/* generate the xattr(s) for this flist entry; + * xattr(s) are either sent or cleaned-up by send_xattr() below */ + -+BOOL make_xattr(const struct file_struct *file, const char *fname) ++int make_xattr(UNUSED(const struct file_struct *file), const char *fname) +{ -+ if (!preserve_xattrs || !file) -+ return True; -+ + rsync_xal_get(fname, &curr_rsync_xal); -+ return True; ++ return 0; /* TODO: This needs to return 1 if no xattrs changed! */ +} + +static ssize_t rsync_xal_find_matching(void) @@ -654,13 +661,10 @@ After applying this patch, run these commands for a successful build: +/* send the make_xattr()-generated xattr list for this flist entry, + * or clean up after an flist entry that's not being sent (f == -1) */ + -+void send_xattr(const struct file_struct *file, int f) ++void send_xattr(UNUSED(const struct file_struct *file), int f) +{ + ssize_t index; + -+ if (!preserve_xattrs || !file) -+ return; -+ + if (f == -1) { + rsync_xal_free(&curr_rsync_xal); + return; @@ -696,9 +700,7 @@ After applying this patch, run these commands for a successful build: + char *fname; + int tag; + -+ if (!preserve_xattrs) -+ return; -+ fname = f_name(file); ++ fname = f_name(file, NULL); + tag = read_byte(f); + if (tag != 'X' && tag != 'x') { + rprintf(FERROR, @@ -765,7 +767,7 @@ After applying this patch, run these commands for a successful build: + index = read_int(f); + if (index >= rsync_xal_l.count) { + rprintf(FERROR, "%s: receive_xattr: xa index %lu out of range\n", -+fname, (unsigned long)index); ++ fname, (unsigned long)index); + exit_cleanup(RERR_STREAMIO); + } + fxil.filexalidxs[fxil.count].xalidx = index; @@ -773,19 +775,17 @@ After applying this patch, run these commands for a successful build: + fxil.count++; +} + -+static BOOL rsync_xal_set(const char *fname, rsync_xal *x) ++static int rsync_xal_set(const char *fname, rsync_xal *x) +{ + size_t i; -+ int status; -+ BOOL ret; ++ int ret = 0; + -+ ret = True; + for (i = 0; i < x->count; i++) { -+ status = sys_lsetxattr(fname, x->rxas[i].name, x->rxas[i].datum, x->rxas[i].datum_len, 0); ++ int status = sys_lsetxattr(fname, x->rxas[i].name, x->rxas[i].datum, x->rxas[i].datum_len, 0); + if (status < 0) { + rprintf(FERROR, "%s: rsync_xal_set: lsetxattr %s failed: %s\n", + fname, x->rxas[i].name, strerror(errno)); -+ ret = False; ++ ret = -1; + } + } + return ret; @@ -797,22 +797,17 @@ After applying this patch, run these commands for a successful build: +{ + int ret; + -+ ret = 0; -+ if (!preserve_xattrs) -+ return ret; -+ -+ ret = rsync_xal_get(orig, &backup_xal); -+ if (ret == True) ++ if (rsync_xal_get(orig, &backup_xal) < 0) + ret = rsync_xal_set(bak, &backup_xal); ++ else ++ ret = 0; + rsync_xal_free(&backup_xal); ++ + return ret; +} + +void push_keep_backup_xattr(const struct file_struct *file, const char *orig, const char *dest) +{ -+ if (!preserve_xattrs) -+ return; -+ + backup_orig_file = file; + backup_orig_fname = orig; + backup_dest_fname = dest; @@ -821,16 +816,11 @@ After applying this patch, run these commands for a successful build: + +static int set_keep_backup_xal(void) +{ -+ if (!preserve_xattrs) -+ return 0; + return rsync_xal_set(backup_dest_fname, &backup_xal); +} + +void cleanup_keep_backup_xattr(void) +{ -+ if (!preserve_xattrs) -+ return; -+ + backup_orig_file = NULL; + backup_orig_fname = null_string; + backup_dest_fname = null_string; @@ -849,8 +839,6 @@ After applying this patch, run these commands for a successful build: + +void sort_file_xattr_index_lists(void) +{ -+ if (!preserve_xattrs) -+ return; + qsort(fxil.filexalidxs, fxil.count, sizeof (file_xal_index), file_xal_index_compare); +} + @@ -885,26 +873,24 @@ After applying this patch, run these commands for a successful build: + return -1; +} + -+ +/* set extended attributes on rsync-ed or keep_backup-ed file */ + +int set_xattr(const char *fname, const struct file_struct *file) +{ -+ int updated; + int xalidx; + rsync_xal *x; + -+ updated = 0; -+ if (dry_run || !preserve_xattrs) -+ return 0; ++ if (dry_run) ++ return 1; /* FIXME: --dry-run needs to compute this value */ ++ + if (file == backup_orig_file) { + if (!strcmp(fname, backup_dest_fname)) + return set_keep_backup_xal(); + } + xalidx = find_file_xal_index(file); + x = &(rsync_xal_l.rxals[xalidx]); -+ updated = rsync_xal_set(fname, x); -+ return updated; ++ ++ return rsync_xal_set(fname, x); +} + +#endif /* SUPPORT_XATTRS */