]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cp -a: diagnose failure when preserving xattr/context required
authorOndřej Vašík <ovasik@redhat.com>
Fri, 24 Apr 2009 12:29:45 +0000 (14:29 +0200)
committerJim Meyering <meyering@redhat.com>
Mon, 27 Apr 2009 11:33:42 +0000 (13:33 +0200)
* src/copy.c (copy_attr_by_fs): Always print diagnostics when preserving
xattrs is required.
(copy_attr_by_name): Likewise.
(copy_reg): Always print diagnostics when preserving SELinux
context is required.
(copy_internal): Likewise.  Also, do not ignore ENOTSUP and ENODATA
errors when preserving SELinux context is required.
* NEWS (Bug fixes): Mention it.

NEWS
src/copy.c

diff --git a/NEWS b/NEWS
index c537432e3d9a955c4ecc1d47211b0d24c9aeed35..1b426847559414c2da79d57f60d21dc08ed6490d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,11 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Bug fixes
 
+  cp now diagnoses failure to preserve selinux/xattr attributes when
+  --preserve=context,xattr is specified in combination with -a.
+  Also, cp no longer suppresses attribute-preservation diagnostics
+  when preserving SELinux context was explicitly requested.
+
   sort -m no longer segfaults when its output file is also an input file.
   E.g., with this, touch 1; sort -m -o 1 1, sort would segfault.
   [introduced in coreutils-7.2]
index d01f9b3650cfe6b2de4c8f26fb6df53ea1033ad8..1687b72c2fa0ec970252f9411b44ef320d0d8360 100644 (file)
@@ -184,7 +184,8 @@ copy_attr_by_fd (char const *src_path, int src_fd,
     .quote_free = copy_attr_free
   };
   return 0 == attr_copy_fd (src_path, src_fd, dst_path, dst_fd, 0,
-                            x->reduce_diagnostics ? NULL : &ctx);
+                            (x->reduce_diagnostics
+                             && !x->require_preserve_xattr)? NULL : &ctx);
 }
 
 static bool
@@ -198,7 +199,8 @@ copy_attr_by_name (char const *src_path, char const *dst_path,
     .quote_free = copy_attr_free
   };
   return 0 == attr_copy_file (src_path, dst_path, 0,
-                              x-> reduce_diagnostics ? NULL :&ctx);
+                              (x-> reduce_diagnostics
+                               && !x->require_preserve_xattr) ? NULL : &ctx);
 }
 #else /* USE_XATTR */
 
@@ -481,7 +483,7 @@ copy_reg (char const *src_name, char const *dst_name,
          security_context_t con = NULL;
          if (getfscreatecon (&con) < 0)
            {
-             if (!x->reduce_diagnostics)
+             if (!x->reduce_diagnostics || x->require_preserve_context)
                error (0, errno, _("failed to get file system create context"));
              if (x->require_preserve_context)
                {
@@ -494,7 +496,7 @@ copy_reg (char const *src_name, char const *dst_name,
            {
              if (fsetfilecon (dest_desc, con) < 0)
                {
-                 if (!x->reduce_diagnostics)
+                 if (!x->reduce_diagnostics || x->require_preserve_context)
                    error (0, errno,
                           _("failed to set the security context of %s to %s"),
                           quote_n (0, dst_name), quote_n (1, con));
@@ -1748,7 +1750,7 @@ copy_internal (char const *src_name, char const *dst_name,
        {
          if (setfscreatecon (con) < 0)
            {
-             if (!x->reduce_diagnostics)
+             if (!x->reduce_diagnostics || x->require_preserve_context)
                error (0, errno,
                       _("failed to set default file creation context to %s"),
                       quote (con));
@@ -1762,9 +1764,9 @@ copy_internal (char const *src_name, char const *dst_name,
        }
       else
        {
-         if (errno != ENOTSUP && errno != ENODATA)
+         if ((errno != ENOTSUP && errno != ENODATA) || x->require_preserve_context)
            {
-             if (!x->reduce_diagnostics)
+             if (!x->reduce_diagnostics || x->require_preserve_context)
                error (0, errno,
                       _("failed to get security context of %s"),
                       quote (src_name));