Ondrej Vasik 92dfad
From 2c0ac0d7fc6bce3abdbad8529e44318f1370a948 Mon Sep 17 00:00:00 2001
Ondrej Vasik 92dfad
From: =?utf-8?q?Ond=C5=99ej=20Va=C5=A1=C3=ADk?= <ovasik@redhat.com>
Ondrej Vasik 92dfad
Date: Wed, 11 Mar 2009 16:08:20 +0100
Ondrej Vasik 92dfad
Subject: [PATCH] cp: make -a option preserve xattrs with reduced diagnostics
Ondrej Vasik 92dfad
Ondrej Vasik 92dfad
* copy.c (copy_attr_by_fd): Reduce xattr diagnostics for 'cp -a'.
Ondrej Vasik 92dfad
  (copy_attr_by_name): Likewise.
Ondrej Vasik 92dfad
* cp.c (main):  preserve xattrs with -a option, when possible
Ondrej Vasik 92dfad
* doc/coreutils.texi: document that xattrs are preserved with
Ondrej Vasik 92dfad
  cp -a, with no added diagnostics
Ondrej Vasik 92dfad
* tests/misc/xattr: Add tests for 'cp --preserve=all' and 'cp -a'.
Ondrej Vasik 92dfad
---
Ondrej Vasik 92dfad
 doc/coreutils.texi |    7 +++----
Ondrej Vasik 92dfad
 src/copy.c         |   22 +++++++++++++---------
Ondrej Vasik 92dfad
 src/cp.c           |    1 +
Ondrej Vasik 92dfad
 tests/misc/xattr   |   15 +++++++++++++--
Ondrej Vasik 92dfad
 4 files changed, 30 insertions(+), 15 deletions(-)
Ondrej Vasik 92dfad
Ondrej Vasik 92dfad
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
Ondrej Vasik 92dfad
index 2c1fae5..0bf978a 100644
Ondrej Vasik 92dfad
--- a/doc/coreutils.texi
Ondrej Vasik 92dfad
+++ b/doc/coreutils.texi
Ondrej Vasik 92dfad
@@ -7262,10 +7262,9 @@ Preserve as much as possible of the structure and attributes of the
Ondrej Vasik 92dfad
 original files in the copy (but do not attempt to preserve internal
Ondrej Vasik 92dfad
 directory structure; i.e., @samp{ls -U} may list the entries in a copied
Ondrej Vasik 92dfad
 directory in a different order).
Ondrej Vasik 92dfad
-Try to preserve SELinux security context, but ignore any failure to do that
Ondrej Vasik 92dfad
-and print no corresponding diagnostic.
Ondrej Vasik 92dfad
-This option does not preserve extended attributes(xattr) at the moment.
Ondrej Vasik 92dfad
-Equivalent to @option{-dR --preserve=all} with a few exceptions.
Ondrej Vasik 92dfad
+Try to preserve SELinux security context and extended attributes (xattr),
Ondrej Vasik 92dfad
+but ignore any failure to do that and print no corresponding diagnostic.
Ondrej Vasik 92dfad
+Equivalent to @option{-dR --preserve=all} with the reduced diagnostics.
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 @item -b
Ondrej Vasik 92dfad
 @itemx @w{@kbd{--backup}[=@var{method}]}
Ondrej Vasik 92dfad
diff --git a/src/copy.c b/src/copy.c
Ondrej Vasik 92dfad
index e37fead..7b4dc08 100644
Ondrej Vasik 92dfad
--- a/src/copy.c
Ondrej Vasik 92dfad
+++ b/src/copy.c
Ondrej Vasik 92dfad
@@ -153,13 +153,13 @@ copy_attr_quote (struct error_context *ctx ATTRIBUTE_UNUSED, char const *str)
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 static void
Ondrej Vasik 92dfad
 copy_attr_free (struct error_context *ctx ATTRIBUTE_UNUSED,
Ondrej Vasik 92dfad
-		char const *str ATTRIBUTE_UNUSED)
Ondrej Vasik 92dfad
+                char const *str ATTRIBUTE_UNUSED)
Ondrej Vasik 92dfad
 {
Ondrej Vasik 92dfad
 }
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 static bool
Ondrej Vasik 92dfad
 copy_attr_by_fd (char const *src_path, int src_fd,
Ondrej Vasik 92dfad
-		 char const *dst_path, int dst_fd)
Ondrej Vasik 92dfad
+                 char const *dst_path, int dst_fd, const struct cp_options *x)
Ondrej Vasik 92dfad
 {
Ondrej Vasik 92dfad
   struct error_context ctx =
Ondrej Vasik 92dfad
   {
Ondrej Vasik 92dfad
@@ -167,11 +167,13 @@ copy_attr_by_fd (char const *src_path, int src_fd,
Ondrej Vasik 92dfad
     .quote = copy_attr_quote,
Ondrej Vasik 92dfad
     .quote_free = copy_attr_free
Ondrej Vasik 92dfad
   };
Ondrej Vasik 92dfad
-  return 0 == attr_copy_fd (src_path, src_fd, dst_path, dst_fd, 0, &ctx;;
Ondrej Vasik 92dfad
+  return 0 == attr_copy_fd (src_path, src_fd, dst_path, dst_fd, 0,
Ondrej Vasik 92dfad
+                            x->reduce_diagnostics ? NULL : &ctx;;
Ondrej Vasik 92dfad
 }
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 static bool
Ondrej Vasik 92dfad
-copy_attr_by_name (char const *src_path, char const *dst_path)
Ondrej Vasik 92dfad
+copy_attr_by_name (char const *src_path, char const *dst_path,
Ondrej Vasik 92dfad
+                   const struct cp_options *x)
Ondrej Vasik 92dfad
 {
Ondrej Vasik 92dfad
   struct error_context ctx =
Ondrej Vasik 92dfad
   {
Ondrej Vasik 92dfad
@@ -179,19 +181,21 @@ copy_attr_by_name (char const *src_path, char const *dst_path)
Ondrej Vasik 92dfad
     .quote = copy_attr_quote,
Ondrej Vasik 92dfad
     .quote_free = copy_attr_free
Ondrej Vasik 92dfad
   };
Ondrej Vasik 92dfad
-  return 0 == attr_copy_file (src_path, dst_path, 0, &ctx;;
Ondrej Vasik 92dfad
+  return 0 == attr_copy_file (src_path, dst_path, 0,
Ondrej Vasik 92dfad
+                              x-> reduce_diagnostics ? NULL :&ctx;;
Ondrej Vasik 92dfad
 }
Ondrej Vasik 92dfad
 #else /* USE_XATTR */
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 static bool
Ondrej Vasik 92dfad
 copy_attr_by_fd (char const *src_path, int src_fd,
Ondrej Vasik 92dfad
-		 char const *dst_path, int dst_fd)
Ondrej Vasik 92dfad
+                 char const *dst_path, int dst_fd, const struct cp_options *x)
Ondrej Vasik 92dfad
 {
Ondrej Vasik 92dfad
   return true;
Ondrej Vasik 92dfad
 }
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 static bool
Ondrej Vasik 92dfad
-copy_attr_by_name (char const *src_path, char const *dst_path)
Ondrej Vasik 92dfad
+copy_attr_by_name (char const *src_path, char const *dst_path,
Ondrej Vasik 92dfad
+                   const struct cp_options *x)
Ondrej Vasik 92dfad
 {
Ondrej Vasik 92dfad
   return true;
Ondrej Vasik 92dfad
 }
Ondrej Vasik 92dfad
@@ -759,7 +763,7 @@ copy_reg (char const *src_name, char const *dst_name,
Ondrej Vasik 92dfad
   set_author (dst_name, dest_desc, src_sb);
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
   if (x->preserve_xattr && ! copy_attr_by_fd (src_name, source_desc,
Ondrej Vasik 92dfad
-					      dst_name, dest_desc)
Ondrej Vasik 92dfad
+					      dst_name, dest_desc, x)
Ondrej Vasik 92dfad
       && x->require_preserve_xattr)
Ondrej Vasik 92dfad
     return false;
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
@@ -2076,7 +2080,7 @@ copy_internal (char const *src_name, char const *dst_name,
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
   set_author (dst_name, -1, &src_sb);
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
-  if (x->preserve_xattr && ! copy_attr_by_name (src_name, dst_name)
Ondrej Vasik 92dfad
+  if (x->preserve_xattr && ! copy_attr_by_name (src_name, dst_name, x)
Ondrej Vasik 92dfad
       && x->require_preserve_xattr)
Ondrej Vasik 92dfad
     return false;
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
diff --git a/src/cp.c b/src/cp.c
Ondrej Vasik 92dfad
index af4bd60..8785076 100644
Ondrej Vasik 92dfad
--- a/src/cp.c
Ondrej Vasik 92dfad
+++ b/src/cp.c
Ondrej Vasik 92dfad
@@ -925,6 +925,7 @@ main (int argc, char **argv)
Ondrej Vasik 92dfad
 	  x.require_preserve = true;
Ondrej Vasik 92dfad
 	  if (selinux_enabled)
Ondrej Vasik 92dfad
 	     x.preserve_security_context = true;
Ondrej Vasik 92dfad
+	  x.preserve_xattr = true;
Ondrej Vasik 92dfad
 	  x.reduce_diagnostics = true;
Ondrej Vasik 92dfad
 	  x.recursive = true;
Ondrej Vasik 92dfad
 	  break;
Ondrej Vasik 92dfad
diff --git a/tests/misc/xattr b/tests/misc/xattr
Ondrej Vasik 92dfad
index 4137c53..f067ff5 100755
Ondrej Vasik 92dfad
--- a/tests/misc/xattr
Ondrej Vasik 92dfad
+++ b/tests/misc/xattr
Ondrej Vasik 92dfad
@@ -1,6 +1,7 @@
Ondrej Vasik 92dfad
 #!/bin/sh
Ondrej Vasik 92dfad
-# Ensure that cp --preserve=xattr and mv preserve extended attributes and
Ondrej Vasik 92dfad
-# install does not preserve extended attributes.
Ondrej Vasik 92dfad
+# Ensure that cp --preserve=xattr, cp --preserve=all and mv preserve extended
Ondrej Vasik 92dfad
+# attributes and install does not preserve extended attributes.
Ondrej Vasik 92dfad
+# cp -a should preserve xattr, error diagnostics should not be displayed
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 # Copyright (C) 2009 Free Software Foundation, Inc.
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
@@ -66,6 +67,16 @@ cp --preserve=xattr a b || fail=1
Ondrej Vasik 92dfad
 getfattr -d b >out_b || skip_test_ "failed to get xattr of file"
Ondrej Vasik 92dfad
 grep -F "$xattr_pair" out_b >/dev/null || fail=1
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
+#test if --preserve=all option works
Ondrej Vasik 92dfad
+cp --preserve=all a c || fail=1
Ondrej Vasik 92dfad
+getfattr -d c >out_c || skip_test_ "failed to get xattr of file"
Ondrej Vasik 92dfad
+grep -F "$xattr_pair" out_c >/dev/null || fail=1
Ondrej Vasik 92dfad
+
Ondrej Vasik 92dfad
+#test if -a option works without any diagnostics
Ondrej Vasik 92dfad
+cp -a a d 2>err && test -s err && fail=1
Ondrej Vasik 92dfad
+getfattr -d d >out_d || skip_test_ "failed to get xattr of file"
Ondrej Vasik 92dfad
+grep -F "$xattr_pair" out_d >/dev/null || fail=1
Ondrej Vasik 92dfad
+
Ondrej Vasik 92dfad
 rm b || framework_failure
Ondrej Vasik 92dfad
 
Ondrej Vasik 92dfad
 # install should never preserve xattr
Ondrej Vasik 92dfad
-- 
Ondrej Vasik 92dfad
1.5.6.1.156.ge903b