On Sunday 20 April 2008, Mike Frysinger wrote: > On Sunday 20 April 2008, Jim Meyering wrote: > > Mike Frysinger <[EMAIL PROTECTED]> wrote: > > > has work on merging Andreas' patch just stalled ? that and the big > > > nasty i18n patch are about the only thing i carry in Gentoo anymore as > > > everything else has been merged ... > > > > I haven't looked at any xattr-related changes for a long time. > > Do you know if there are other variants of that patch (probably), > > and if so, how they differ? > > so we know we're talking about the same thing, i think you're referring to > the patch as you cited in an old e-mail and found here: > http://www.suse.de/~agruen/coreutils/5.91/ > > the patch has been updated in opensuse since (i'm attaching the latest one > i can find from their coreutils-6.9-43 version). the only thing i have in > Gentoo beyond this patch is to add AC_ARG_ENABLE(xattr) support.
hmm, you probably want one that applies nicely ;) here is the Gentoo version which applies to 6.11 -mike
signature.asc
Description: This is a digitally signed message part.
--- coreutils-6.11/configure.ac +++ coreutils-6.11/configure.ac @@ -249,6 +249,9 @@ AC_SUBST([CONFIG_STATUS_DEPENDENCIES]) ############################################################################ +# Extended attribute copying. +AC_FUNC_XATTR + AM_GNU_GETTEXT([external], [need-formatstring-macros]) AM_GNU_GETTEXT_VERSION([0.15]) --- coreutils-6.11/m4/xattr.m4 +++ coreutils-6.11/m4/xattr.m4 @@ -0,0 +1,44 @@ +# xattr.m4 - check for Extended Attributes (Linux) + +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Written by Andreas Gruenbacher. + +AC_DEFUN([AC_FUNC_XATTR], +[ + AC_ARG_ENABLE(xattr, + [ --disable-xattr turn off support for extended attributes], + use_xattr=$enableval, use_xattr=yes) + + if test "$use_xattr" = "yes"; then + AC_CHECK_HEADERS(attr/error_context.h attr/libattr.h) + if test "$ac_cv_header_attr_libattr_h" = yes \ + && test "$ac_cv_header_attr_error_context_h" = yes; then + use_xattr=1 + else + use_xattr=0 + fi + AC_DEFINE_UNQUOTED(USE_XATTR, $use_xattr, + [Define if you want extended attribute support.]) + xattr_saved_LIBS=$LIBS + AC_SEARCH_LIBS(attr_copy_file, attr, + [test "$ac_cv_search_attr_copy_file" = "none required" || LIB_XATTR=$ac_cv_search_attr_copy_file]) + AC_SUBST(LIB_XATTR) + AC_CHECK_FUNCS(attr_copy_file) + LIBS=$xattr_saved_LIBS + fi +]) --- coreutils-6.11/src/copy.c +++ coreutils-6.11/src/copy.c @@ -53,6 +53,12 @@ #include "areadlink.h" #include "yesno.h" +#if USE_XATTR +# include <stdarg.h> +# include <attr/error_context.h> +# include <attr/libattr.h> +#endif + #ifndef HAVE_FCHOWN # define HAVE_FCHOWN false # define fchown(fd, uid, gid) (-1) @@ -118,6 +124,98 @@ is_ancestor (const struct stat *sb, cons return false; } +#if USE_XATTR +static void +copy_xattr_error (struct error_context *ctx, const char *fmt, ...) +{ + int err = errno; + va_list ap; + int len; + char *buffer; + + /* There is no error function that takes a va_list argument, + so we print the message in a buffer first. */ + + va_start (ap, fmt); + len = vsnprintf (NULL, 0, fmt, ap); + va_end (ap); + if (len > 0) + { + buffer = xmalloc (len + 1); + va_start (ap, fmt); + vsnprintf (buffer, len + 1, fmt, ap); + va_end (ap); + error (0, err, "%s", buffer); + free (buffer); + } +} + +static const char * +copy_xattr_quote (struct error_context *ctx, const char *str) +{ + return xstrdup (quote (str)); +} + +static void +copy_xattr_free (struct error_context *ctx, const char *str) +{ + free ((void *) str); +} + +struct copy_xattr_context { + struct error_context ctx; + struct cp_options *x; +}; + +static int +copy_xattr_filter (const char *name, struct error_context *ctx) +{ + struct copy_xattr_context *copy_ctx = (struct copy_xattr_context *) ctx; + int action; + + /* We handle POSIX ACLs separately. */ + if (!strcmp(name, "system.posix_acl_access") + || !strcmp(name, "system.posix_acl_default")) + return 0; + + action = attr_copy_action(name, ctx); + return (action != ATTR_ACTION_SKIP && + (!copy_ctx->x->preserve_mode + || action != ATTR_ACTION_PERMISSIONS)); +} +#endif /* USE_XATTR */ + +static bool +copy_xattrs (const char *src_path, int source_desc, const char *dst_path, + int dest_desc, const struct cp_options *x) +{ + struct copy_xattr_context copy_xattr_ctx = { + { copy_xattr_error, + copy_xattr_quote, + copy_xattr_free }, + x + }; + +#if USE_XATTR + if (x->preserve_xattrs) + { + int ret; + + if (source_desc != -1 && dest_desc != -1) + ret = attr_copy_fd(src_path, source_desc, dst_path, dest_desc, + copy_xattr_filter, ©_xattr_ctx.ctx); + else + ret = attr_copy_file (src_path, dst_path, + copy_xattr_filter, ©_xattr_ctx.ctx); + return ret == 0 || !x->require_preserve; + } + else + return true; +#else /* USE_XATTR */ + return true; +#endif /* USE_XATTR */ +} + /* Read the contents of the directory SRC_NAME_IN, and recursively copy the contents to DST_NAME_IN. NEW_DST is true if DST_NAME_IN is a directory that was created previously in the @@ -509,6 +607,9 @@ copy_reg (char const *src_name, char con } } + if (!copy_xattrs (src_name, source_desc, dst_name, dest_desc, x)) + return_val = false; + set_author (dst_name, dest_desc, src_sb); if (x->preserve_mode || x->move_mode) @@ -1755,6 +1856,9 @@ copy_internal (char const *src_name, cha } } + if (!copy_xattrs (src_name, -1, dst_name, -1, x)) + delayed_ok = false; + set_author (dst_name, -1, &src_sb); if (x->preserve_mode || x->move_mode) --- coreutils-6.11/src/copy.h +++ coreutils-6.11/src/copy.h @@ -128,6 +128,9 @@ struct cp_options bool preserve_mode; bool preserve_timestamps; + /* If true, attempt to copy extended attributes. */ + bool preserve_xattrs; + /* Enabled for mv, and for cp by the --preserve=links option. If true, attempt to preserve in the destination files any logical hard links between the source files. If used with cp's --- coreutils-6.11/src/cp.c +++ coreutils-6.11/src/cp.c @@ -191,7 +191,7 @@ Mandatory arguments to long options are -p same as --preserve=mode,ownership,timestamps\n\ --preserve[=ATTR_LIST] preserve the specified attributes (default:\n\ mode,ownership,timestamps), if possible\n\ - additional attributes: context, links, all\n\ + additional attributes: context, links, xattrs, all\n\ "), stdout); fputs (_("\ --no-preserve=ATTR_LIST don't preserve the specified attributes\n\ @@ -724,6 +724,7 @@ cp_option_init (struct cp_options *x) x->preserve_timestamps = false; x->preserve_security_context = false; x->require_preserve_context = false; + x->preserve_xattrs = false; x->require_preserve = false; x->recursive = false; @@ -752,18 +753,21 @@ decode_preserve_arg (char const *arg, st PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_CONTEXT, + PRESERVE_XATTRS, PRESERVE_ALL }; static enum File_attribute const preserve_vals[] = { PRESERVE_MODE, PRESERVE_TIMESTAMPS, - PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_CONTEXT, PRESERVE_ALL + PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_CONTEXT, + PRESERVE_XATTRS, PRESERVE_ALL }; /* Valid arguments to the `--preserve' option. */ static char const* const preserve_args[] = { "mode", "timestamps", - "ownership", "links", "context", "all", NULL + "ownership", "links", "context", + "xattrs", "all", NULL }; ARGMATCH_VERIFY (preserve_args, preserve_vals); @@ -799,13 +803,18 @@ decode_preserve_arg (char const *arg, st x->require_preserve_context = on_off; break; + case PRESERVE_XATTRS: + x->preserve_xattrs = on_off; + break; + case PRESERVE_ALL: x->preserve_mode = on_off; x->preserve_timestamps = on_off; x->preserve_ownership = on_off; x->preserve_links = on_off; if (selinux_enabled) x->preserve_security_context = on_off; + x->preserve_xattrs = on_off; break; default: --- coreutils-6.11/src/install.c +++ coreutils-6.11/src/install.c @@ -154,6 +154,7 @@ cp_option_init (struct cp_options *x) x->preserve_links = false; x->preserve_mode = false; x->preserve_timestamps = false; + x->preserve_xattrs = false; x->require_preserve = false; x->require_preserve_context = false; x->recursive = false; --- coreutils-6.11/src/mv.c +++ coreutils-6.11/src/mv.c @@ -125,6 +125,7 @@ cp_option_init (struct cp_options *x) x->preserve_mode = true; x->preserve_timestamps = true; x->preserve_security_context = selinux_enabled; + x->preserve_xattrs = true; x->require_preserve = false; /* FIXME: maybe make this an option */ x->require_preserve_context = false; x->recursive = true; --- coreutils-6.11/doc/coreutils.texi +++ coreutils-6.11/doc/coreutils.texi @@ -6948,6 +6948,8 @@ Preserve in the destination files any links between corresponding source files. @c Give examples illustrating how hard links are preserved. @c Also, show how soft links map to hard links with -L and -H. [EMAIL PROTECTED] xattrs +Preserve extended attributes. (See /etc/xattr.conf.) @itemx all Preserve all file attributes. Equivalent to specifying all of the above. --- coreutils-6.11/src/Makefile.am +++ coreutils-6.11/src/Makefile.am @@ -107,9 +107,9 @@ dir_LDADD += $(LIB_ACL) ls_LDADD += $(LIB_ACL) vdir_LDADD += $(LIB_ACL) -cp_LDADD += $(LIB_ACL) -mv_LDADD += $(LIB_ACL) -ginstall_LDADD += $(LIB_ACL) +cp_LDADD += $(LIB_ACL) $(LIB_XATTR) +mv_LDADD += $(LIB_ACL) $(LIB_XATTR) +ginstall_LDADD += $(LIB_ACL) $(LIB_XATTR) stat_LDADD = $(LDADD) $(LIB_SELINUX)
_______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils