> I would rather say that both --xattrs-include and --xattrs-exclude should
> imply --xattrs.

Attached.
>From ec4527a90e9ab7cbf8177022f493670090912a23 Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <[email protected]>
Date: Thu, 23 May 2013 11:36:23 +0200
Subject: [PATCH] tar: imply --xattrs when --xattrs-{inc,exc}lude used

Options --xattrs-include=MASK and --xattrs-exclude=MASK now turn
on the --xattrs option.

Fix also bug in printing in xattrs.c - don't print when option is
negative.

* src/tar.c (set_xattr_option): New static function.
(parse_opt): Call new function when --xatrrs, --xattrs-include or
--xattrs-exclude option is used.
* src/xattrs.c (xattrs_print, xattrs_print_char): Expect positive
values in options.
---
 src/tar.c    | 14 +++++++++++---
 src/xattrs.c |  8 ++++----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/tar.c b/src/tar.c
index c29b4fa..e5ab800 100644
--- a/src/tar.c
+++ b/src/tar.c
@@ -166,6 +166,14 @@ set_archive_format (char const *name)
   archive_format = p->fmt;
 }
 
+static void
+set_xattr_option (int value)
+{
+  if (value == 1)
+    set_archive_format ("posix");
+  xattrs_option = value;
+}
+
 const char *
 archive_format_string (enum archive_format fmt)
 {
@@ -2204,16 +2212,16 @@ parse_opt (int key, char *arg, struct argp_state *state)
       break;
 
     case XATTR_OPTION:
-      set_archive_format ("posix");
-      xattrs_option = 1;
+      set_xattr_option (1);
       break;
 
     case NO_XATTR_OPTION:
-      xattrs_option = -1;
+      set_xattr_option (-1);
       break;
 
     case XATTR_INCLUDE:
     case XATTR_EXCLUDE:
+      set_xattr_option (1);
       xattrs_mask_add (arg, (key == XATTR_INCLUDE));
       break;
 
diff --git a/src/xattrs.c b/src/xattrs.c
index dac15f3..3137e9a 100644
--- a/src/xattrs.c
+++ b/src/xattrs.c
@@ -695,7 +695,7 @@ xattrs_print_char (struct tar_stat_info const *st, char *output)
   if (selinux_context_option > 0 && st->cntx_name)
     *output = '.';
 
-  if (acls_option && (st->acls_a_len || st->acls_d_len))
+  if (acls_option > 0 && (st->acls_a_len || st->acls_d_len))
     *output = '+';
 }
 
@@ -706,11 +706,11 @@ xattrs_print (struct tar_stat_info const *st)
     return;
 
   /* selinux */
-  if (selinux_context_option && st->cntx_name)
+  if (selinux_context_option > 0 && st->cntx_name)
     fprintf (stdlis, "  s: %s\n", st->cntx_name);
 
   /* acls */
-  if (acls_option && (st->acls_a_len || st->acls_d_len))
+  if (acls_option > 0 && (st->acls_a_len || st->acls_d_len))
     {
       fprintf (stdlis, "  a: ");
       acls_one_line ("", ',', st->acls_a_ptr, st->acls_a_len);
@@ -719,7 +719,7 @@ xattrs_print (struct tar_stat_info const *st)
     }
 
   /* xattrs */
-  if (xattrs_option && st->xattr_map_size)
+  if (xattrs_option > 0 && st->xattr_map_size)
     {
       int i;
 
-- 
1.8.1.4

Reply via email to