summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2015-08-08 13:49:04 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2015-08-08 17:38:18 -0700
commit56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch)
tree3f91093cdb475e565ae857f1c5a7fd339e2d781e /app-arch/tar/files
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip
proj/gentoo: Initial commit
This commit represents a new era for Gentoo: Storing the gentoo-x86 tree in Git, as converted from CVS. This commit is the start of the NEW history. Any historical data is intended to be grafted onto this point. Creation process: 1. Take final CVS checkout snapshot 2. Remove ALL ChangeLog* files 3. Transform all Manifests to thin 4. Remove empty Manifests 5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$ 5.1. Do not touch files with -kb/-ko keyword flags. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'app-arch/tar/files')
-rw-r--r--app-arch/tar/files/rmt8
-rw-r--r--app-arch/tar/files/tar-1.26-no-gets.patch22
-rw-r--r--app-arch/tar/files/tar-1.26-xattr.patch931
-rw-r--r--app-arch/tar/files/tar-1.27.1-recursion_norecursion.patch25
-rw-r--r--app-arch/tar/files/tar-1.27.1-xattr_build_fix.patch196
-rw-r--r--app-arch/tar/files/tar-1.28-concat-listed.patch117
-rw-r--r--app-arch/tar/files/tar-1.28-xattr.patch36
-rw-r--r--app-arch/tar/files/tar.1813
-rw-r--r--app-arch/tar/files/tar.1-1.27388
9 files changed, 2536 insertions, 0 deletions
diff --git a/app-arch/tar/files/rmt b/app-arch/tar/files/rmt
new file mode 100644
index 000000000000..15ed6aa91fad
--- /dev/null
+++ b/app-arch/tar/files/rmt
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# This is not a mistake. This shell script (/etc/rmt) has been provided
+# for compatibility with other Unix-like systems, some of which have
+# utilities that expect to find (and execute) rmt in the /etc directory
+# on remote systems.
+#
+exec rmt "$@"
diff --git a/app-arch/tar/files/tar-1.26-no-gets.patch b/app-arch/tar/files/tar-1.26-no-gets.patch
new file mode 100644
index 000000000000..a677af11d370
--- /dev/null
+++ b/app-arch/tar/files/tar-1.26-no-gets.patch
@@ -0,0 +1,22 @@
+hack until gzip pulls a newer gnulib version
+
+From 66712c23388e93e5c518ebc8515140fa0c807348 Mon Sep 17 00:00:00 2001
+From: Eric Blake <eblake@redhat.com>
+Date: Thu, 29 Mar 2012 13:30:41 -0600
+Subject: [PATCH] stdio: don't assume gets any more
+
+Gnulib intentionally does not have a gets module, and now that C11
+and glibc have dropped it, we should be more proactive about warning
+any user on a platform that still has a declaration of this dangerous
+interface.
+
+--- a/gnu/stdio.in.h
++++ b/gnu/stdio.in.h
+@@ -125,7 +125,6 @@
+ so any use of gets warrants an unconditional warning. Assume it is
+ always declared, since it is required by C89. */
+ #undef gets
+-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+
+ #if @GNULIB_FOPEN@
+ # if @REPLACE_FOPEN@
diff --git a/app-arch/tar/files/tar-1.26-xattr.patch b/app-arch/tar/files/tar-1.26-xattr.patch
new file mode 100644
index 000000000000..7986828ef519
--- /dev/null
+++ b/app-arch/tar/files/tar-1.26-xattr.patch
@@ -0,0 +1,931 @@
+https://bugs.gentoo.org/382067
+
+add optional xattr support
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -223,6 +223,20 @@ AC_CHECK_TYPE(iconv_t,:,
+ #endif
+ ])
+
++AC_ARG_ENABLE(xattr,
++ AC_HELP_STRING([--enable-xattr],
++ [enable Extended Attribute support (disabled by default)]),
++ [xattr_enabled=$enableval],
++ [xattr_enabled=no])
++
++if test "x$xattr_enabled" = xyes; then
++ AC_CHECK_HEADERS(attr/xattr.h)
++ AC_CHECK_FUNCS(getxattr fgetxattr lgetxattr \
++ setxattr fsetxattr lsetxattr \
++ listxattr flistxattr llistxattr,
++ AC_DEFINE(HAVE_XATTRS,1,[Define if we have a working extended attributes]),)
++fi
++
+ # Gettext.
+ AM_GNU_GETTEXT([external], [need-formatstring-macros])
+ AM_GNU_GETTEXT_VERSION([0.16])
+--- a/doc/tar.texi
++++ b/doc/tar.texi
+@@ -3002,6 +3002,10 @@ mechanism.
+ Treat all input file or member names literally, do not interpret
+ escape sequences. @xref{input name quoting}.
+
++@opsummary{no-xattrs}
++@item --no-xattrs
++Causes @command{tar} not to store and not to extract xattrs. @xref{Attributes}.
++
+ @opsummary{no-wildcards}
+ @item --no-wildcards
+ Do not use wildcards.
+@@ -3447,6 +3451,10 @@ Enable or disable warning messages identified by @var{keyword}. The
+ messages are suppressed if @var{keyword} is prefixed with @samp{no-}.
+ @xref{warnings}.
+
++@opsummary{xattrs}
++@item --xattrs
++Causes @command{tar} to store xattrs. @xref{Attributes}.
++
+ @opsummary{wildcards}
+ @item --wildcards
+ Use wildcards when matching member names with patterns.
+@@ -8659,6 +8667,8 @@ implementation able to read @samp{ustar} archives will be able to read
+ most @samp{posix} archives as well, with the only exception that any
+ additional information (such as long file names etc.) will in such
+ case be extracted as plain text files along with the files it refers to.
++This is the only format that can store ACLs, SELinux context and extended
++attributes.
+
+ This archive format will be the default format for future versions
+ of @GNUTAR{}.
+@@ -9293,6 +9303,20 @@ Same as both @option{--same-permissions} and @option{--same-order}.
+
+ This option is deprecated, and will be removed in @GNUTAR{} version 1.23.
+
++@opindex xattrs
++@item --xattrs
++This option causes @command{tar} to store the current extended attributes in
++the archive.
++
++The @option{--xattrs} option has no equivalent short option name.
++
++@opindex no-xattrs
++@item --no-xattrs
++This option causes @command{tar} not to store the current extended attributes in
++the archive and not to extract any extended attributes in an archive.
++
++The @option{--no-xattrs} option has no equivalent short option name.
++
+ @end table
+
+ @node Portability
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -20,7 +20,7 @@
+
+ bin_PROGRAMS = tar
+
+-noinst_HEADERS = arith.h common.h tar.h
++noinst_HEADERS = arith.h common.h tar.h xattrs.h
+ tar_SOURCES = \
+ buffer.c\
+ checkpoint.c\
+@@ -42,10 +42,11 @@ tar_SOURCES = \
+ unlink.c\
+ update.c\
+ utf8.c\
+- warning.c
++ warning.c\
++ xattrs.c
+
+ INCLUDES = -I$(top_srcdir)/gnu -I../ -I../gnu -I$(top_srcdir)/lib -I../lib
+
+ LDADD = ../lib/libtar.a ../gnu/libgnu.a $(LIBINTL) $(LIBICONV)
+
+-tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_EACCESS)
++tar_LDADD = $(LIBS) $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_EACCESS)
+--- a/src/common.h
++++ b/src/common.h
+@@ -253,6 +253,9 @@ GLOBAL int same_owner_option;
+ /* If positive, preserve permissions when extracting. */
+ GLOBAL int same_permissions_option;
+
++/* If positive, save the user and root xattrs. */
++GLOBAL int xattrs_option;
++
+ /* When set, strip the given number of file name components from the file name
+ before extracting */
+ GLOBAL size_t strip_name_components;
+@@ -707,6 +710,9 @@ extern char *output_start;
+
+ void update_archive (void);
+
++/* Module attrs.c. */
++#include "xattrs.h"
++
+ /* Module xheader.c. */
+
+ void xheader_decode (struct tar_stat_info *stat);
+@@ -727,6 +733,12 @@ bool xheader_string_end (struct xheader *xhdr, char const *keyword);
+ bool xheader_keyword_deleted_p (const char *kw);
+ char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
+ size_t n);
++void xheader_xattr_init (struct tar_stat_info *st);
++void xheader_xattr_free (struct xattr_array *vals, size_t sz);
++void xheader_xattr_copy (const struct tar_stat_info *st,
++ struct xattr_array **vals, size_t *sz);
++void xheader_xattr_add (struct tar_stat_info *st,
++ const char *key, const char *val, size_t len);
+
+ /* Module system.c */
+
+--- a/src/create.c
++++ b/src/create.c
+@@ -936,6 +936,21 @@ start_header (struct tar_stat_info *st)
+ GNAME_TO_CHARS (st->gname, header->header.gname);
+ }
+
++ if (archive_format == POSIX_FORMAT)
++ {
++ if (xattrs_option > 0)
++ {
++ size_t scan_xattr = 0;
++ struct xattr_array *xattr_map = st->xattr_map;
++
++ while (scan_xattr < st->xattr_map_size)
++ {
++ xheader_store (xattr_map[scan_xattr].xkey, st, &scan_xattr);
++ ++scan_xattr;
++ }
++ }
++ }
++
+ return header;
+ }
+
+@@ -1711,6 +1726,11 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
+ bool ok;
+ struct stat final_stat;
+
++ if (fd == 0)
++ xattrs_xattrs_get (st, p, -1);
++ else
++ xattrs_xattrs_get (st, p, fd);
++
+ if (is_dir)
+ {
+ const char *tag_file_name;
+@@ -1829,6 +1849,8 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
+ if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT) < size)
+ write_long_link (st);
+
++ xattrs_xattrs_get (st, p, -1);
++
+ block_ordinal = current_block_ordinal ();
+ st->stat.st_size = 0; /* force 0 size on symlink */
+ header = start_header (st);
+@@ -1847,11 +1869,20 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
+ }
+ #endif
+ else if (S_ISCHR (st->stat.st_mode))
+- type = CHRTYPE;
++ {
++ type = CHRTYPE;
++ xattrs_xattrs_get (st, p, -1);
++ }
+ else if (S_ISBLK (st->stat.st_mode))
+- type = BLKTYPE;
++ {
++ type = BLKTYPE;
++ xattrs_xattrs_get (st, p, -1);
++ }
+ else if (S_ISFIFO (st->stat.st_mode))
+- type = FIFOTYPE;
++ {
++ type = FIFOTYPE;
++ xattrs_xattrs_get (st, p, -1);
++ }
+ else if (S_ISSOCK (st->stat.st_mode))
+ {
+ WARNOPT (WARN_FILE_IGNORED,
+--- a/src/extract.c
++++ b/src/extract.c
+@@ -97,6 +97,9 @@ struct delayed_set_stat
+ /* Directory that the name is relative to. */
+ int change_dir;
+
++ /* extended attributes*/
++ size_t xattr_map_size; /* Size of the xattr map */
++ struct xattr_array *xattr_map;
+ /* Length and contents of name. */
+ size_t file_name_len;
+ char file_name[1];
+@@ -134,6 +137,9 @@ struct delayed_link
+ hard-linked together. */
+ struct string_list *sources;
+
++ size_t xattr_map_size; /* Size of the xattr map */
++ struct xattr_array *xattr_map;
++
+ /* The desired target of the desired link. */
+ char target[1];
+ };
+@@ -335,6 +341,8 @@ set_stat (char const *file_name,
+ utime_error (file_name);
+ }
+
++ xattrs_xattrs_set (st, file_name, typeflag);
++
+ if (0 < same_owner_option && ! interdir)
+ {
+ /* Some systems allow non-root users to give files away. Once this
+@@ -431,6 +439,13 @@ delay_set_stat (char const *file_name, struct tar_stat_info const *st,
+ data->atflag = atflag;
+ data->after_links = 0;
+ data->change_dir = chdir_current;
++ if (st)
++ xheader_xattr_copy (st, &data->xattr_map, &data->xattr_map_size);
++ else
++ {
++ data->xattr_map = NULL;
++ data->xattr_map_size = 0;
++ }
+ strcpy (data->file_name, file_name);
+ delayed_set_stat_head = data;
+ if (must_be_dot_or_slash (file_name))
+@@ -673,6 +688,31 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
+ return RECOVER_NO;
+ }
+
++/* Restore stat extended attributes (xattr) for FILE_NAME, using information
++ given in *ST. Restore before extraction because they may affect layout.
++ If not restoring permissions, invert the
++ INVERT_PERMISSIONS bits from the file's current permissions.
++ TYPEFLAG specifies the type of the file.
++ FILE_CREATED indicates set_xattr has created the file */
++static int
++set_xattr (char const *file_name, struct tar_stat_info const *st,
++ mode_t invert_permissions, char typeflag, int *file_created)
++{
++ int status = 0;
++ bool interdir_made = false;
++
++ if ((xattrs_option >= 0) && st->xattr_map_size) {
++ mode_t mode = current_stat_info.stat.st_mode & MODE_RWX & ~ current_umask;
++
++ do
++ status = mknod (file_name, mode ^ invert_permissions, 0);
++ while (status && maybe_recoverable ((char *)file_name, false, &interdir_made));
++ xattrs_xattrs_set (st, file_name, typeflag);
++ *file_created = 1;
++ }
++ return(status);
++}
++
+ /* Fix the statuses of all directories whose statuses need fixing, and
+ which are not ancestors of FILE_NAME. If AFTER_LINKS is
+ nonzero, do this for all such directories; otherwise, stop at the
+@@ -733,12 +773,15 @@ apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
+ sb.stat.st_gid = data->gid;
+ sb.atime = data->atime;
+ sb.mtime = data->mtime;
++ sb.xattr_map = data->xattr_map;
++ sb.xattr_map_size = data->xattr_map_size;
+ set_stat (data->file_name, &sb,
+ -1, current_mode, current_mode_mask,
+ DIRTYPE, data->interdir, data->atflag);
+ }
+
+ delayed_set_stat_head = data->next;
++ xheader_xattr_free (data->xattr_map, data->xattr_map_size);
+ free (data);
+ }
+ }
+@@ -854,6 +897,7 @@ extract_dir (char *file_name, int typeflag)
+
+ static int
+ open_output_file (char const *file_name, int typeflag, mode_t mode,
++ int file_created,
+ mode_t *current_mode, mode_t *current_mode_mask)
+ {
+ int fd;
+@@ -864,6 +908,10 @@ open_output_file (char const *file_name, int typeflag, mode_t mode,
+ ? O_TRUNC | (dereference_option ? 0 : O_NOFOLLOW)
+ : O_EXCL));
+
++ /* File might be created in set_xattr. So clear O_EXCL to avoid open() failure */
++ if (file_created)
++ openflag = openflag & ~O_EXCL;
++
+ if (typeflag == CONTTYPE)
+ {
+ static int conttype_diagnosed;
+@@ -934,6 +982,7 @@ extract_file (char *file_name, int typeflag)
+ bool interdir_made = false;
+ mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
+ & ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
++ mode_t invert_permissions = 0 < same_owner_option ? mode & (S_IRWXG | S_IRWXO) : 0;
+ mode_t current_mode = 0;
+ mode_t current_mode_mask = 0;
+
+@@ -950,7 +999,17 @@ extract_file (char *file_name, int typeflag)
+ }
+ else
+ {
++ int file_created = 0;
++ if (set_xattr (file_name, &current_stat_info, invert_permissions,
++ typeflag, &file_created))
++ {
++ skip_member ();
++ open_error (file_name);
++ return 1;
++ }
++
+ while ((fd = open_output_file (file_name, typeflag, mode,
++ file_created,
+ &current_mode, &current_mode_mask))
+ < 0)
+ {
+@@ -1091,6 +1150,7 @@ create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
+ + strlen (file_name) + 1);
+ p->sources->next = 0;
+ strcpy (p->sources->string, file_name);
++ xheader_xattr_copy (&current_stat_info, &p->xattr_map, &p->xattr_map_size);
+ strcpy (p->target, current_stat_info.link_name);
+
+ h = delayed_set_stat_head;
+@@ -1525,6 +1585,8 @@ apply_delayed_links (void)
+ st1.stat.st_gid = ds->gid;
+ st1.atime = ds->atime;
+ st1.mtime = ds->mtime;
++ st1.xattr_map = ds->xattr_map;
++ st1.xattr_map_size = ds->xattr_map_size;
+ set_stat (source, &st1, -1, 0, 0, SYMTYPE,
+ false, AT_SYMLINK_NOFOLLOW);
+ valid_source = source;
+@@ -1539,6 +1601,8 @@ apply_delayed_links (void)
+ sources = next;
+ }
+
++ xheader_xattr_free (ds->xattr_map, ds->xattr_map_size);
++
+ {
+ struct delayed_link *next = ds->next;
+ free (ds);
+--- a/src/list.c
++++ b/src/list.c
+@@ -604,6 +604,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
+ assign_string (&stat_info->gname,
+ header->header.gname[0] ? header->header.gname : NULL);
+
++ xheader_xattr_init (stat_info);
++
+ if (format == OLDGNU_FORMAT && incremental_option)
+ {
+ stat_info->atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
+--- a/src/tar.c
++++ b/src/tar.c
+@@ -304,6 +304,7 @@ enum
+ NO_UNQUOTE_OPTION,
+ NO_WILDCARDS_MATCH_SLASH_OPTION,
+ NO_WILDCARDS_OPTION,
++ NO_XATTR_OPTION,
+ NULL_OPTION,
+ NUMERIC_OWNER_OPTION,
+ OCCURRENCE_OPTION,
+@@ -340,7 +341,8 @@ enum
+ VOLNO_FILE_OPTION,
+ WARNING_OPTION,
+ WILDCARDS_MATCH_SLASH_OPTION,
+- WILDCARDS_OPTION
++ WILDCARDS_OPTION,
++ XATTR_OPTION
+ };
+
+ const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
+@@ -516,6 +518,10 @@ static struct argp_option options[] = {
+ {"preserve-order", 's', 0, 0,
+ N_("sort names to extract to match archive"), GRID+1 },
+ {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
++ {"xattrs", XATTR_OPTION, 0, 0,
++ N_("Save the user/root xattrs to the archive"), GRID+1 },
++ {"no-xattrs", NO_XATTR_OPTION, 0, 0,
++ N_("Don't extract the user/root xattrs from the archive"), GRID+1 },
+ {"preserve", PRESERVE_OPTION, 0, 0,
+ N_("same as both -p and -s"), GRID+1 },
+ {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
+@@ -2079,6 +2085,15 @@ parse_opt (int key, char *arg, struct argp_state *state)
+ same_permissions_option = -1;
+ break;
+
++ case XATTR_OPTION:
++ set_archive_format ("posix");
++ xattrs_option = 1;
++ break;
++
++ case NO_XATTR_OPTION:
++ xattrs_option = -1;
++ break;
++
+ case RECURSION_OPTION:
+ recursion_option = FNM_LEADING_DIR;
+ break;
+@@ -2461,6 +2476,15 @@ decode_options (int argc, char **argv)
+ || subcommand_option != LIST_SUBCOMMAND))
+ USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
+
++ /* star create's non-POSIX typed archives with xattr support, so allow the
++ extra headers */
++ if ((xattrs_option > 0)
++ && archive_format != POSIX_FORMAT
++ && (subcommand_option != EXTRACT_SUBCOMMAND
++ || subcommand_option != DIFF_SUBCOMMAND
++ || subcommand_option != LIST_SUBCOMMAND))
++ USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
++
+ /* If ready to unlink hierarchies, so we are for simpler files. */
+ if (recursive_unlink_option)
+ old_files_option = UNLINK_FIRST_OLD_FILES;
+@@ -2713,6 +2737,7 @@ void
+ tar_stat_destroy (struct tar_stat_info *st)
+ {
+ tar_stat_close (st);
++ xheader_xattr_free (st->xattr_map, st->xattr_map_size);
+ free (st->orig_file_name);
+ free (st->file_name);
+ free (st->link_name);
+--- a/src/tar.h
++++ b/src/tar.h
+@@ -276,6 +276,14 @@ struct xheader
+ uintmax_t string_length;
+ };
+
++/* Information about xattrs for a file. */
++struct xattr_array
++ {
++ char *xkey;
++ char *xval_ptr;
++ size_t xval_len;
++ };
++
+ struct tar_stat_info
+ {
+ char *orig_file_name; /* name of file read from the archive header */
+@@ -287,6 +295,7 @@ struct tar_stat_info
+
+ char *uname; /* user name of owner */
+ char *gname; /* group name of owner */
++
+ struct stat stat; /* regular filesystem stat */
+
+ /* STAT doesn't always have access, data modification, and status
+@@ -309,6 +318,9 @@ struct tar_stat_info
+ size_t sparse_map_size; /* Size of the sparse map */
+ struct sp_array *sparse_map;
+
++ size_t xattr_map_size; /* Size of the xattr map */
++ struct xattr_array *xattr_map;
++
+ /* Extended headers */
+ struct xheader xhdr;
+
+--- /dev/null
++++ b/src/xattrs.c
+@@ -0,0 +1,181 @@
++/* Create a tar archive.
++
++ Copyright (C) 2006 Free Software Foundation, Inc.
++
++ Written by James Antill, on 2006-07-27.
++
++ 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.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
++
++#include <system.h>
++
++#include <quotearg.h>
++
++#include "common.h"
++
++
++#ifndef HAVE_ATTR_XATTR_H
++# undef HAVE_XATTRS
++#endif
++
++#ifdef HAVE_ATTR_XATTR_H
++# include <attr/xattr.h>
++#endif
++
++
++void xattrs_xattrs_get (struct tar_stat_info *st, char const *file_name, int fd)
++{
++ if (xattrs_option > 0)
++ { /* get all xattrs ... this include security.* and system.* if
++ available. We filter them here, but we have to filter them
++ in xattrs_xattrs_set() anyway.
++ */
++ static ssize_t xsz = 1024;
++ static char *xatrs = NULL;
++ ssize_t xret = -1;
++
++#ifndef HAVE_XATTRS
++ static int done = 0;
++ if ((xattrs_option > 0) && !done)
++ WARN ((0, 0, _("Xattr support requested, but not available")));
++ done = 1;
++#else
++
++ if (!xatrs) xatrs = xmalloc (xsz);
++
++ while (((fd == -1) ?
++ ((xret = llistxattr (file_name, xatrs, xsz)) == -1) :
++ ((xret = flistxattr (fd, xatrs, xsz)) == -1)) &&
++ (errno == ERANGE))
++ {
++ xsz <<= 1;
++ xatrs = xrealloc (xatrs, xsz);
++ }
++
++ if (xret == -1)
++ call_arg_warn ((fd == -1) ? "llistxattrs" : "flistxattrs", file_name);
++ else
++ {
++ const char *attr = xatrs;
++ static ssize_t asz = 1024;
++ static char *val = NULL;
++
++ if (!val) val = xmalloc (asz);
++
++ while (xret > 0)
++ {
++ size_t len = strlen (attr);
++ ssize_t aret = 0;
++
++ /* Archive all xattrs during creation, decide at extraction time
++ * which ones are of interest/use for the target filesystem. */
++ while (((fd == -1) ?
++ ((aret = lgetxattr (file_name, attr, val, asz)) == -1) :
++ ((aret = fgetxattr (fd, attr, val, asz)) == -1)) &&
++ (errno == ERANGE))
++ {
++ asz <<= 1;
++ val = xrealloc (val, asz);
++ }
++
++ if (aret != -1)
++ xheader_xattr_add (st, attr, val, aret);
++ else if (errno != ENOATTR)
++ call_arg_warn ((fd==-1) ? "lgetxattr" : "fgetxattr", file_name);
++
++ attr += len + 1;
++ xret -= len + 1;
++ }
++ }
++#endif
++ }
++}
++
++static void xattrs__fd_set (struct tar_stat_info const *st,
++ char const *file_name, char typeflag,
++ const char *attr,
++ const char *ptr, size_t len)
++{
++#ifdef HAVE_XATTRS
++ if (ptr)
++ {
++ const char *sysname = "setxattr";
++ int ret = -1;
++
++ if (typeflag != SYMTYPE)
++ ret = setxattr (file_name, attr, ptr, len, 0);
++ else
++ {
++ sysname = "lsetxattr";
++ ret = lsetxattr (file_name, attr, ptr, len, 0);
++ }
++
++ /* do not print warnings when SELinux is disabled */
++ if ((ret == -1) && (errno != EPERM) && (errno != ENOTSUP))
++ call_arg_error (sysname, file_name);
++ }
++#endif
++}
++
++static char *skip_to_ext_fields (char *ptr)
++{
++ ptr += strcspn (ptr, ":,\n"); /* skip tag name. Ie. user/group/default/mask */
++
++ if (*ptr != ':')
++ return (ptr); /* error? no user/group field */
++ ++ptr;
++
++ ptr += strcspn (ptr, ":,\n"); /* skip user/group name */
++
++ if (*ptr != ':')
++ return (ptr); /* error? no perms field */
++ ++ptr;
++
++ ptr += strcspn (ptr, ":,\n"); /* skip perms */
++
++ if (*ptr != ':')
++ return (ptr); /* no extra fields */
++
++ return (ptr);
++}
++
++void xattrs_xattrs_set (struct tar_stat_info const *st,
++ char const *file_name, char typeflag)
++{
++ if ((xattrs_option >= 0) && st->xattr_map_size)
++ {
++ size_t scan = 0;
++
++#ifndef HAVE_XATTRS
++ static int done = 0;
++ if (!done)
++ WARN ((0, 0, _("Xattr support requested, but not available")));
++ done = 1;
++#else
++ while (scan < st->xattr_map_size)
++ {
++ char *keyword = st->xattr_map[scan].xkey;
++
++ /* assert (!memcpy (keyword, "SCHILY.xattr.", strlen("SCHILY.xattr."))); */
++ keyword += strlen ("SCHILY.xattr.");
++
++ xattrs__fd_set (st, file_name, typeflag, keyword,
++ st->xattr_map[scan].xval_ptr,
++ st->xattr_map[scan].xval_len);
++
++ ++scan;
++ }
++#endif
++ }
++}
+--- /dev/null
++++ b/src/xattrs.h
+@@ -0,0 +1,6 @@
++
++extern void xattrs_xattrs_get (struct tar_stat_info *st,
++ char const *file_name, int fd);
++
++extern void xattrs_xattrs_set (struct tar_stat_info const *st,
++ char const *file_name, char typeflag);
+--- a/src/xheader.c
++++ b/src/xheader.c
+@@ -460,6 +460,74 @@ xheader_write_global (struct xheader *xhdr)
+ }
+ }
+
++void xheader_xattr_init (struct tar_stat_info *st)
++{
++ st->xattr_map = NULL;
++ st->xattr_map_size = 0;
++}
++
++void xheader_xattr_free (struct xattr_array *xattr_map, size_t xattr_map_size)
++{
++ size_t scan = 0;
++
++ while (scan < xattr_map_size)
++ {
++ free (xattr_map[scan].xkey);
++ free (xattr_map[scan].xval_ptr);
++
++ ++scan;
++ }
++ free (xattr_map);
++}
++
++static void xheader_xattr__add (struct xattr_array **xattr_map,
++ size_t *xattr_map_size,
++ const char *key, const char *val, size_t len)
++{
++ size_t pos = (*xattr_map_size)++;
++
++ *xattr_map = xrealloc (*xattr_map,
++ *xattr_map_size * sizeof (struct xattr_array));
++ (*xattr_map)[pos].xkey = xstrdup (key);
++ (*xattr_map)[pos].xval_ptr = xmemdup (val, len + 1);
++ (*xattr_map)[pos].xval_len = len;
++}
++
++void xheader_xattr_add (struct tar_stat_info *st,
++ const char *key, const char *val, size_t len)
++{
++ size_t klen = strlen (key);
++ char *xkey = xmalloc (strlen("SCHILY.xattr.") + klen + 1);
++ char *tmp = xkey;
++
++ tmp = stpcpy (tmp, "SCHILY.xattr.");
++ tmp = stpcpy (tmp, key);
++
++ xheader_xattr__add (&st->xattr_map, &st->xattr_map_size, xkey, val, len);
++
++ free (xkey);
++}
++
++void xheader_xattr_copy (const struct tar_stat_info *st,
++ struct xattr_array **xattr_map, size_t *xattr_map_size)
++{
++ size_t scan = 0;
++
++ *xattr_map = NULL;
++ *xattr_map_size = 0;
++
++ while (scan < st->xattr_map_size)
++ {
++ char *key = st->xattr_map[scan].xkey;
++ char *val = st->xattr_map[scan].xval_ptr;
++ size_t len = st->xattr_map[scan].xval_len;
++
++ xheader_xattr__add (xattr_map, xattr_map_size, key, val, len);
++
++ ++scan;
++ }
++}
++
+
+ /* General Interface */
+
+@@ -473,6 +541,7 @@ struct xhdr_tab
+ struct xheader *, void const *data);
+ void (*decoder) (struct tar_stat_info *, char const *, char const *, size_t);
+ int flags;
++ bool prefix;
+ };
+
+ /* This declaration must be extern, because ISO C99 section 6.9.2
+@@ -489,8 +558,17 @@ locate_handler (char const *keyword)
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+- if (strcmp (p->keyword, keyword) == 0)
+- return p;
++ if (p->prefix)
++ {
++ if (strncmp (p->keyword, keyword, strlen(p->keyword)) == 0)
++ return p;
++ }
++ else
++ {
++ if (strcmp (p->keyword, keyword) == 0)
++ return p;
++ }
++
+ return NULL;
+ }
+
+@@ -500,7 +578,7 @@ xheader_protected_pattern_p (const char *pattern)
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+- if ((p->flags & XHDR_PROTECTED) && fnmatch (pattern, p->keyword, 0) == 0)
++ if (!p->prefix && (p->flags & XHDR_PROTECTED) && fnmatch (pattern, p->keyword, 0) == 0)
+ return true;
+ return false;
+ }
+@@ -511,7 +589,7 @@ xheader_protected_keyword_p (const char *keyword)
+ struct xhdr_tab const *p;
+
+ for (p = xhdr_tab; p->keyword; p++)
+- if ((p->flags & XHDR_PROTECTED) && strcmp (p->keyword, keyword) == 0)
++ if (!p->prefix && (p->flags & XHDR_PROTECTED) && strcmp (p->keyword, keyword) == 0)
+ return true;
+ return false;
+ }
+@@ -1470,6 +1548,27 @@ volume_filename_decoder (struct tar_stat_info *st,
+ }
+
+ static void
++xattr_coder (struct tar_stat_info const *st , char const *keyword,
++ struct xheader *xhdr, void const *data)
++{
++ struct xattr_array *xattr_map = st->xattr_map;
++ const size_t *off = data;
++ xheader_print_n (xhdr, keyword,
++ xattr_map[*off].xval_ptr, xattr_map[*off].xval_len);
++}
++
++static void
++xattr_decoder (struct tar_stat_info *st,
++ char const *keyword, char const *arg, size_t size)
++{
++ char *xstr = NULL;
++
++ xstr = xmemdup (arg, size + 1);
++ xheader_xattr_add (st, keyword + strlen("SCHILY.xattr."), xstr, size);
++ free (xstr);
++}
++
++static void
+ sparse_major_coder (struct tar_stat_info const *st, char const *keyword,
+ struct xheader *xhdr, void const *data)
+ {
+@@ -1506,53 +1605,53 @@ sparse_minor_decoder (struct tar_stat_info *st,
+ }
+
+ struct xhdr_tab const xhdr_tab[] = {
+- { "atime", atime_coder, atime_decoder, 0 },
+- { "comment", dummy_coder, dummy_decoder, 0 },
+- { "charset", dummy_coder, dummy_decoder, 0 },
+- { "ctime", ctime_coder, ctime_decoder, 0 },
+- { "gid", gid_coder, gid_decoder, 0 },
+- { "gname", gname_coder, gname_decoder, 0 },
+- { "linkpath", linkpath_coder, linkpath_decoder, 0 },
+- { "mtime", mtime_coder, mtime_decoder, 0 },
+- { "path", path_coder, path_decoder, 0 },
+- { "size", size_coder, size_decoder, 0 },
+- { "uid", uid_coder, uid_decoder, 0 },
+- { "uname", uname_coder, uname_decoder, 0 },
++ { "atime", atime_coder, atime_decoder, 0, false },
++ { "comment", dummy_coder, dummy_decoder, 0, false },
++ { "charset", dummy_coder, dummy_decoder, 0, false },
++ { "ctime", ctime_coder, ctime_decoder, 0, false },
++ { "gid", gid_coder, gid_decoder, 0, false },
++ { "gname", gname_coder, gname_decoder, 0, false },
++ { "linkpath", linkpath_coder, linkpath_decoder, 0, false },
++ { "mtime", mtime_coder, mtime_decoder, 0, false },
++ { "path", path_coder, path_decoder, 0, false },
++ { "size", size_coder, size_decoder, 0, false },
++ { "uid", uid_coder, uid_decoder, 0, false },
++ { "uname", uname_coder, uname_decoder, 0, false },
+
+ /* Sparse file handling */
+ { "GNU.sparse.name", path_coder, path_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ { "GNU.sparse.major", sparse_major_coder, sparse_major_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ { "GNU.sparse.minor", sparse_minor_coder, sparse_minor_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ { "GNU.sparse.realsize", sparse_size_coder, sparse_size_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ { "GNU.sparse.numblocks", sparse_numblocks_coder, sparse_numblocks_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+
+ /* tar 1.14 - 1.15.90 keywords. */
+ { "GNU.sparse.size", sparse_size_coder, sparse_size_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ /* tar 1.14 - 1.15.1 keywords. Multiple instances of these appeared in 'x'
+ headers, and each of them was meaningful. It confilcted with POSIX specs,
+ which requires that "when extended header records conflict, the last one
+ given in the header shall take precedence." */
+ { "GNU.sparse.offset", sparse_offset_coder, sparse_offset_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ { "GNU.sparse.numbytes", sparse_numbytes_coder, sparse_numbytes_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+ /* tar 1.15.90 keyword, introduced to remove the above-mentioned conflict. */
+ { "GNU.sparse.map", NULL /* Unused, see pax_dump_header() */,
+- sparse_map_decoder, 0 },
++ sparse_map_decoder, 0, false },
+
+ { "GNU.dumpdir", dumpdir_coder, dumpdir_decoder,
+- XHDR_PROTECTED },
++ XHDR_PROTECTED, false },
+
+ /* Keeps the tape/volume label. May be present only in the global headers.
+ Equivalent to GNUTYPE_VOLHDR. */
+ { "GNU.volume.label", volume_label_coder, volume_label_decoder,
+- XHDR_PROTECTED | XHDR_GLOBAL },
++ XHDR_PROTECTED | XHDR_GLOBAL, false },
+
+ /* These may be present in a first global header of the archive.
+ They provide the same functionality as GNUTYPE_MULTIVOL header.
+@@ -1561,11 +1660,14 @@ struct xhdr_tab const xhdr_tab[] = {
+ GNU.volume.offset keeps the offset of the start of this volume,
+ otherwise kept in oldgnu_header.offset. */
+ { "GNU.volume.filename", volume_label_coder, volume_filename_decoder,
+- XHDR_PROTECTED | XHDR_GLOBAL },
++ XHDR_PROTECTED | XHDR_GLOBAL, false },
+ { "GNU.volume.size", volume_size_coder, volume_size_decoder,
+- XHDR_PROTECTED | XHDR_GLOBAL },
++ XHDR_PROTECTED | XHDR_GLOBAL, false },
+ { "GNU.volume.offset", volume_offset_coder, volume_offset_decoder,
+- XHDR_PROTECTED | XHDR_GLOBAL },
++ XHDR_PROTECTED | XHDR_GLOBAL, false },
++
++ /* xattrs use the star format. note we only save some variants... */
++ { "SCHILY.xattr", xattr_coder, xattr_decoder, 0, true },
+
+- { NULL, NULL, NULL, 0 }
++ { NULL, NULL, NULL, 0, false }
+ };
diff --git a/app-arch/tar/files/tar-1.27.1-recursion_norecursion.patch b/app-arch/tar/files/tar-1.27.1-recursion_norecursion.patch
new file mode 100644
index 000000000000..47973c394baf
--- /dev/null
+++ b/app-arch/tar/files/tar-1.27.1-recursion_norecursion.patch
@@ -0,0 +1,25 @@
+From 2bd9c15391b0bd6ef0bff76aebf09cfb53003199 Mon Sep 17 00:00:00 2001
+From: Sergey Poznyakoff <gray@gnu.org>
+Date: Thu, 09 Jan 2014 22:13:15 +0000
+Subject: Fix the use of --no-recursion and --recursion options.
+
+Each option remains in effect until cancelled by the next ocurrence
+of its counterpart, as stated in the documentation.
+
+* src/names.c (name_next_elt): Restore recursion_option from the
+value of matching_flags.
+---
+diff --git a/src/names.c b/src/names.c
+index fc9841e..7777dc1 100644
+--- a/src/names.c
++++ b/src/names.c
+@@ -570,6 +570,7 @@ name_next_elt (int change_dirs)
+
+ case NELT_FMASK:
+ matching_flags = ep->v.matching_flags;
++ recursion_option = matching_flags & FNM_LEADING_DIR;
+ name_list_advance ();
+ continue;
+
+--
+cgit v0.9.0.2
diff --git a/app-arch/tar/files/tar-1.27.1-xattr_build_fix.patch b/app-arch/tar/files/tar-1.27.1-xattr_build_fix.patch
new file mode 100644
index 000000000000..14cf90a5f4cc
--- /dev/null
+++ b/app-arch/tar/files/tar-1.27.1-xattr_build_fix.patch
@@ -0,0 +1,196 @@
+http://lists.gnu.org/archive/html/bug-tar/2013-12/msg00023.html
+https://bugs.gentoo.org/489170
+
+--- tar-1.27.1/configure 2013-11-17 17:18:39.000000000 +0100
++++ tar-1.27.1/configure 2013-11-17 17:18:39.000000000 +0100
+@@ -33619,19 +33619,20 @@
+ fi
+
+
+- for ac_header in attr/xattr.h
++ for ac_header in sys/xattr.h attr/xattr.h
+ do :
+- ac_fn_c_check_header_mongrel "$LINENO" "attr/xattr.h" "ac_cv_header_attr_xattr_h" "$ac_includes_default"
+-if test "x$ac_cv_header_attr_xattr_h" = xyes; then :
++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+-#define HAVE_ATTR_XATTR_H 1
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
+
+ fi
+
+ done
+
+- if test "$ac_cv_header_attr_xattr_h" = yes; then
++ if test "$ac_cv_header_sys_xattr_h" = yes -o "$ac_cv_header_attr_xattr_h" = yes; then
+ TAR_COND_XATTR_H_TRUE=
+ TAR_COND_XATTR_H_FALSE='#'
+ else
+@@ -33639,30 +33640,130 @@
+ TAR_COND_XATTR_H_FALSE=
+ fi
+
+- if test "$ac_cv_header_attr_xattr_h" = yes; then
+- for ac_func in getxattr fgetxattr lgetxattr \
+- setxattr fsetxattr lsetxattr \
+- listxattr flistxattr llistxattr
+-do :
+- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++
++ if test "$with_xattrs" != no; then
++ # If <sys/xattr.h> doesn't exist and <attr/xattr.h> does,
++ # then link against libattr.so and not libc
++ if test "$ac_cv_header_sys_xattr_h" = no -a "$ac_cv_header_attr_xattr_h" = yes; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgetxattr in -lattr" >&5
++$as_echo_n "checking for fgetxattr in -lattr... " >&6; }
++if ${ac_cv_lib_attr_fgetxattr+:} false; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_check_lib_save_LIBS=$LIBS
++LIBS="-lattr $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char fgetxattr ();
++int
++main ()
++{
++return fgetxattr ();
++ ;
++ return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_lib_attr_fgetxattr=yes
++else
++ ac_cv_lib_attr_fgetxattr=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_attr_fgetxattr" >&5
++$as_echo "$ac_cv_lib_attr_fgetxattr" >&6; }
++if test "x$ac_cv_lib_attr_fgetxattr" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++#define HAVE_LIBATTR 1
+ _ACEOF
+- # only when functions are present
+
+-$as_echo "#define HAVE_ATTR_XATTR_H 1" >>confdefs.h
++ LIBS="-lattr $LIBS"
+
+- if test "$with_xattrs" != no; then
++fi
+
+-$as_echo "#define HAVE_XATTRS /**/" >>confdefs.h
++ fi
++ have_functions=yes
++ for xattr_func in getxattr fgetxattr lgetxattr \
++ setxattr fsetxattr lsetxattr \
++ listxattr flistxattr llistxattr; do \
++ as_ac_Search=`$as_echo "ac_cv_search_$xattr_func" | $as_tr_sh`
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing $xattr_func" >&5
++$as_echo_n "checking for library containing $xattr_func... " >&6; }
++if eval \${$as_ac_Search+:} false; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_func_search_save_LIBS=$LIBS
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char $xattr_func ();
++int
++main ()
++{
++return $xattr_func ();
++ ;
++ return 0;
++}
++_ACEOF
++for ac_lib in '' attr; do
++ if test -z "$ac_lib"; then
++ ac_res="none required"
++ else
++ ac_res=-l$ac_lib
++ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
++ fi
++ if ac_fn_c_try_link "$LINENO"; then :
++ eval "$as_ac_Search=\$ac_res"
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext
++ if eval \${$as_ac_Search+:} false; then :
++ break
++fi
++done
++if eval \${$as_ac_Search+:} false; then :
+
+- fi
++else
++ eval "$as_ac_Search=no"
++fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++eval ac_res=\$$as_ac_Search
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++eval ac_res=\$$as_ac_Search
++if test "$ac_res" != no; then :
++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
++else
++ have_functions=no
+ fi
+-done
+
++ test $have_functions = no && break
++ done
++ if test $have_functions = yes; then
++
++$as_echo "#define HAVE_XATTRS 1" >>confdefs.h
++
++ else
++ test "$with_xattrs" = yes && as_fn_error $? "xattr support requested but not found." "$LINENO" 5
++ fi
+ fi
+
+
+--- tar-1.27.1/lib/xattr-at.h 2013-03-14 21:18:10.000000000 +0100
++++ tar-1.27.1/lib/xattr-at.h 2013-03-14 21:18:10.000000000 +0100
+@@ -20,7 +20,15 @@
+ #define XATTRS_AT_H
+
+ #include <sys/types.h>
+-#include <attr/xattr.h>
++#if defined(HAVE_SYS_XATTR_H)
++# include <sys/xattr.h>
++#elif defined(HAVE_ATTR_XATTR_H)
++# include <attr/xattr.h>
++#endif
++
++#ifndef ENOATTR
++# define ENOATTR ENODATA /* No such attribute */
++#endif
+
+ /* These are the dir-fd-relative variants of the functions without the
+ "at" suffix. For example, setxattrat (AT_FDCWD, path, name, value, size,
diff --git a/app-arch/tar/files/tar-1.28-concat-listed.patch b/app-arch/tar/files/tar-1.28-concat-listed.patch
new file mode 100644
index 000000000000..28dc57824155
--- /dev/null
+++ b/app-arch/tar/files/tar-1.28-concat-listed.patch
@@ -0,0 +1,117 @@
+https://bugs.gentoo.org/546294
+https://lists.gnu.org/archive/html/bug-tar/2015-04/msg00006.html
+
+From 15c02c2b9d383446b3ea35dbea5a048e136b020d Mon Sep 17 00:00:00 2001
+From: Sergey Poznyakoff <gray@gnu.org.ua>
+Date: Thu, 16 Apr 2015 13:02:10 +0300
+Subject: [PATCH] Fix extraction from concatenated incremental archives.
+
+* src/common.h (remove_delayed_set_stat): New proto.
+* src/extract.c (free_delayed_set_stat)
+(remove_delayed_set_stat): New function.
+(apply_nonancestor_delayed_set_stat): Use free_delayed_set_stat.
+* src/misc.c (safer_rmdir): Remove delayed_set_stat entry
+corresponding to the removed directory.
+* tests/incr10.at: New test case.
+* tests/Makefile.am: Add new test.
+* tests/testsuite.at: Likewise.
+---
+ src/common.h | 2 ++
+ src/extract.c | 38 +++++++++++++++++++++++++++-----
+ src/misc.c | 7 +++++-
+ tests/Makefile.am | 1 +
+ tests/incr10.at | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/testsuite.at | 1 +
+ 6 files changed, 107 insertions(+), 6 deletions(-)
+ create mode 100644 tests/incr10.at
+
+diff --git a/src/common.h b/src/common.h
+index 20cbb64..2904183 100644
+--- a/src/common.h
++++ b/src/common.h
+@@ -523,6 +523,8 @@ void extract_archive (void);
+ void extract_finish (void);
+ bool rename_directory (char *src, char *dst);
+
++void remove_delayed_set_stat (const char *fname);
++
+ /* Module delete.c. */
+
+ void delete_archive_members (void);
+diff --git a/src/extract.c b/src/extract.c
+index ca25603..5aaeb1b 100644
+--- a/src/extract.c
++++ b/src/extract.c
+@@ -537,6 +537,38 @@ repair_delayed_set_stat (char const *dir,
+ quotearg_colon (dir)));
+ }
+
++static void
++free_delayed_set_stat (struct delayed_set_stat *data)
++{
++ xheader_xattr_free (data->xattr_map, data->xattr_map_size);
++ free (data->cntx_name);
++ free (data->acls_a_ptr);
++ free (data->acls_d_ptr);
++ free (data);
++}
++
++void
++remove_delayed_set_stat (const char *fname)
++{
++ struct delayed_set_stat *data, *next, *prev = NULL;
++ for (data = delayed_set_stat_head; data; data = next)
++ {
++ next = data->next;
++ if (chdir_current == data->change_dir
++ && strcmp (data->file_name, fname) == 0)
++ {
++ free_delayed_set_stat (data);
++ if (prev)
++ prev->next = next;
++ else
++ delayed_set_stat_head = next;
++ return;
++ }
++ else
++ prev = data;
++ }
++}
++
+ /* After a file/link/directory creation has failed, see if
+ it's because some required directory was not present, and if so,
+ create all required directories. Return zero if all the required
+@@ -846,11 +878,7 @@ apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
+ }
+
+ delayed_set_stat_head = data->next;
+- xheader_xattr_free (data->xattr_map, data->xattr_map_size);
+- free (data->cntx_name);
+- free (data->acls_a_ptr);
+- free (data->acls_d_ptr);
+- free (data);
++ free_delayed_set_stat (data);
+ }
+ }
+
+diff --git a/src/misc.c b/src/misc.c
+index 8e66643..d263c07 100644
+--- a/src/misc.c
++++ b/src/misc.c
+@@ -586,7 +586,12 @@ safer_rmdir (const char *file_name)
+ return -1;
+ }
+
+- return unlinkat (chdir_fd, file_name, AT_REMOVEDIR);
++ if (unlinkat (chdir_fd, file_name, AT_REMOVEDIR) == 0)
++ {
++ remove_delayed_set_stat (file_name);
++ return 0;
++ }
++ return -1;
+ }
+
+ /* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
+--
+2.3.5
+
diff --git a/app-arch/tar/files/tar-1.28-xattr.patch b/app-arch/tar/files/tar-1.28-xattr.patch
new file mode 100644
index 000000000000..a8f91fd8b200
--- /dev/null
+++ b/app-arch/tar/files/tar-1.28-xattr.patch
@@ -0,0 +1,36 @@
+https://bugs.gentoo.org/548024
+
+From 9c2b57232e3bc2e5ba85387560bcdd851849a128 Mon Sep 17 00:00:00 2001
+From: Paul Eggert <eggert@cs.ucla.edu>
+Date: Mon, 5 Jan 2015 20:24:18 -0800
+Subject: [PATCH] tar: port xattr-at.c to Solaris 10
+
+* lib/xattr-at.c (setxattrat, lsetxattrat, getxattrat, lgetxattrat)
+(listxattrat, llistxattrat): Compile only if HAVE_XATTRS, so that
+the code doesn't call functions that are not declared.
+---
+ lib/xattr-at.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/lib/xattr-at.c b/lib/xattr-at.c
+index 443ccae..66427e9 100644
+--- a/lib/xattr-at.c
++++ b/lib/xattr-at.c
+@@ -31,6 +31,8 @@
+
+ #include "openat-priv.h"
+
++#ifdef HAVE_XATTRS
++
+ /* setxattrat */
+ #define AT_FUNC_NAME setxattrat
+ #define AT_FUNC_F1 setxattr
+@@ -108,3 +110,5 @@
+ #undef AT_FUNC_RESULT
+ #undef AT_FUNC_POST_FILE_PARAM_DECLS
+ #undef AT_FUNC_POST_FILE_ARGS
++
++#endif /* HAVE_XATTRS */
+--
+2.4.0
+
diff --git a/app-arch/tar/files/tar.1 b/app-arch/tar/files/tar.1
new file mode 100644
index 000000000000..5d6012728c68
--- /dev/null
+++ b/app-arch/tar/files/tar.1
@@ -0,0 +1,813 @@
+.TH TAR 1 "Mar 2010" "GNU" "tar"
+.SH NAME
+tar \- The GNU version of the tape archiver (tar) utility
+.SH SYNOPSIS
+.B tar
+.I <operation> [options]
+
+.I Operations:
+.nf
+.B [-]A --catenate --concatenate
+.B [-]c --create
+.B [-]d --diff --compare
+.B [-]r --append
+.B [-]t --list
+.B [-]u --update
+.B [-]x --extract --get
+.B --delete
+.fi
+
+.I Common Options:
+.nf
+.BR -C ", " --directory " DIR"
+.BR -f ", " --file " FILE"
+.BR -j ", " --bzip2
+.BR -J ", " --xz
+.BR -p ", " --preserve-permissions
+.BR -v ", " --verbose
+.BR -z ", " --gzip
+.fi
+
+.I All Options:
+.br
+[
+.BR -a ", " --auto-compress
+]
+[
+.BR --add-file " FILE"
+]
+[
+.BR --anchored
+]
+[
+.BR --atime-preserve
+]
+[
+.BR -b ", " --blocking-factor " N"
+]
+[
+.BR -B ", " --read-full-records
+]
+[
+.BR --backup " BACKUP-TYPE"
+]
+[
+.BR --block-compress
+]
+[
+.BR -C ", " --directory " DIR"
+]
+[
+.BR --checkpoint
+]
+[
+.BR --delay-directory-restore
+]
+[
+.BR --exclude " PATTERN"
+]
+[
+.BR --exclude-caches
+]
+[
+.BR --exclude-caches-all
+]
+[
+.BR --exclude-caches-under
+]
+[
+.BR --exclude-tag " FILE"
+]
+[
+.BR --exclude-tag-all " FILE"
+]
+[
+.BR --exclude-tag-under " FILE"
+]
+[
+.BR -f ", " --file " [HOSTNAME:]FILE"
+]
+[
+.BR -F ", " --info-script " FILE, " --new-volume-script " FILE"
+]
+[
+.BR --force-local
+]
+[
+.BR --format " FORMAT"
+]
+[
+.BR -g ", " --listed-incremental " SNAPSHOT"
+]
+[
+.BR -G ", " --incremental
+]
+[
+.BR --group " GROUP"
+]
+[
+.BR -h ", " --dereference
+]
+[
+.BR --help
+]
+[
+.BR -i ", " --ignore-zeros
+]
+[
+.BR -I ", " --use-compress-program " PROG"
+]
+[
+.BR --ignore-case
+]
+[
+.BR --ignore-command-error
+]
+[
+.BR --ignore-failed-read
+]
+[
+.BR --index-file " FILE"
+]
+[
+.BR -j ", " --bzip2
+]
+[
+.BR -J ", " --xz
+]
+[
+.BR -k ", " --keep-old-files
+]
+[
+.BR -K ", " --starting-file " FILE"
+]
+[
+.BR --keep-newer-files
+]
+[
+.BR -l ", " --check-links
+]
+[
+.BR -L ", " --tape-length " N"
+]
+[
+.BR --lzip
+]
+[
+.BR --lzma
+]
+[
+.BR --lzop
+]
+[
+.BR -m ", " --touch ", " --modification-time
+]
+[
+.BR -M ", " --multi-volume
+]
+[
+.BR --mode " PERMISSIONS"
+]
+[
+.BR --mtime " DATE"
+]
+[
+.BR -N ", " --after-date " DATE, " --newer " DATE"
+]
+[
+.BR --newer-mtime " DATE"
+]
+[
+.BR --no-anchored
+]
+[
+.BR --no-auto-compress
+]
+[
+.BR --no-delay-directory-restore
+]
+[
+.BR --no-ignore-case
+]
+[
+.BR --no-ignore-command-error
+]
+[
+.BR --no-overwrite-dir
+]
+[
+.BR --no-quote-chars
+]
+[
+.BR --no-recursion
+]
+[
+.BR --no-same-permissions
+]
+[
+.BR --no-unquote
+]
+[
+.BR --no-wildcards
+]
+[
+.BR --no-wildcards-match-slash
+]
+[
+.BR --null
+]
+[
+.BR --numeric-owner
+]
+[
+.BR -o ", " --old-archive ", " --portability ", " --no-same-owner
+]
+[
+.BR -O ", " --to-stdout
+]
+[
+.BR --occurrence " NUM"
+]
+[
+.BR --one-file-system
+]
+[
+.BR --overwrite
+]
+[
+.BR --overwrite-dir
+]
+[
+.BR --owner " USER"
+]
+[
+.BR -p ", " --same-permissions ", " --preserve-permissions
+]
+[
+.BR -P ", " --absolute-names
+]
+[
+.BR --pax-option " KEYWORD-LIST"
+]
+[
+.BR --posix
+]
+[
+.BR --preserve
+]
+[
+.BR --quote-chars " STRING"
+]
+[
+.BR --quote-style " STYLE"
+]
+[
+.BR -R ", " --block-number
+]
+[
+.BR --record-size " SIZE"
+]
+[
+.BR --recursion
+]
+[
+.BR --recursive-unlink
+]
+[
+.BR --remove-files
+]
+[
+.BR --restrict
+]
+[
+.BR --rmt-command " CMD"
+]
+[
+.BR --rsh-command " CMD"
+]
+[
+.BR -s ", " --same-order ", " --preserve-order
+]
+[
+.BR -S ", " --sparse
+]
+[
+.BR --same-owner
+]
+[
+.BR --show-defaults
+]
+[
+.BR --show-omitted-dirs
+]
+[
+.BR --show-transformed-names ", " --show-stored-names
+]
+[
+.BR --strip-components " NUMBER"
+]
+[
+.BR --suffix " SUFFIX"
+]
+[
+.BR -T ", " --files-from " FILE"
+]
+[
+.BR --test-label
+]
+[
+.BR --to-command " COMMAND"
+]
+[
+.BR --transform " EXPRESSION"
+]
+[
+.BR --totals
+]
+[
+.BR -U ", " --unlink-first
+]
+[
+.BR --unquote
+]
+[
+.BR --utc
+]
+[
+.BR -v ", " --verbose
+]
+[
+.BR -V ", " --label " NAME"
+]
+[
+.BR --version
+]
+[
+.BR --volno-file " FILE"
+]
+[
+.BR -w ", " --interactive ", " --confirmation
+]
+[
+.BR -W ", " --verify
+]
+[
+.BR --wildcards
+]
+[
+.BR --wildcards-match-slash
+]
+[
+.BR -X ", " --exclude-from " FILE"
+]
+[
+.BR -z ", " --gzip ", " --gunzip ", " --ungzip
+]
+[
+.BR -Z ", " --compress ", " --uncompress
+]
+[
+.BR -[0-7][lmh]
+]
+.SH DESCRIPTION
+This manual page documents the GNU version of \fBtar\fR, an archiving
+program designed to store and extract files from an archive file known
+as a \fItarfile\fR. A \fItarfile\fR may be made on a tape drive,
+however, it is also common to write a \fItarfile\fR to a normal file.
+The first argument to \fBtar\fR must be one of the options \fBAcdrtux\fR,
+followed by any optional functions. The final arguments to \fBtar\fR
+are the names of the files or directories which should be archived. The
+use of a directory name always implies that the subdirectories below
+should be included in the archive.
+.SH EXAMPLES
+.TP
+.B tar -xvf foo.tar
+verbosely extract foo.tar
+.TP
+.B tar -xzf foo.tar.gz
+extract gzipped foo.tar.gz
+.TP
+.B tar -cjf foo.tar.bz2 bar/
+create bzipped tar archive of the directory bar called foo.tar.bz2
+.TP
+.B tar -xjf foo.tar.bz2 -C bar/
+extract bzipped foo.tar.bz2 after changing directory to bar
+.TP
+.B tar -xzf foo.tar.gz blah.txt
+extract the file blah.txt from foo.tar.gz
+.P
+Note: When working with archives, specifying the compression option is often
+times unnecessary as \fBtar\fR will automatically detect the compression type
+based on the suffix of the archive.
+.SH "FUNCTION LETTERS"
+.TP
+.B One of the following options must be used:
+.TP
+.BR -A ", " --catenate ", " --concatenate
+append tar files to an archive
+.TP
+.BR -c ", " --create
+create a new archive
+.TP
+.BR -d ", " --diff ", " --compare
+find differences between archive and file system
+.TP
+.BR -r ", " --append
+append files to the end of an archive
+.TP
+.BR -t ", " --list
+list the contents of an archive
+.TP
+.BR -u ", " --update
+only append files that are newer than the existing in archive
+.TP
+.BR -x ", " --extract ", " --get
+extract files from an archive
+.TP
+.BR --delete
+delete from the archive (not for use on magnetic tapes!)
+.SH "COMMON OPTIONS"
+.TP
+.BR -C ", " --directory " DIR"
+change to directory DIR
+.TP
+.BR -f ", " --file " [HOSTNAME:]FILE"
+use archive file or device FILE (default is "-", meaning stdin/stdout)
+.TP
+.BR -j ", " --bzip2
+filter archive through bzip2; use to decompress .bz2 files
+.TP
+.BR -J ", " --xz
+filter archive through xz; use to decompress .xz files
+.TP
+.BR -p ", " --preserve-permissions
+extract all protection information
+.TP
+.BR -v ", " --verbose
+verbosely list files processed
+.TP
+.BR -z ", " --gzip ", " --ungzip
+filter the archive through gzip
+.SH "ALL OPTIONS"
+.TP
+.BR -a ", " --auto-compress
+use archive suffix to determine the compression program
+.TP
+.BR --add-file " FILE"
+add specified FILE to the archive (useful if FILE starts with a dash)
+.TP
+.BR --anchored
+patterns will match the start of file names
+.TP
+.BR --atime-preserve
+don't change access times of files that are archived
+.TP
+.BR -b ", " --blocking-factor " N"
+block size of Nx512 bytes (default N=20)
+.TP
+.BR -B ", " --read-full-blocks
+reblock as we read (for reading 4.2BSD pipes)
+.TP
+.BR --backup " BACKUP-TYPE"
+backup files instead of deleting them using BACKUP-TYPE simple or
+numbered
+.TP
+.BR --block-compress
+block the output of compression program for tapes
+.TP
+.BR -C ", " --directory " DIR"
+change to directory DIR
+.TP
+.BR --checkpoint
+print directory names while reading the archive
+.TP
+.BR --delay-directory-restore
+delay setting modification times and permissions of extracted directories
+until the end of extraction
+.TP
+.BR --exclude " PATTERN"
+exclude files based upon PATTERN
+.TP
+.BR --exclude-caches
+exclude directories that contain a cache directory tag
+.TP
+.BR --exclude-tag " FILE"
+exclude directories that contain a file named FILE
+.TP
+.BR -f ", " --file " [HOSTNAME:]FILE"
+use archive file or device FILE (default "-", meaning stdin/stdout)
+.TP
+.BR -F ", " --info-script " FILE, " --new-volume-script " FILE"
+run script at end of each tape (implies \fI--multi-volume\fR)
+.TP
+.BR --force-local
+archive file is local even if its name contains a colon
+.TP
+.BR --format " FORMAT"
+selects the format of the created archive
+.nf
+\fIv7\fR - Unix V7
+\fIoldgnu\fR - GNU tar <=1.12
+\fIgnu\fR - GNU tar 1.13
+\fIustar\fR - POSIX.1-1988
+\fIposix\fR - POSIX.1-2001
+.fi
+.TP
+.BR -g ", " --listed-incremental " SNAPSHOT"
+create/list/extract new GNU-format incremental backup
+.TP
+.BR --group " GROUP"
+give files added to the archive a group id of GROUP instead of the group id
+of the source file; this option does not affect extraction
+.TP
+.BR -G ", " --incremental
+create/list/extract old GNU-format incremental backup
+.TP
+.BR -h ", " --dereference
+don't archive symlinks; archive the files they point to
+.TP
+.BR --help
+like this manpage, but not as cool
+.TP
+.BR -i ", " --ignore-zeros
+ignore blocks of zeros in archive (normally mean EOF)
+.TP
+.BR -I ", " --use-compress-program " PROG"
+access the archive through PROG (which is generally a compression program;
+it must accept the \fI-d\fR option)
+.TP
+.BR --ignore-case
+ignore case when excluding files
+.TP
+.BR --ignore-command-error
+ignore exit codes of subprocesses
+.TP
+.BR --ignore-failed-read
+don't exit with non-zero status on unreadable files
+.TP
+.BR --index-file " FILE"
+send verbose output to FILE instead of stdout
+.TP
+.BR -j ", " --bzip2
+filter archive through bzip2, use to decompress .bz2 files
+.TP
+.BR -J ", " --xz
+filter archive through xz; use to decompress .xz files
+.TP
+.BR -k ", " --keep-old-files
+keep existing files; don't overwrite them from archive
+.TP
+.BR -K ", " --starting-file " FILE"
+begin at file FILE in the archive
+.TP
+.BR --keep-newer-files
+do not overwrite files which are newer than the archive
+.TP
+.BR -l ", " --check-links
+warn if number of hard links to the file on the filesystem mismatchs
+the number of links recorded in the archive
+.TP
+.BR -L ", " --tape-length " N"
+change tapes after writing N*1024 bytes
+.TP
+.BR -m ", " --touch ", " --modification-time
+don't extract file modified time
+.TP
+.BR -M ", " --multi-volume
+create/list/extract multi-volume archive
+.TP
+.BR --mode " PERMISSIONS"
+apply PERMISSIONS while adding files (see \fBchmod\fR(1))
+.TP
+.BR --mtime " DATE"
+when creating archives, use DATE as the modification time of the members,
+instead of their actual modification times
+.TP
+.BR -N ", " --after-date " DATE, " --newer " DATE"
+only store files that were modified or had status updates (permissions,
+ACLs, extended attributes, ...) since DATE
+.TP
+.BR --newer-mtime " DATE"
+like \fI--newer\fR, but only store files that were modified since DATE
+.TP
+.BR --no-anchored
+match any subsequenceof the name's components with \fI--exclude\fR
+.TP
+.BR --no-auto-compress
+do not use archive suffix to determine the compression program
+.TP
+.BR --no-delay-directory-restore
+modification times and permissions of extracted directories are set when
+all files from this directory have been extracted; this is the default
+.TP
+.BR --no-ignore-command-error
+print warnings about subprocesses that terminated with a non-zero exit code
+.TP
+.BR --no-ignore-case
+use case-sensitive matching with \fI--exclude\fR
+.TP
+.BR --no-overwrite-dir
+preserve metadata of existing directories when extracting files from an
+archive
+.TP
+.BR --no-quote-chars " STRING"
+remove characters listed in STRING from the list of quoted characters
+set by a previous \fI--quote-chars\fR option
+.TP
+.BR --no-recursion
+don't recurse into directories
+.TP
+.BR --no-same-permissions
+apply user's umask when extracting files instead of recorded permissions
+.TP
+.BR --no-unquote
+treat all input file or member names literally, do not interpret
+escape sequences
+.TP
+.BR --no-wildcards
+don't use wildcards with \fI--exclude\fR
+.TP
+.BR --no-wildcards-match-slash
+wildcards do not match slashes (/) with \fI--exclude\fR
+.TP
+.BR --null
+\fI--files-from\fR reads null-terminated names, disable \fI--directory\fR
+.TP
+.BR --numeric-owner
+always use numbers for user/group names
+.TP
+.BR -o ", " --old-archive ", " --portability
+like \fI--format=v7\fR; \fI-o\fR exhibits this behavior when creating an
+archive (deprecated behavior)
+.TP
+.BR -o ", " --no-same-owner
+do not attempt to restore ownership when extracting; \fI-o\fR exhibits
+this behavior when extracting an archive
+.TP
+.BR -O ", " --to-stdout
+extract files to standard output
+.TP
+.BR --occurrence " NUM"
+process only NUM occurrences of each named file; used with
+\fI--delete\fR, \fI--diff\fR, \fI--extract\fR, or \fI--list\fR
+.TP
+.BR --one-file-system
+stay in local file system when creating an archive
+.TP
+.BR --overwrite
+overwrite existing files and directory metadata when extracting
+.TP
+.BR --overwrite-dir
+overwrite directory metadata when extracting
+.TP
+.BR --owner " USER"
+give files added to the archive a user id of USER instead of the user id
+of the source file; this option does not affect extraction
+.TP
+.BR -p ", " --preserve-permissions ", " --same-permissions
+extract all protection information
+.TP
+.BR -P ", " --absolute-names
+don't strip leading `/'s from file names
+.TP
+.BR --pax-option " KEYWORD-LIST"
+used only with POSIX.1-2001 archives to modify the way \fBtar\fR handles
+extended header keywords
+.TP
+.BR --posix
+like \fI--format=posix\fR
+.TP
+.BR --preserve
+like \fI--preserve-permissions\fR plus \fI--same-order\fR
+.TP
+.BR --quote-chars " STRING"
+always quote the characters from STRING, even if the selected quoting
+style would not quote them
+.TP
+.BR --quote-style " STYLE"
+set the quoting style to be used when printing member and file names
+.TP
+.BR -R ", " --record-number
+show record number within archive with each message
+.TP
+.BR --record-size " SIZE"
+use SIZE bytes per record when accessing archives
+.TP
+.BR --recursion
+recurse into directories
+.TP
+.BR --recursive-unlink
+remove existing directories before extracting directories of the same name
+.TP
+.BR --remove-files
+remove files after adding them to the archive
+.TP
+.BR --restrict
+disable the use of some potentially harmful options; currently this
+disables shell invocation from the multi-volume menu
+.TP
+.BR --rmt-command " CMD"
+use CMD instead of the default /usr/sbin/rmt
+.TP
+.BR --rsh-command " CMD"
+use remote CMD instead of \fBrsh\fR(1)
+.TP
+.BR -s ", " --same-order ", " --preserve-order
+list of names to extract is sorted to match archive
+.TP
+.BR -S ", " --sparse
+handle sparse files efficiently
+.TP
+.BR --same-owner
+create extracted files with the same ownership
+.TP
+.BR --show-defaults
+display the default options used by \fBtar\fR
+.TP
+.BR --show-omitted-dirs
+print directories \fBtar\fR skips while operating on an archive
+.TP
+.BR --show-transformed-names ", " --show-stored-names
+display file or member names after applying any \fBsed\fR transformations
+.TP
+.BR --strip-components " NUMBER"
+strip NUMBER of leading path components from file names before extraction
+.TP
+.BR --suffix " SUFFIX"
+use SUFFIX instead of default '~' when backing up files
+.TP
+.BR -T ", " --files-from " FILE"
+get names to extract or create from file FILE
+.TP
+.BR --test-label
+read the volume label; if an argument is specified, test whether it
+matches the volume label
+.TP
+.BR --to-command " COMMAND"
+during extraction, pipe extracted files to the standard input of COMMAND
+.TP
+.BR --totals
+print total bytes written with --create
+.TP
+.BR --transform " EXPRESSION"
+transform file or member names using the \fBsed\fR replacement expression
+EXPRESSION
+.TP
+.BR -U ", " --unlink-first
+remove existing files before extracting files of the same name
+.TP
+.BR --unquote
+enable unquoting input file or member names; this is the default
+.TP
+.BR --utc
+display file modification dates in UTC
+.TP
+.BR -v ", " --verbose
+verbosely list files processed
+.TP
+.BR -V ", " --label " NAME"
+create archive with volume name NAME
+.TP
+.BR --version
+print \fBtar\fR program version number
+.TP
+.BR --volno-file " FILE"
+keep track of which volume of a multi-volume archive its working in
+FILE; used with \fI--multi-volume\fR
+.TP
+.BR -w ", " --interactive ", " --confirmation
+ask for confirmation for every action
+.TP
+.BR -W ", " --verify
+attempt to verify the archive after writing it
+.TP
+.BR --wildcards
+use wildcards with \fI--exclude\fR
+.TP
+.BR --wildcards-match-slash
+wildcards match slashes (/) with \fI--exclude\fR
+.TP
+.BR -X ", " --exclude-from " FILE"
+exclude files listed in FILE
+.TP
+.BR -z ", " --gzip ", " --gunzip ", " --ungzip
+filter the archive through gzip
+.TP
+.BR -Z ", " --compress ", " --uncompress
+filter the archive through compress
+.TP
+.BR -[0-7][lmh]
+specify drive and density
+.SH BUGS
+The GNU folks, in general, abhor man pages and create info documents instead.
+The maintainer of \fBtar\fR falls into this category. Thus, this man page may
+not be complete nor current, and it is included in the Gentoo portage tree
+because man is a great tool :). This man page was first taken from Debian
+Linux and has since been lovingly updated here.
+.SH "REPORTING BUGS"
+Please report bugs via http://bugs.gentoo.org/
+.SH "AUTHORS"
+.nf
+Debian Linux http://www.debian.org/
+Mike Frysinger <vapier@gentoo.org>
+.fi
diff --git a/app-arch/tar/files/tar.1-1.27 b/app-arch/tar/files/tar.1-1.27
new file mode 100644
index 000000000000..700b569a57c6
--- /dev/null
+++ b/app-arch/tar/files/tar.1-1.27
@@ -0,0 +1,388 @@
+.\" generated by script on Mon Oct 21 08:29:21 2013
+.Dd Oct 21, 2013
+.Dt TAR 1
+.Sh NAME
+.Nm tar
+.Nd The GNU version of the tar archiving utility
+.Sh SYNOPSIS
+.Nm tar
+.Oo Fl Oc Cm A Fl \-catenate \-concatenate Cm \||\| c Fl \-create Cm \||\| d Fl \-diff \-compare Cm \||\| Fl \-delete Cm \||\| r Fl \-append Cm \||\| t Fl \-list Cm \||\| Fl \-test\-label Cm \||\| u Fl \-update Cm \||\| x Fl \-extract \-get
+.Op Ar options
+.Op Ar pathname ...
+.Sh DESCRIPTION
+.Nm Tar
+stores and extracts files from a tape or disk archive.
+.Pp
+The first argument to
+tar
+should be a function; either one of the letters
+.Cm Acdrtux ,
+or one of the long function names.
+A function letter need not be prefixed with ``\-'', and may be combined
+with other single-letter options.
+A long function name must be prefixed with
+.Cm \\-\\- .
+Some options take a parameter; with the single-letter form
+these must be given as separate arguments.
+With the long form, they may be given by appending
+.Cm = Ns Ar value
+to the option.
+.Sh FUNCTION LETTERS
+Main operation mode:
+.Bl -tag -width flag
+.It Fl A , Fl \-catenate , Fl \-concatenate
+append tar files to an archive
+.It Fl c , Fl \-create
+create a new archive
+.It Fl d , Fl \-diff , Fl \-compare
+find differences between archive and file system
+.It Fl \-delete
+delete from the archive (not on mag tapes!)
+.It Fl r , Fl \-append
+append files to the end of an archive
+.It Fl t , Fl \-list
+list the contents of an archive
+.It Fl \-test\-label
+test the archive volume label and exit
+.It Fl u , Fl \-update
+only append files newer than copy in archive
+.It Fl x , Fl \-extract , Fl \-get
+extract files from an archive
+.El
+.Sh OTHER OPTIONS
+Operation modifiers:
+.Bl -tag -width flag
+.It \-[0\-7][lmh]
+specify drive and density
+.It Fl a , Fl \-auto\-compress
+use archive suffix to determine the compression program
+.It Fl \-acls
+Enable the POSIX ACLs support
+.It Fl \-no\-acls
+Disable the POSIX ACLs support
+.It Fl \-add\-file Ns \= Ns Ar FILE
+add given FILE to the archive (useful if its name starts with a dash)
+.It Fl \-anchored
+patterns match file name start
+.It Fl \-no\-anchored
+patterns match after any '/' (default for exclusion)
+.It Fl \-atime\-preserve
+preserve access times on dumped files, either by restoring the times
+.It Fl \-no\-auto\-compress
+do not use archive suffix to determine the compression program
+.It Fl b , Fl \-blocking\-factor Ar BLOCKS
+BLOCKS x 512 bytes per record
+.It Fl B , Fl \-read\-full\-records
+reblock as we read (for 4.2BSD pipes)
+.It Fl \-backup
+backup before removal, choose version CONTROL
+.It Fl C , Fl \-directory Ar DIR
+change to directory DIR
+.It Fl \-check\-device
+check device numbers when creating incremental archives (default)
+.It Fl \-no\-check\-device
+do not check device numbers when creating incremental archives
+.It Fl \-checkpoint
+display progress messages every NUMBERth record (default 10)
+.It Fl \-checkpoint\-action Ns \= Ns Ar ACTION
+execute ACTION on each checkpoint
+.It Fl \-delay\-directory\-restore
+delay setting modification times and permissions of extracted
+.It Fl \-no\-delay\-directory\-restore
+cancel the effect of --delay-directory-restore option
+.It Fl \-exclude Ns \= Ns Ar PATTERN
+exclude files, given as a PATTERN
+.It Fl \-exclude\-backups
+exclude backup and lock files
+.It Fl \-exclude\-caches
+exclude contents of directories containing CACHEDIR.TAG,
+.It Fl \-exclude\-caches\-all
+exclude directories containing CACHEDIR.TAG
+.It Fl \-exclude\-caches\-under
+exclude everything under directories containing CACHEDIR.TAG
+.It Fl \-exclude\-tag Ns \= Ns Ar FILE
+exclude contents of directories containing FILE, except
+.It Fl \-exclude\-tag\-all Ns \= Ns Ar FILE
+exclude directories containing FILE
+.It Fl \-exclude\-tag\-under Ns \= Ns Ar FILE
+exclude everything under directories containing FILE
+.It Fl \-exclude\-vcs
+exclude version control system directories
+.It Fl f , Fl \-file Ar ARCHIVE
+use archive file or device ARCHIVE
+.It Fl F , Fl \-info\-script , Fl \-new\-volume\-script Ar NAME
+run script at end of each tape (implies -M)
+.It Fl \-force\-local
+archive file is local even if it has a colon
+.It Fl \-full\-time
+print file time to its full resolution
+.It Fl g , Fl \-listed\-incremental Ar FILE
+handle new GNU-format incremental backup
+.It Fl G , Fl \-incremental
+handle old GNU-format incremental backup
+.It Fl \-group Ns \= Ns Ar NAME
+force NAME as group for added files
+.It Fl h , Fl \-dereference
+follow symlinks; archive and dump the files they point to
+.It Fl H , Fl \-format Ar FORMAT
+create archive of the given formatFORMAT is one of the following:
+.Bl -tag -width flag
+.It Fl \-format=gnu
+GNU tar 1.13.x format
+.It Fl \-format=oldgnu
+GNU format as per tar <= 1.12
+.It Fl \-format=pax
+POSIX 1003.1-2001 (pax) format
+.It Fl \-format=posix
+same as pax
+.It Fl \-format=ustar
+POSIX 1003.1-1988 (ustar) format
+.It Fl \-format=v7
+old V7 tar format
+.El
+.It Fl \-hard\-dereference
+follow hard links; archive and dump the files they refer to
+.It Fl i , Fl \-ignore\-zeros
+ignore zeroed blocks in archive (means EOF)
+.It Fl I , Fl \-use\-compress\-program Ar PROG
+filter through PROG (must accept -d)
+.It Fl \-ignore\-case
+ignore case
+.It Fl \-no\-ignore\-case
+case sensitive matching (default)
+.It Fl \-ignore\-command\-error
+ignore exit codes of children
+.It Fl \-no\-ignore\-command\-error
+treat non-zero exit codes of children as error
+.It Fl \-ignore\-failed\-read
+do not exit with nonzero on unreadable files
+.It Fl \-index\-file Ns \= Ns Ar FILE
+send verbose output to FILE
+.It Fl j , Fl \-bzip2
+
+.It Fl J , Fl \-xz
+
+.It Fl k , Fl \-keep\-old\-files
+don't replace existing files when extracting,
+.It Fl K , Fl \-starting\-file Ar MEMBER-NAME
+begin at member MEMBER-NAME when reading the archive
+.It Fl \-keep\-directory\-symlink
+preserve existing symlinks to directories when extracting
+.It Fl \-keep\-newer\-files
+don't replace existing files that are newer than their archive copies
+.It Fl l , Fl \-check\-links
+print a message if not all links are dumped
+.It Fl L , Fl \-tape\-length Ar NUMBER
+change tape after writing NUMBER x 1024 bytes
+.It Fl \-level Ns \= Ns Ar NUMBER
+dump level for created listed-incremental archive
+.It Fl \-lzip
+
+.It Fl \-lzma
+
+.It Fl \-lzop
+
+.It Fl m , Fl \-touch
+don't extract file modified time
+.It Fl M , Fl \-multi\-volume
+create/list/extract multi-volume archive
+.It Fl \-mode Ns \= Ns Ar CHANGES
+force (symbolic) mode CHANGES for added files
+.It Fl \-mtime Ns \= Ns Ar DATE-OR-FILE
+set mtime for added files from DATE-OR-FILE
+.It Fl n , Fl \-seek
+archive is seekable
+.It Fl N , Fl \-newer , Fl \-after\-date Ar DATE-OR-FILE
+only store files newer than DATE-OR-FILE
+.It Fl \-newer\-mtime Ns \= Ns Ar DATE
+compare date and time when data changed only
+.It Fl \-null
+-T reads null-terminated names, disable -C
+.It Fl \-no\-null
+disable the effect of the previous --null option
+.It Fl \-numeric\-owner
+always use numbers for user/group names
+.It Fl O , Fl \-to\-stdout
+extract files to standard output
+.It Fl \-occurrence
+process only the NUMBERth occurrence of each file in the archive;
+.It Fl \-old\-archive , Fl \-portability
+same as --format=v7
+.It Fl \-one\-file\-system
+stay in local file system when creating archive
+.It Fl \-overwrite
+overwrite existing files when extracting
+.It Fl \-overwrite\-dir
+overwrite metadata of existing directories when extracting (default)
+.It Fl \-no\-overwrite\-dir
+preserve metadata of existing directories
+.It Fl \-owner Ns \= Ns Ar NAME
+force NAME as owner for added files
+.It Fl p , Fl \-preserve\-permissions , Fl \-same\-permissions
+extract information about file permissions (default for superuser)
+.It Fl P , Fl \-absolute\-names
+don't strip leading '/'s from file names
+.It Fl \-pax\-option Ns \= Ns Ar keyword[[:]=value][,keyword[[:]=value]]...
+control pax keywords
+.It Fl \-posix
+same as --format=posix
+.It Fl \-preserve
+same as both -p and -s
+.It Fl \-quote\-chars Ns \= Ns Ar STRING
+additionally quote characters from STRING
+.It Fl \-no\-quote\-chars Ns \= Ns Ar STRING
+disable quoting for characters from STRING
+.It Fl \-quoting\-style Ns \= Ns Ar STYLE
+set name quoting style; see below for valid STYLE values
+.It Fl R , Fl \-block\-number
+show block number within archive with each message
+.It Fl \-record\-size Ns \= Ns Ar NUMBER
+NUMBER of bytes per record, multiple of 512
+.It Fl \-recursion
+recurse into directories (default)
+.It Fl \-no\-recursion
+avoid descending automatically in directories
+.It Fl \-recursive\-unlink
+empty hierarchies prior to extracting directory
+.It Fl \-remove\-files
+remove files after adding them to the archive
+.It Fl \-restrict
+disable use of some potentially harmful options
+.It Fl \-rmt\-command Ns \= Ns Ar COMMAND
+use given rmt COMMAND instead of rmt
+.It Fl \-rsh\-command Ns \= Ns Ar COMMAND
+use remote COMMAND instead of rsh
+.It Fl s , Fl \-preserve\-order , Fl \-same\-order
+member arguments are listed in the same order as the
+.It Fl S , Fl \-sparse
+handle sparse files efficiently
+.It Fl \-same\-owner
+try extracting files with the same ownership as exists in the archive (default for superuser)
+.It Fl \-no\-same\-owner
+extract files as yourself (default for ordinary users)
+.It Fl \-no\-same\-permissions
+apply the user's umask when extracting permissions from the archive (default for ordinary users)
+.It Fl \-no\-seek
+archive is not seekable
+.It Fl \-selinux
+Enable the SELinux context support
+.It Fl \-no\-selinux
+Disable the SELinux context support
+.It Fl \-show\-defaults
+show tar defaults
+.It Fl \-show\-omitted\-dirs
+when listing or extracting, list each directory that does not match search criteria
+.It Fl \-show\-snapshot\-field\-ranges
+show valid ranges for snapshot-file fields
+.It Fl \-show\-transformed\-names , Fl \-show\-stored\-names
+show file or archive names after transformation
+.It Fl \-skip\-old\-files
+don't replace existing files when extracting, silently skip over them
+.It Fl \-sparse\-version Ns \= Ns Ar MAJOR[.MINOR]
+set version of the sparse format to use (implies --sparse)
+.It Fl \-strip\-components Ns \= Ns Ar NUMBER
+strip NUMBER leading components from file names on extraction
+.It Fl \-suffix Ns \= Ns Ar STRING
+backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)
+.It Fl T , Fl \-files\-from Ar FILE
+get names to extract or create from FILE
+.It Fl \-to\-command Ns \= Ns Ar COMMAND
+pipe extracted files to another program
+.It Fl \-totals
+print total bytes after processing the archive;
+.It Fl \-transform , Fl \-xform Ar EXPRESSION
+use sed replace EXPRESSION to transform file names
+.It Fl U , Fl \-unlink\-first
+remove each file prior to extracting over it
+.It Fl \-unquote
+unquote filenames read with -T (default)
+.It Fl \-no\-unquote
+do not unquote filenames read with -T
+.It Fl \-utc
+print file modification times in UTC
+.It Fl v , Fl \-verbose
+verbosely list files processed
+.It Fl V , Fl \-label Ar TEXT
+create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name
+.It Fl \-volno\-file Ns \= Ns Ar FILE
+use/update the volume number in FILE
+.It Fl w , Fl \-interactive , Fl \-confirmation
+ask for confirmation for every action
+.It Fl W , Fl \-verify
+attempt to verify the archive after writing it
+.It Fl \-warning Ns \= Ns Ar KEYWORD
+warning control
+.It Fl \-wildcards
+use wildcards (default for exclusion)
+.It Fl \-wildcards\-match\-slash
+wildcards match '/' (default for exclusion)
+.It Fl \-no\-wildcards\-match\-slash
+wildcards do not match '/'
+.It Fl \-no\-wildcards
+verbatim string matching
+.It Fl X , Fl \-exclude\-from Ar FILE
+exclude patterns listed in FILE
+.It Fl \-xattrs
+Enable extended attributes support
+.It Fl \-xattrs\-exclude Ns \= Ns Ar MASK
+specify the exclude pattern for xattr keys
+.It Fl \-xattrs\-include Ns \= Ns Ar MASK
+specify the include pattern for xattr keys
+.It Fl \-no\-xattrs
+Disable extended attributes support
+.It Fl z , Fl \-gzip , Fl \-gunzip Fl \-ungzip
+
+.It Fl Z , Fl \-compress , Fl \-uncompress
+
+.El
+.Sh ENVIRONMENT
+The behavior of tar is controlled by the following environment variables,
+among others:
+.Bl -tag -width Ds
+.It Ev SIMPLE_BACKUP_SUFFIX
+Backup prefix to use when extracting, if
+.Fl \-suffix
+is not specified.
+The backup suffix defaults to `~' if neither is specified.
+.It Ev TAR_OPTIONS
+Options to prepend to those specified on the command line, separated by
+whitespace. Embedded backslashes may be used to escape whitespace or
+backslashes within an option.
+.It Ev TAPE
+Device or file to use for the archive if
+.Fl \-file
+is not specified.
+If this environment variable is unset, use stdin or stdout instead.
+.El
+.Sh EXAMPLES
+Create archive.tar from files foo and bar.
+.Bd -literal -offset indent -compact
+tar \-cf archive.tar foo bar
+.Ed
+List all files in archive.tar verbosely.
+.Bd -literal -offset indent -compact
+tar \-tvf archive.tar
+.Ed
+Extract all files from archive.tar.
+.Bd -literal -offset indent -compact
+tar \-xf archive.tar
+.Ed
+.Sh SEE ALSO
+.\" libarchive
+.Xr tar 5 ,
+.\" man-pages
+.Xr symlink 7 ,
+.Xr rmt 8
+.Sh HISTORY
+The
+.Nm tar
+command appeared in
+.At v7 .
+.Sh BUGS
+The GNU folks, in general, abhor man pages, and create info documents instead.
+Unfortunately, the info document describing tar is licensed under the GFDL with
+invariant cover texts, which makes it impossible to include any text
+from that document in this man page.
+Most of the text in this document was automatically extracted from the usage
+text in the source.
+It may not completely describe all features of the program.