app-arch/tar: Removed old.

Package-Manager: portage-2.2.28
Signed-off-by: Lars Wendler <polynomial-c@gentoo.org>
This commit is contained in:
Lars Wendler
2016-05-16 23:08:05 +02:00
parent 5cf7edb19a
commit 4ebe775067
6 changed files with 0 additions and 1918 deletions

View File

@@ -1,4 +1,3 @@
DIST tar-1.26.tar.bz2 2339773 SHA256 5a5369f464502a598e938029c310d4b3abd51e6bb8dfd045663e61c8ea9f6d41 SHA512 3bc12441bebfc388017ad0632fb3e777ceaf62be82fb19ce771df8bbb765eb094dad336110189f49f5eaaebd4d6ced586098e1e3c8b9f7f775dc483d5513f209 WHIRLPOOL bfdc579f97a260d6b6776211f470bfc1a99b81d89a8067b2ebfab3101ab1a4f2b4f7c444edffc05bc7585993cae601c499ec074bb606c7ef289deac5429cfb2b
DIST tar-1.27.1.tar.bz2 2573070 SHA256 9b0fb3ce8512059337add0da5f8f0f7d7647f2201f5ece24581d620ea60337c6 SHA512 f14a0a58e574db3aeec0914621aff2f0518b8d8acce81106b8219b36b3fed47349d6cb802c51a836a5e6889529337434d83b3c50cd7fc1801b9b3944eecc695b WHIRLPOOL fd44ee747f44febc9dd4b0e1a532c38a835fcb55967143a1ab29b29dfc27316de76dfa1d23438f1843bb0a7962eb0b59c3ec75041cc0fbe879b02af292ebc6e9
DIST tar-1.28.tar.bz2 2693989 SHA256 60e4bfe0602fef34cd908d91cf638e17eeb09394d7b98c2487217dc4d3147562 SHA512 4f66a236a2d9185114e2b358a09f3d38c3c38e984e5fca4bedc4d7eb461bdaace6a7a9fc62aafb70428b1f3dc617fb0d0553558fb29cad33f0cb53ba081521c4 WHIRLPOOL 54ad7b73e973d436cff853fda267d21ab22139f53d18f6870c7a53cf74e53ec8735022b6d3c503504ee416f1b9f9d43ca1af60d2fedb5d852766cb8dd2ac72d0
DIST tar-1.29.tar.bz2 2715993 SHA256 236b11190c0a3a6885bdb8d61424f2b36a5872869aa3f7f695dea4b4843ae2f2 SHA512 d2cea9892892dfa0c8efd390303b75dccc085c4895e07ced684074592d69729916d6ea12475aa6aff873d076a729bb7dc2499c233edcfb9c7e8e8995481eef3b WHIRLPOOL fa5f66a7bb7698c35ad842bc4900a62997da5eb2f3cd6154391b88505a581078a64a8399bb5976d4723d90951d34c084e00d17908d90792bb5139184e8b92a94

View File

@@ -1,22 +0,0 @@
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@

View File

@@ -1,931 +0,0 @@
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 }
};

View File

@@ -1,813 +0,0 @@
.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

View File

@@ -1,76 +0,0 @@
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI="3"
inherit flag-o-matic eutils autotools
DESCRIPTION="Use this to make tarballs :)"
HOMEPAGE="https://www.gnu.org/software/tar/"
SRC_URI="mirror://gnu/tar/${P}.tar.bz2
mirror://gnu-alpha/tar/${P}.tar.bz2"
LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="alpha amd64 arm arm64 hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86 ~ppc-aix ~amd64-fbsd ~x86-fbsd ~x64-freebsd ~x86-freebsd ~hppa-hpux ~ia64-hpux ~x86-interix ~amd64-linux ~arm-linux ~ia64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
IUSE="minimal nls static userland_GNU xattr"
RDEPEND="xattr? ( sys-apps/attr )"
DEPEND="${RDEPEND}
nls? ( >=sys-devel/gettext-0.10.35 )"
src_prepare() {
epatch "${FILESDIR}"/${P}-xattr.patch #382067
epatch "${FILESDIR}"/${P}-no-gets.patch
eautoreconf
if ! use userland_GNU ; then
sed -i \
-e 's:/backup\.sh:/gbackup.sh:' \
scripts/{backup,dump-remind,restore}.in \
|| die "sed non-GNU"
fi
}
src_configure() {
use static && append-ldflags -static
FORCE_UNSAFE_CONFIGURE=1 \
econf \
--enable-backup-scripts \
--bindir="${EPREFIX}"/bin \
--libexecdir="${EPREFIX}"/usr/sbin \
$(usex userland_GNU "" "--program-prefix=g") \
$(use_enable nls) \
$(use_enable xattr)
}
src_install() {
emake DESTDIR="${D}" install || die
local p=$(usex userland_GNU "" "g")
if [[ -z ${p} ]] ; then
# a nasty yet required piece of baggage
exeinto /etc
doexe "${FILESDIR}"/rmt || die
fi
# autoconf looks for gtar before tar (in configure scripts), hence
# in Prefix it is important that it is there, otherwise, a gtar from
# the host system (FreeBSD, Solaris, Darwin) will be found instead
# of the Prefix provided (GNU) tar
if use prefix ; then
dosym tar /bin/gtar
fi
dodoc AUTHORS ChangeLog* NEWS README* THANKS
newman "${FILESDIR}"/tar.1 ${p}tar.1
mv "${ED}"/usr/sbin/${p}backup{,-tar}
mv "${ED}"/usr/sbin/${p}restore{,-tar}
if use minimal ; then
find "${ED}"/etc "${ED}"/*bin/ "${ED}"/usr/*bin/ \
-type f -a '!' '(' -name tar -o -name ${p}tar ')' \
-delete
fi
}

View File

@@ -1,75 +0,0 @@
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=4
inherit flag-o-matic eutils
DESCRIPTION="Use this to make tarballs :)"
HOMEPAGE="https://www.gnu.org/software/tar/"
SRC_URI="mirror://gnu/tar/${P}.tar.bz2
mirror://gnu-alpha/tar/${P}.tar.bz2"
LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~ppc-aix ~amd64-fbsd ~x86-fbsd ~x64-freebsd ~x86-freebsd ~hppa-hpux ~ia64-hpux ~x86-interix ~amd64-linux ~arm-linux ~ia64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
IUSE="acl minimal nls selinux static userland_GNU xattr"
RDEPEND="acl? ( virtual/acl )
selinux? ( sys-libs/libselinux )"
DEPEND="${RDEPEND}
nls? ( >=sys-devel/gettext-0.10.35 )
xattr? ( sys-apps/attr )"
src_prepare() {
if ! use userland_GNU ; then
sed -i \
-e 's:/backup\.sh:/gbackup.sh:' \
scripts/{backup,dump-remind,restore}.in \
|| die "sed non-GNU"
fi
}
src_configure() {
use static && append-ldflags -static
FORCE_UNSAFE_CONFIGURE=1 \
econf \
--enable-backup-scripts \
--bindir="${EPREFIX}"/bin \
--libexecdir="${EPREFIX}"/usr/sbin \
$(usex userland_GNU "" "--program-prefix=g") \
$(use_with acl posix-acls) \
$(use_enable nls) \
$(use_with selinux) \
$(use_with xattr xattrs)
}
src_install() {
emake DESTDIR="${D}" install
local p=$(usex userland_GNU "" "g")
if [[ -z ${p} ]] ; then
# a nasty yet required piece of baggage
exeinto /etc
doexe "${FILESDIR}"/rmt
fi
# autoconf looks for gtar before tar (in configure scripts), hence
# in Prefix it is important that it is there, otherwise, a gtar from
# the host system (FreeBSD, Solaris, Darwin) will be found instead
# of the Prefix provided (GNU) tar
if use prefix ; then
dosym tar /bin/gtar
fi
dodoc AUTHORS ChangeLog* NEWS README* THANKS
mv "${ED}"/usr/sbin/${p}backup{,-tar} || die
mv "${ED}"/usr/sbin/${p}restore{,-tar} || die
if use minimal ; then
find "${ED}"/etc "${ED}"/*bin/ "${ED}"/usr/*bin/ \
-type f -a '!' '(' -name tar -o -name ${p}tar ')' \
-delete || die
fi
}