From 5023cacf5c62c95b1f9c41ef7c7684209a5abc82 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Ond=C5=99ej=20Va=C5=A1=C3=ADk?= Date: Fri, 24 Apr 2009 14:29:45 +0200 Subject: [PATCH] cp: diagnose failure when preserving xattr/context required even with -a option * src/copy.c (copy_attr_by_fs): Always show diagnostics when preserving xattrs is required (copy_attr_by_name): Likewise (copy_reg): Always show diagnostics when preserving SELinux context is required (copy_internal): Likewise + Do not ignore ENOTSUP and ENODATA errors when preserving SELinux context is required * NEWS (Bug fixes): mention it --- NEWS | 5 +++++ src/copy.c | 16 +++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 063d07f..b3fb475 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,11 @@ GNU coreutils NEWS -*- outline -*- The bug strikes only with both --recursive (-r, -R) and --link (-l). [bug introduced in coreutils-7.1] + cp now correctly diagnoses selinux/xattr failures when option + --preserve=context,xattr is specified with combination with option -a. + Additionally do not ignore unsupported operation error when preserving + SELinux context was explicitly requested. + ls --sort=version (-v) sorted names beginning with "." inconsistently. Now, names that start with "." are always listed before those that don't. diff --git a/src/copy.c b/src/copy.c index d9db23c..d3f3739 100644 --- a/src/copy.c +++ b/src/copy.c @@ -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)); @@ -1747,7 +1749,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)); @@ -1761,9 +1763,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)); -- 1.5.6.1.156.ge903b