new upstream release 1.27 (#1016288)
This commit is contained in:
parent
e72627093d
commit
67775841f5
2
.gitignore
vendored
2
.gitignore
vendored
@ -6,3 +6,5 @@ tar-1.23.tar.bz2.sig
|
|||||||
/tar-1.25.tar.xz.sig
|
/tar-1.25.tar.xz.sig
|
||||||
/tar-1.26.tar.xz
|
/tar-1.26.tar.xz
|
||||||
/tar-1.26.tar.xz.sig
|
/tar-1.26.tar.xz.sig
|
||||||
|
/tar-1.27.tar.xz
|
||||||
|
/tar-1.27.tar.xz.sig
|
||||||
|
4
sources
4
sources
@ -1,2 +1,2 @@
|
|||||||
0ced6f20b9fa1bea588005b5ad4b52c1 tar-1.26.tar.xz
|
3484fc42b7a82b82f2305b2971aa0e56 tar-1.27.tar.xz
|
||||||
6618d5fe7785e138c27d7d6a24e998b2 tar-1.26.tar.xz.sig
|
402afd4829f508991c7e85b3d9a87077 tar-1.27.tar.xz.sig
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
diff -urNp tar-1.23-orig/src/tar.c tar-1.23/src/tar.c
|
|
||||||
--- tar-1.23-orig/src/tar.c 2010-06-01 13:55:03.792173060 +0200
|
|
||||||
+++ tar-1.23/src/tar.c 2010-06-01 14:01:40.494172986 +0200
|
|
||||||
@@ -1911,6 +1911,10 @@ parse_opt (int key, char *arg, struct ar
|
|
||||||
_("Invalid number")));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+
|
|
||||||
+ case OLD_ARCHIVE_OPTION:
|
|
||||||
+ set_archive_format ("v7");
|
|
||||||
+ break;
|
|
||||||
|
|
||||||
case OVERWRITE_DIR_OPTION:
|
|
||||||
old_files_option = DEFAULT_OLD_FILES;
|
|
@ -1,370 +0,0 @@
|
|||||||
diff --git a/doc/tar.texi b/doc/tar.texi
|
|
||||||
index d70d113..a0e3d5f 100644
|
|
||||||
--- a/doc/tar.texi
|
|
||||||
+++ b/doc/tar.texi
|
|
||||||
@@ -1881,6 +1881,7 @@ The other operations of @command{tar} (@option{--list},
|
|
||||||
@option{--extract}, @option{--compare}, and @option{--update})
|
|
||||||
will act on the entire contents of the archive.
|
|
||||||
|
|
||||||
+@anchor{exit status}
|
|
||||||
@cindex exit status
|
|
||||||
@cindex return status
|
|
||||||
Besides successful exits, @GNUTAR{} may fail for
|
|
||||||
@@ -2815,7 +2816,10 @@ when extracting files from an archive.
|
|
||||||
@item --keep-old-files
|
|
||||||
@itemx -k
|
|
||||||
|
|
||||||
-Do not overwrite existing files when extracting files from an archive.
|
|
||||||
+Do not overwrite existing files when extracting files from an
|
|
||||||
+archive. Return error if such files exist. See also
|
|
||||||
+@ref{--skip-old-files}.
|
|
||||||
+
|
|
||||||
@xref{Keep Old Files}.
|
|
||||||
|
|
||||||
@opsummary{label}
|
|
||||||
@@ -3268,6 +3272,20 @@ the archive creation operations it instructs @command{tar} to list the
|
|
||||||
member names stored in the archive, as opposed to the actual file
|
|
||||||
names. @xref{listing member and file names}.
|
|
||||||
|
|
||||||
+@opsummary{skip-old-files}
|
|
||||||
+@item --skip-old-files
|
|
||||||
+
|
|
||||||
+Do not overwrite existing files when extracting files from an
|
|
||||||
+archive. @xref{Keep Old Files}.
|
|
||||||
+
|
|
||||||
+This option differs from @option{--keep-old-files} in that it does not
|
|
||||||
+treat such files as an error, instead it just silently avoids
|
|
||||||
+overwriting them.
|
|
||||||
+
|
|
||||||
+The @option{--warning=existing-file} option can be used together with
|
|
||||||
+this option to produce warning messages about existing old files
|
|
||||||
+(@pxref{warnings}).
|
|
||||||
+
|
|
||||||
@opsummary{sparse}
|
|
||||||
@item --sparse
|
|
||||||
@itemx -S
|
|
||||||
@@ -4443,11 +4461,11 @@ in the archive; the most recently archived members will be extracted
|
|
||||||
last. Additionally, an extracted member will @emph{replace} a file of
|
|
||||||
the same name which existed in the directory already, and @command{tar}
|
|
||||||
will not prompt you about this@footnote{Unless you give it
|
|
||||||
-@option{--keep-old-files} option, or the disk copy is newer than
|
|
||||||
-the one in the archive and you invoke @command{tar} with
|
|
||||||
-@option{--keep-newer-files} option.}. Thus, only the most recently archived
|
|
||||||
-member will end up being extracted, as it will replace the one
|
|
||||||
-extracted before it, and so on.
|
|
||||||
+@option{--keep-old-files} (or @option{--skip-old-files}) option, or
|
|
||||||
+the disk copy is newer than the one in the archive and you invoke
|
|
||||||
+@command{tar} with @option{--keep-newer-files} option.}. Thus, only
|
|
||||||
+the most recently archived member will end up being extracted, as it
|
|
||||||
+will replace the one extracted before it, and so on.
|
|
||||||
|
|
||||||
@cindex extracting @var{n}th copy of the file
|
|
||||||
@xopindex{occurrence, described}
|
|
||||||
@@ -5123,10 +5141,25 @@ such a directory, use the @option{--no-overwrite-dir} option.
|
|
||||||
@cindex Overwriting old files, prevention
|
|
||||||
@xopindex{keep-old-files, introduced}
|
|
||||||
To be even more cautious and prevent existing files from being replaced, use
|
|
||||||
-the @option{--keep-old-files} (@option{-k}) option. It causes @command{tar} to refuse
|
|
||||||
-to replace or update a file that already exists, i.e., a file with the
|
|
||||||
-same name as an archive member prevents extraction of that archive
|
|
||||||
-member. Instead, it reports an error.
|
|
||||||
+the @option{--keep-old-files} (@option{-k}) option. It causes
|
|
||||||
+@command{tar} to refuse to replace or update a file that already
|
|
||||||
+exists, i.e., a file with the same name as an archive member prevents
|
|
||||||
+extraction of that archive member. Instead, it reports an error. For
|
|
||||||
+example:
|
|
||||||
+
|
|
||||||
+@example
|
|
||||||
+$ @kbd{ls}
|
|
||||||
+blues
|
|
||||||
+$ @kbd{tar -x -k -f archive.tar}
|
|
||||||
+tar: blues: Cannot open: File exists
|
|
||||||
+tar: Exiting with failure status due to previous errors
|
|
||||||
+@end example
|
|
||||||
+
|
|
||||||
+@xopindex{skip-old-files, introduced}
|
|
||||||
+If you wish to preserve old files untouched, but don't want
|
|
||||||
+@command{tar} to treat them as errors, use the
|
|
||||||
+@option{--skip-old-files} option. This option causes @command{tar} to
|
|
||||||
+silently skip extracting over existing files.
|
|
||||||
|
|
||||||
@xopindex{overwrite, introduced}
|
|
||||||
To be more aggressive about altering existing files, use the
|
|
||||||
@@ -5192,16 +5225,24 @@ archive, but remove other files before extracting.
|
|
||||||
@node Keep Old Files
|
|
||||||
@unnumberedsubsubsec Keep Old Files
|
|
||||||
|
|
||||||
+@GNUTAR{} provides two options to control its actions in a situation
|
|
||||||
+when it is about to extract a file which already exists on disk.
|
|
||||||
+
|
|
||||||
@table @option
|
|
||||||
@opindex keep-old-files
|
|
||||||
@item --keep-old-files
|
|
||||||
@itemx -k
|
|
||||||
-Do not replace existing files from archive. The
|
|
||||||
-@option{--keep-old-files} (@option{-k}) option prevents @command{tar}
|
|
||||||
-from replacing existing files with files with the same name from the
|
|
||||||
-archive. The @option{--keep-old-files} option is meaningless with
|
|
||||||
-@option{--list} (@option{-t}). Prevents @command{tar} from replacing
|
|
||||||
-files in the file system during extraction.
|
|
||||||
+Do not replace existing files from archive. When such a file is
|
|
||||||
+encountered, @command{tar} issues an error message. Upon end of
|
|
||||||
+extraction, @command{tar} exits with code 2 (@pxref{exit status}).
|
|
||||||
+
|
|
||||||
+@item --skip-old-files
|
|
||||||
+Do not replace existing files from archive, but do not treat that
|
|
||||||
+as error. Such files are silently skipped and do not affect
|
|
||||||
+@command{tar} exit status.
|
|
||||||
+
|
|
||||||
+Additional verbosity can be obtained using @option{--warning=existing-file}
|
|
||||||
+together with that option (@pxref{warnings}).
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@node Keep Newer Files
|
|
||||||
diff --git a/src/common.h b/src/common.h
|
|
||||||
index 0b9bd7a..2409413 100644
|
|
||||||
--- a/src/common.h
|
|
||||||
+++ b/src/common.h
|
|
||||||
@@ -182,6 +182,7 @@ enum old_files
|
|
||||||
OVERWRITE_OLD_FILES, /* --overwrite */
|
|
||||||
UNLINK_FIRST_OLD_FILES, /* --unlink-first */
|
|
||||||
KEEP_OLD_FILES, /* --keep-old-files */
|
|
||||||
+ SKIP_OLD_FILES, /* --skip-old-files */
|
|
||||||
KEEP_NEWER_FILES /* --keep-newer-files */
|
|
||||||
};
|
|
||||||
GLOBAL enum old_files old_files_option;
|
|
||||||
@@ -807,11 +808,12 @@ void checkpoint_run (bool do_write);
|
|
||||||
#define WARN_UNKNOWN_KEYWORD 0x00020000
|
|
||||||
#define WARN_XDEV 0x00040000
|
|
||||||
#define WARN_DECOMPRESS_PROGRAM 0x00080000
|
|
||||||
+#define WARN_EXISTING_FILE 0x00100000
|
|
||||||
|
|
||||||
/* The warnings composing WARN_VERBOSE_WARNINGS are enabled by default
|
|
||||||
in verbose mode */
|
|
||||||
#define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\
|
|
||||||
- WARN_DECOMPRESS_PROGRAM)
|
|
||||||
+ WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE)
|
|
||||||
#define WARN_ALL (~WARN_VERBOSE_WARNINGS)
|
|
||||||
|
|
||||||
void set_warning_option (const char *arg);
|
|
||||||
diff --git a/src/extract.c b/src/extract.c
|
|
||||||
index aaea56e..662ea0b 100644
|
|
||||||
--- a/src/extract.c
|
|
||||||
+++ b/src/extract.c
|
|
||||||
@@ -639,9 +639,14 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
|
|
||||||
|
|
||||||
switch (old_files_option)
|
|
||||||
{
|
|
||||||
- case KEEP_OLD_FILES:
|
|
||||||
+ case SKIP_OLD_FILES:
|
|
||||||
+ WARNOPT (WARN_EXISTING_FILE,
|
|
||||||
+ (0, 0, _("%s: skipping existing file"), file_name));
|
|
||||||
return RECOVER_SKIP;
|
|
||||||
|
|
||||||
+ case KEEP_OLD_FILES:
|
|
||||||
+ return RECOVER_NO;
|
|
||||||
+
|
|
||||||
case KEEP_NEWER_FILES:
|
|
||||||
if (file_newer_p (file_name, stp, ¤t_stat_info))
|
|
||||||
break;
|
|
||||||
diff --git a/src/tar.c b/src/tar.c
|
|
||||||
index 7b62996..7a673e0 100644
|
|
||||||
--- a/src/tar.c
|
|
||||||
+++ b/src/tar.c
|
|
||||||
@@ -328,6 +328,7 @@ enum
|
|
||||||
SHOW_DEFAULTS_OPTION,
|
|
||||||
SHOW_OMITTED_DIRS_OPTION,
|
|
||||||
SHOW_TRANSFORMED_NAMES_OPTION,
|
|
||||||
+ SKIP_OLD_FILES_OPTION,
|
|
||||||
SPARSE_VERSION_OPTION,
|
|
||||||
STRIP_COMPONENTS_OPTION,
|
|
||||||
SUFFIX_OPTION,
|
|
||||||
@@ -452,7 +453,11 @@ static struct argp_option options[] = {
|
|
||||||
{"remove-files", REMOVE_FILES_OPTION, 0, 0,
|
|
||||||
N_("remove files after adding them to the archive"), GRID+1 },
|
|
||||||
{"keep-old-files", 'k', 0, 0,
|
|
||||||
- N_("don't replace existing files when extracting"), GRID+1 },
|
|
||||||
+ N_("don't replace existing files when extracting, "
|
|
||||||
+ "treat them as errors"), GRID+1 },
|
|
||||||
+ {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0,
|
|
||||||
+ N_("don't replace existing files when extracting, silently skip over them"),
|
|
||||||
+ GRID+1 },
|
|
||||||
{"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
|
|
||||||
N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
|
|
||||||
{"overwrite", OVERWRITE_OPTION, 0, 0,
|
|
||||||
@@ -1618,6 +1623,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
|
|
||||||
sparse_option = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case SKIP_OLD_FILES_OPTION:
|
|
||||||
+ old_files_option = SKIP_OLD_FILES;
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case SPARSE_VERSION_OPTION:
|
|
||||||
sparse_option = true;
|
|
||||||
{
|
|
||||||
diff --git a/src/warning.c b/src/warning.c
|
|
||||||
index 5d1bcab..ee9d684 100644
|
|
||||||
--- a/src/warning.c
|
|
||||||
+++ b/src/warning.c
|
|
||||||
@@ -42,6 +42,7 @@ static char const *const warning_args[] = {
|
|
||||||
"unknown-keyword",
|
|
||||||
"xdev",
|
|
||||||
"decompress-program",
|
|
||||||
+ "existing-file",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -66,7 +67,8 @@ static int warning_types[] = {
|
|
||||||
WARN_UNKNOWN_CAST,
|
|
||||||
WARN_UNKNOWN_KEYWORD,
|
|
||||||
WARN_XDEV,
|
|
||||||
- WARN_DECOMPRESS_PROGRAM
|
|
||||||
+ WARN_DECOMPRESS_PROGRAM,
|
|
||||||
+ WARN_EXISTING_FILE,
|
|
||||||
};
|
|
||||||
|
|
||||||
ARGMATCH_VERIFY (warning_args, warning_types);
|
|
||||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
||||||
index 119f1f3..3d78ea2 100644
|
|
||||||
--- a/tests/Makefile.am
|
|
||||||
+++ b/tests/Makefile.am
|
|
||||||
@@ -77,6 +77,8 @@ TESTSUITE_AT = \
|
|
||||||
extrac07.at\
|
|
||||||
extrac08.at\
|
|
||||||
extrac09.at\
|
|
||||||
+ extrac18.at\
|
|
||||||
+ extrac19.at\
|
|
||||||
extrac10.at\
|
|
||||||
extrac11.at\
|
|
||||||
extrac12.at\
|
|
||||||
diff --git a/tests/extrac18.at b/tests/extrac18.at
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..8b42ef7
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/extrac18.at
|
|
||||||
@@ -0,0 +1,60 @@
|
|
||||||
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
||||||
+#
|
|
||||||
+# Test suite for GNU tar.
|
|
||||||
+# Copyright (C) 2011 Free Software Foundation, Inc.
|
|
||||||
+#
|
|
||||||
+# 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 3, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+# Description: Check the functionality of the --keep-old-files option.
|
|
||||||
+# It should report an error and cause tar to exit with status 2.
|
|
||||||
+#
|
|
||||||
+# There was a regression in versions 1.23 to 1.26 inclusive, where
|
|
||||||
+# this option silently skipped such files.
|
|
||||||
+# Reported by: Doug McLaren <dougmc@frenzied.us>,
|
|
||||||
+# Gary Partis <gary@partis.co.uk>,
|
|
||||||
+# Jim Meyering <jim@meyering.net>
|
|
||||||
+#
|
|
||||||
+# References: <20111117045433.GA8245@algol.frenzied.us>,
|
|
||||||
+# <4F3D824717847C4487F77228F83329A3514CBB@server.Partis.local>,
|
|
||||||
+# <87wrar6zzz.fsf@rho.meyering.net>
|
|
||||||
+
|
|
||||||
+AT_SETUP([keep-old-files])
|
|
||||||
+AT_KEYWORDS([extract extrac18 old-files keep-old-files])
|
|
||||||
+
|
|
||||||
+AT_TAR_CHECK([
|
|
||||||
+mkdir dir
|
|
||||||
+cd dir
|
|
||||||
+echo 'Old file a' > a
|
|
||||||
+echo 'Old file b' > b
|
|
||||||
+
|
|
||||||
+tar cf ../archive .
|
|
||||||
+
|
|
||||||
+rm b
|
|
||||||
+echo 'File a' > a
|
|
||||||
+
|
|
||||||
+tar -x -k -f ../archive
|
|
||||||
+echo status=$?
|
|
||||||
+
|
|
||||||
+cat a
|
|
||||||
+],
|
|
||||||
+[0],
|
|
||||||
+[status=2
|
|
||||||
+File a
|
|
||||||
+],
|
|
||||||
+[tar: ./a: Cannot open: File exists
|
|
||||||
+tar: Exiting with failure status due to previous errors
|
|
||||||
+])
|
|
||||||
+
|
|
||||||
+AT_CLEANUP
|
|
||||||
+
|
|
||||||
diff --git a/tests/extrac19.at b/tests/extrac19.at
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..43c4c50
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/extrac19.at
|
|
||||||
@@ -0,0 +1,44 @@
|
|
||||||
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
||||||
+#
|
|
||||||
+# Test suite for GNU tar.
|
|
||||||
+# Copyright (C) 2011 Free Software Foundation, Inc.
|
|
||||||
+#
|
|
||||||
+# 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 3, 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+AT_SETUP([skip-old-files])
|
|
||||||
+AT_KEYWORDS([extract extrac19 old-files skip-old-files])
|
|
||||||
+
|
|
||||||
+AT_TAR_CHECK([
|
|
||||||
+mkdir dir
|
|
||||||
+cd dir
|
|
||||||
+echo 'Old file a' > a
|
|
||||||
+echo 'Old file b' > b
|
|
||||||
+
|
|
||||||
+tar cf ../archive .
|
|
||||||
+
|
|
||||||
+rm b
|
|
||||||
+echo 'File a' > a
|
|
||||||
+
|
|
||||||
+tar -x --skip-old-files -f ../archive
|
|
||||||
+echo status=$?
|
|
||||||
+
|
|
||||||
+cat a
|
|
||||||
+],
|
|
||||||
+[0],
|
|
||||||
+[status=0
|
|
||||||
+File a
|
|
||||||
+])
|
|
||||||
+
|
|
||||||
+AT_CLEANUP
|
|
||||||
+
|
|
||||||
diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|
||||||
index d1dab36..e43653e 100644
|
|
||||||
--- a/tests/testsuite.at
|
|
||||||
+++ b/tests/testsuite.at
|
|
||||||
@@ -166,6 +166,9 @@ m4_include([extrac15.at])
|
|
||||||
m4_include([extrac16.at])
|
|
||||||
m4_include([extrac17.at])
|
|
||||||
|
|
||||||
+m4_include([extrac18.at])
|
|
||||||
+m4_include([extrac19.at])
|
|
||||||
+
|
|
||||||
m4_include([label01.at])
|
|
||||||
m4_include([label02.at])
|
|
||||||
m4_include([label03.at])
|
|
@ -1,27 +0,0 @@
|
|||||||
diff --git a/src/extract.c b/src/extract.c
|
|
||||||
index 87b383a..340beea 100644
|
|
||||||
--- a/src/extract.c
|
|
||||||
+++ b/src/extract.c
|
|
||||||
@@ -1415,6 +1415,13 @@ extract_failure (char *file_name, int typeflag)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+extract_skip (char *file_name, int typeflag)
|
|
||||||
+{
|
|
||||||
+ skip_member ();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
typedef int (*tar_extractor_t) (char *file_name, int typeflag);
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1495,7 +1502,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
|
|
||||||
ERROR ((0, 0,
|
|
||||||
_("%s: Cannot extract -- file is continued from another volume"),
|
|
||||||
quotearg_colon (current_stat_info.file_name)));
|
|
||||||
- *fun = extract_failure;
|
|
||||||
+ *fun = extract_skip;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GNUTYPE_LONGNAME:
|
|
@ -2,16 +2,6 @@ diff --git a/doc/tar.texi b/doc/tar.texi
|
|||||||
index d678db9..ab8a0c8 100644
|
index d678db9..ab8a0c8 100644
|
||||||
--- a/doc/tar.texi
|
--- a/doc/tar.texi
|
||||||
+++ b/doc/tar.texi
|
+++ b/doc/tar.texi
|
||||||
@@ -37,7 +37,8 @@ This manual is for @acronym{GNU} @command{tar} (version
|
|
||||||
from archives.
|
|
||||||
|
|
||||||
Copyright @copyright{} 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
|
|
||||||
-2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
|
|
||||||
+2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software
|
|
||||||
+Foundation, Inc.
|
|
||||||
|
|
||||||
@quotation
|
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
|
||||||
@@ -162,6 +163,7 @@ How to Create Archives
|
@@ -162,6 +163,7 @@ How to Create Archives
|
||||||
How to List Archives
|
How to List Archives
|
||||||
|
|
||||||
@ -146,8 +136,8 @@ index d678db9..ab8a0c8 100644
|
|||||||
@section How to Extract Members from an Archive
|
@section How to Extract Members from an Archive
|
||||||
@cindex Extraction
|
@cindex Extraction
|
||||||
@@ -2371,6 +2484,10 @@ Normally when creating an archive, @command{tar} strips an initial
|
@@ -2371,6 +2484,10 @@ Normally when creating an archive, @command{tar} strips an initial
|
||||||
@samp{/} from member names. This option disables that behavior.
|
treats names specially if they have initial @samp{/} or internal
|
||||||
@xref{absolute}.
|
@samp{..}. This option disables that behavior. @xref{absolute}.
|
||||||
|
|
||||||
+@opsummary{acls}
|
+@opsummary{acls}
|
||||||
+@item --acls
|
+@item --acls
|
||||||
@ -214,9 +204,9 @@ index d678db9..ab8a0c8 100644
|
|||||||
@item --wildcards
|
@item --wildcards
|
||||||
Use wildcards when matching member names with patterns.
|
Use wildcards when matching member names with patterns.
|
||||||
@@ -4218,6 +4359,11 @@ tar (child): trying gzip
|
@@ -4218,6 +4359,11 @@ tar (child): trying gzip
|
||||||
This means that @command{tar} first tried to decompress
|
@cindex @samp{Record size = %lu blocks}, warning message
|
||||||
@file{archive.Z} using @command{compress}, and, when that
|
@item record-size
|
||||||
failed, switched to @command{gzip}.
|
@samp{Record size = %lu blocks}
|
||||||
+@kwindex xattr-write
|
+@kwindex xattr-write
|
||||||
+@item xattr-write
|
+@item xattr-write
|
||||||
+@samp{%s: Cannot set '%s' extended attribute for file '%s'}
|
+@samp{%s: Cannot set '%s' extended attribute for file '%s'}
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
diff --git a/gnu/stat-time.h b/gnu/stat-time.h
|
|
||||||
index 1dc4098..7b8428e 100644
|
|
||||||
--- a/gnu/stat-time.h
|
|
||||||
+++ b/gnu/stat-time.h
|
|
||||||
@@ -144,7 +144,7 @@ get_stat_mtime (struct stat const *st)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return *ST's birth time, if available; otherwise return a value
|
|
||||||
- with negative tv_nsec. */
|
|
||||||
+ with tv_sec and tv_nsec both equal to -1. */
|
|
||||||
static inline struct timespec
|
|
||||||
get_stat_birthtime (struct stat const *st)
|
|
||||||
{
|
|
||||||
@@ -163,7 +163,7 @@ get_stat_birthtime (struct stat const *st)
|
|
||||||
t.tv_sec = st->st_ctime;
|
|
||||||
t.tv_nsec = 0;
|
|
||||||
#else
|
|
||||||
- /* Birth time is not supported. Set tv_sec to avoid undefined behavior. */
|
|
||||||
+ /* Birth time is not supported. */
|
|
||||||
t.tv_sec = -1;
|
|
||||||
t.tv_nsec = -1;
|
|
||||||
/* Avoid a "parameter unused" warning. */
|
|
||||||
@@ -177,10 +177,12 @@ get_stat_birthtime (struct stat const *st)
|
|
||||||
using zero. Attempt to work around this problem. Alas, this can
|
|
||||||
report failure even for valid time stamps. Also, NetBSD
|
|
||||||
sometimes returns junk in the birth time fields; work around this
|
|
||||||
- bug if it it is detected. There's no need to detect negative
|
|
||||||
- tv_nsec junk as negative tv_nsec already indicates an error. */
|
|
||||||
- if (t.tv_sec == 0 || 1000000000 <= t.tv_nsec)
|
|
||||||
- t.tv_nsec = -1;
|
|
||||||
+ bug if it is detected. */
|
|
||||||
+ if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
|
|
||||||
+ {
|
|
||||||
+ t.tv_sec = -1;
|
|
||||||
+ t.tv_nsec = -1;
|
|
||||||
+ }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return t;
|
|
||||||
diff --git a/src/extract.c b/src/extract.c
|
|
||||||
index 340beea..3afb95d 100644
|
|
||||||
--- a/src/extract.c
|
|
||||||
+++ b/src/extract.c
|
|
||||||
@@ -119,12 +119,15 @@ struct delayed_link
|
|
||||||
/* The next delayed link in the list. */
|
|
||||||
struct delayed_link *next;
|
|
||||||
|
|
||||||
- /* The device, inode number and ctime of the placeholder. Use
|
|
||||||
- ctime, not mtime, to make false matches less likely if some
|
|
||||||
- other process removes the placeholder. */
|
|
||||||
+ /* The device, inode number and birthtime of the placeholder.
|
|
||||||
+ birthtime.tv_nsec is negative if the birthtime is not available.
|
|
||||||
+ Don't use mtime as this would allow for false matches if some
|
|
||||||
+ other process removes the placeholder. Don't use ctime as
|
|
||||||
+ this would cause race conditions and other screwups, e.g.,
|
|
||||||
+ when restoring hard-linked symlinks. */
|
|
||||||
dev_t dev;
|
|
||||||
ino_t ino;
|
|
||||||
- struct timespec ctime;
|
|
||||||
+ struct timespec birthtime;
|
|
||||||
|
|
||||||
/* True if the link is symbolic. */
|
|
||||||
bool is_symlink;
|
|
||||||
@@ -1200,7 +1203,7 @@ create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
|
|
||||||
delayed_link_head = p;
|
|
||||||
p->dev = st.st_dev;
|
|
||||||
p->ino = st.st_ino;
|
|
||||||
- p->ctime = get_stat_ctime (&st);
|
|
||||||
+ p->birthtime = get_stat_birthtime (&st);
|
|
||||||
p->is_symlink = is_symlink;
|
|
||||||
if (is_symlink)
|
|
||||||
{
|
|
||||||
@@ -1265,7 +1268,8 @@ extract_link (char *file_name, int typeflag)
|
|
||||||
if (ds->change_dir == chdir_current
|
|
||||||
&& ds->dev == st1.st_dev
|
|
||||||
&& ds->ino == st1.st_ino
|
|
||||||
- && timespec_cmp (ds->ctime, get_stat_ctime (&st1)) == 0)
|
|
||||||
+ && (timespec_cmp (ds->birthtime, get_stat_birthtime (&st1))
|
|
||||||
+ == 0))
|
|
||||||
{
|
|
||||||
struct string_list *p = xmalloc (offsetof (struct string_list, string)
|
|
||||||
+ strlen (file_name) + 1);
|
|
||||||
@@ -1638,7 +1642,7 @@ apply_delayed_links (void)
|
|
||||||
if (fstatat (chdir_fd, source, &st, AT_SYMLINK_NOFOLLOW) == 0
|
|
||||||
&& st.st_dev == ds->dev
|
|
||||||
&& st.st_ino == ds->ino
|
|
||||||
- && timespec_cmp (get_stat_ctime (&st), ds->ctime) == 0)
|
|
||||||
+ && timespec_cmp (get_stat_birthtime (&st), ds->birthtime) == 0)
|
|
||||||
{
|
|
||||||
/* Unlink the placeholder, then create a hard link if possible,
|
|
||||||
a symbolic link otherwise. */
|
|
@ -1,66 +0,0 @@
|
|||||||
diff --git a/NEWS b/NEWS
|
|
||||||
index 8aeae33..8f3c416 100644
|
|
||||||
--- a/NEWS
|
|
||||||
+++ b/NEWS
|
|
||||||
@@ -1,10 +1,15 @@
|
|
||||||
GNU tar NEWS - User visible changes. 2012-11-19
|
|
||||||
Please send GNU tar bug reports to <bug-tar@gnu.org>
|
|
||||||
|
|
||||||
+** Sparse files with large data
|
|
||||||
+
|
|
||||||
+When creating a PAX-format archive, tar no longer arbitrarily restricts
|
|
||||||
+the size of the representation of a sparse file to be less than 8 GiB.
|
|
||||||
+
|
|
||||||
|
|
||||||
version 1.26 - Sergey Poznyakoff, 2011-03-12
|
|
||||||
|
|
||||||
-* Bugfixes
|
|
||||||
+* Bug fixes
|
|
||||||
|
|
||||||
** Fix the --verify option, which broke in version 1.24.
|
|
||||||
|
|
||||||
diff --git a/src/sparse.c b/src/sparse.c
|
|
||||||
index 4b2f982..cfd0c66 100644
|
|
||||||
--- a/src/sparse.c
|
|
||||||
+++ b/src/sparse.c
|
|
||||||
@@ -919,6 +919,18 @@ pax_sparse_member_p (struct tar_sparse_file *file)
|
|
||||||
|| file->stat_info->sparse_major > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Start a header that uses the effective (shrunken) file size. */
|
|
||||||
+static union block *
|
|
||||||
+pax_start_header (struct tar_stat_info *st)
|
|
||||||
+{
|
|
||||||
+ off_t realsize = st->stat.st_size;
|
|
||||||
+ union block *blk;
|
|
||||||
+ st->stat.st_size = st->archive_file_size;
|
|
||||||
+ blk = start_header (st);
|
|
||||||
+ st->stat.st_size = realsize;
|
|
||||||
+ return blk;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static bool
|
|
||||||
pax_dump_header_0 (struct tar_sparse_file *file)
|
|
||||||
{
|
|
||||||
@@ -968,9 +980,7 @@ pax_dump_header_0 (struct tar_sparse_file *file)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- blk = start_header (file->stat_info);
|
|
||||||
- /* Store the effective (shrunken) file size */
|
|
||||||
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
|
|
||||||
+ blk = pax_start_header (file->stat_info);
|
|
||||||
finish_header (file->stat_info, blk, block_ordinal);
|
|
||||||
if (save_file_name)
|
|
||||||
{
|
|
||||||
@@ -1035,9 +1045,7 @@ pax_dump_header_1 (struct tar_sparse_file *file)
|
|
||||||
if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE)
|
|
||||||
file->stat_info->file_name[NAME_FIELD_SIZE] = 0;
|
|
||||||
|
|
||||||
- blk = start_header (file->stat_info);
|
|
||||||
- /* Store the effective (shrunken) file size */
|
|
||||||
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
|
|
||||||
+ blk = pax_start_header (file->stat_info);
|
|
||||||
finish_header (file->stat_info, blk, block_ordinal);
|
|
||||||
free (file->stat_info->file_name);
|
|
||||||
file->stat_info->file_name = save_file_name;
|
|
@ -1,15 +0,0 @@
|
|||||||
diff --git a/src/create.c b/src/create.c
|
|
||||||
index 25387a9..9a7a05a 100644
|
|
||||||
--- a/src/create.c
|
|
||||||
+++ b/src/create.c
|
|
||||||
@@ -514,8 +514,8 @@ start_private_header (const char *name, size_t size, time_t t)
|
|
||||||
|
|
||||||
TIME_TO_CHARS (t, header->header.mtime);
|
|
||||||
MODE_TO_CHARS (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, header->header.mode);
|
|
||||||
- UID_TO_CHARS (getuid (), header->header.uid);
|
|
||||||
- GID_TO_CHARS (getgid (), header->header.gid);
|
|
||||||
+ UID_TO_CHARS (0, header->header.uid);
|
|
||||||
+ GID_TO_CHARS (0, header->header.gid);
|
|
||||||
MAJOR_TO_CHARS (0, header->header.devmajor);
|
|
||||||
MINOR_TO_CHARS (0, header->header.devminor);
|
|
||||||
strncpy (header->header.magic, TMAGIC, TMAGLEN);
|
|
File diff suppressed because it is too large
Load Diff
@ -1,230 +0,0 @@
|
|||||||
diff --git a/lib/rmt.h b/lib/rmt.h
|
|
||||||
index 2ce9dc5..4580e49 100644
|
|
||||||
--- a/lib/rmt.h
|
|
||||||
+++ b/lib/rmt.h
|
|
||||||
@@ -17,8 +17,9 @@
|
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
-extern char *rmt_command;
|
|
||||||
-extern char *rmt_dev_name__;
|
|
||||||
+/* upstream fix 0b3d84a0ee */
|
|
||||||
+extern char const *rmt_command;
|
|
||||||
+extern char const *rmt_dev_name__;
|
|
||||||
|
|
||||||
int rmt_open__ (const char *, int, int, const char *);
|
|
||||||
int rmt_close__ (int);
|
|
||||||
diff --git a/lib/rtapelib.c b/lib/rtapelib.c
|
|
||||||
index 3aee428..1cef0fc 100644
|
|
||||||
--- a/lib/rtapelib.c
|
|
||||||
+++ b/lib/rtapelib.c
|
|
||||||
@@ -90,10 +90,10 @@ static int from_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
|
|
||||||
/* The pipes for sending data to remote tape drives. */
|
|
||||||
static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
|
|
||||||
|
|
||||||
-char *rmt_command = DEFAULT_RMT_COMMAND;
|
|
||||||
+char const *rmt_command = DEFAULT_RMT_COMMAND; /* upstream fix 0b3d84a0ee */
|
|
||||||
|
|
||||||
/* Temporary variable used by macros in rmt.h. */
|
|
||||||
-char *rmt_dev_name__;
|
|
||||||
+char const *rmt_dev_name__; /* upstream fix 0b3d84a0ee */
|
|
||||||
|
|
||||||
/* If true, always consider file names to be local, even if they contain
|
|
||||||
colons */
|
|
||||||
@@ -490,15 +490,17 @@ rmt_open__ (const char *file_name, int open_mode, int bias,
|
|
||||||
{
|
|
||||||
/* Child. */
|
|
||||||
|
|
||||||
- close (STDIN_FILENO);
|
|
||||||
- dup (to_remote[remote_pipe_number][PREAD]);
|
|
||||||
- close (to_remote[remote_pipe_number][PREAD]);
|
|
||||||
- close (to_remote[remote_pipe_number][PWRITE]);
|
|
||||||
-
|
|
||||||
- close (STDOUT_FILENO);
|
|
||||||
- dup (from_remote[remote_pipe_number][PWRITE]);
|
|
||||||
- close (from_remote[remote_pipe_number][PREAD]);
|
|
||||||
- close (from_remote[remote_pipe_number][PWRITE]);
|
|
||||||
+ /* upstream fix 0b3d84a0ee */
|
|
||||||
+ if (dup2 (to_remote[remote_pipe_number][PREAD], STDIN_FILENO) < 0
|
|
||||||
+ || (to_remote[remote_pipe_number][PREAD] != STDIN_FILENO
|
|
||||||
+ && close (to_remote[remote_pipe_number][PREAD]) != 0)
|
|
||||||
+ || (to_remote[remote_pipe_number][PWRITE] != STDIN_FILENO
|
|
||||||
+ && close (to_remote[remote_pipe_number][PWRITE]) != 0)
|
|
||||||
+ || dup2 (from_remote[remote_pipe_number][PWRITE], STDOUT_FILENO) < 0
|
|
||||||
+ || close (from_remote[remote_pipe_number][PREAD]) != 0
|
|
||||||
+ || close (from_remote[remote_pipe_number][PWRITE]) != 0)
|
|
||||||
+ error (EXIT_ON_EXEC_ERROR, errno,
|
|
||||||
+ _("Cannot redirect files for remote shell"));
|
|
||||||
|
|
||||||
sys_reset_uid_gid ();
|
|
||||||
|
|
||||||
diff --git a/lib/system.h b/lib/system.h
|
|
||||||
index 2deb585..599d4ba 100644
|
|
||||||
--- a/lib/system.h
|
|
||||||
+++ b/lib/system.h
|
|
||||||
@@ -471,8 +471,13 @@ char *getenv ();
|
|
||||||
# define SET_BINARY_MODE(arc)
|
|
||||||
# define ERRNO_IS_EACCES 0
|
|
||||||
# define TTY_NAME "/dev/tty"
|
|
||||||
-# define sys_reset_uid_gid() \
|
|
||||||
- do { setuid (getuid ()); setgid (getgid ()); } while (0)
|
|
||||||
+
|
|
||||||
+/* upstream fix 0b3d84a0ee */
|
|
||||||
+# define sys_reset_uid_gid() \
|
|
||||||
+ do { \
|
|
||||||
+ if (! (setuid (getuid ()) == 0 && setgid (getgid ()) == 0)) \
|
|
||||||
+ abort (); \
|
|
||||||
+ } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if XENIX
|
|
||||||
diff --git a/lib/wordsplit.c b/lib/wordsplit.c
|
|
||||||
index bd5d59d..5f555ea 100644
|
|
||||||
--- a/lib/wordsplit.c
|
|
||||||
+++ b/lib/wordsplit.c
|
|
||||||
@@ -796,6 +796,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
|
||||||
value = "";
|
|
||||||
}
|
|
||||||
/* FIXME: handle defstr */
|
|
||||||
+ (void) defstr; /* upstream commit 17f99bc6f1 */
|
|
||||||
+
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
if (flg & _WSNF_QUOTE)
|
|
||||||
diff --git a/src/compare.c b/src/compare.c
|
|
||||||
index 273269a..796d7aa 100644
|
|
||||||
--- a/src/compare.c
|
|
||||||
+++ b/src/compare.c
|
|
||||||
@@ -362,7 +362,7 @@ static void
|
|
||||||
diff_dumpdir (void)
|
|
||||||
{
|
|
||||||
const char *dumpdir_buffer;
|
|
||||||
- dev_t dev = 0;
|
|
||||||
+ /* upstream fix 5bb04335079 */
|
|
||||||
struct stat stat_data;
|
|
||||||
|
|
||||||
if (deref_stat (current_stat_info.file_name, &stat_data) != 0)
|
|
||||||
@@ -372,8 +372,7 @@ diff_dumpdir (void)
|
|
||||||
else
|
|
||||||
stat_error (current_stat_info.file_name);
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
- dev = stat_data.st_dev;
|
|
||||||
+ /* upstream fix 5bb04335079 */
|
|
||||||
|
|
||||||
dumpdir_buffer = directory_contents (scan_directory (¤t_stat_info));
|
|
||||||
|
|
||||||
diff --git a/src/system.c b/src/system.c
|
|
||||||
index a27a7de..2049240 100644
|
|
||||||
--- a/src/system.c
|
|
||||||
+++ b/src/system.c
|
|
||||||
@@ -25,7 +25,7 @@
|
|
||||||
#include <signal.h>
|
|
||||||
#include <wordsplit.h>
|
|
||||||
|
|
||||||
-static void
|
|
||||||
+static void __attribute__ ((__noreturn__)) /* upstream (similar) fix in 17f99bc6f1405 */
|
|
||||||
xexec (const char *cmd)
|
|
||||||
{
|
|
||||||
struct wordsplit ws;
|
|
||||||
@@ -745,8 +745,7 @@ int
|
|
||||||
sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
|
|
||||||
{
|
|
||||||
int p[2];
|
|
||||||
- char *argv[4];
|
|
||||||
-
|
|
||||||
+
|
|
||||||
xpipe (p);
|
|
||||||
pipe_handler = signal (SIGPIPE, SIG_IGN);
|
|
||||||
global_pid = xfork ();
|
|
||||||
@@ -806,7 +805,6 @@ int
|
|
||||||
sys_exec_info_script (const char **archive_name, int volume_number)
|
|
||||||
{
|
|
||||||
pid_t pid;
|
|
||||||
- char *argv[4];
|
|
||||||
char uintbuf[UINTMAX_STRSIZE_BOUND];
|
|
||||||
int p[2];
|
|
||||||
static RETSIGTYPE (*saved_handler) (int sig);
|
|
||||||
@@ -881,7 +879,7 @@ sys_exec_checkpoint_script (const char *script_name,
|
|
||||||
int checkpoint_number)
|
|
||||||
{
|
|
||||||
pid_t pid;
|
|
||||||
- char *argv[4];
|
|
||||||
+ /* upstream commit 17f99bc6f */
|
|
||||||
char uintbuf[UINTMAX_STRSIZE_BOUND];
|
|
||||||
|
|
||||||
pid = xfork ();
|
|
||||||
@@ -912,10 +910,7 @@ sys_exec_checkpoint_script (const char *script_name,
|
|
||||||
setenv ("TAR_FORMAT",
|
|
||||||
archive_format_string (current_format == DEFAULT_FORMAT ?
|
|
||||||
archive_format : current_format), 1);
|
|
||||||
- argv[0] = "/bin/sh";
|
|
||||||
- argv[1] = "-c";
|
|
||||||
- argv[2] = (char *) script_name;
|
|
||||||
- argv[3] = NULL;
|
|
||||||
+ /* upstream commit 17f99bc6f */
|
|
||||||
|
|
||||||
priv_set_restore_linkdir ();
|
|
||||||
xexec (script_name);
|
|
||||||
diff --git a/src/update.c b/src/update.c
|
|
||||||
index 4739e0d..3b28734 100644
|
|
||||||
--- a/src/update.c
|
|
||||||
+++ b/src/update.c
|
|
||||||
@@ -145,7 +145,7 @@ update_archive (void)
|
|
||||||
if (S_ISDIR (s.st_mode))
|
|
||||||
{
|
|
||||||
char *p, *dirp;
|
|
||||||
- DIR *stream;
|
|
||||||
+ DIR *stream = NULL; /* upstream commit 5bb043350790 */
|
|
||||||
int fd = openat (chdir_fd, name->name,
|
|
||||||
open_read_flags | O_DIRECTORY);
|
|
||||||
if (fd < 0)
|
|
||||||
diff --git a/tests/genfile.c b/tests/genfile.c
|
|
||||||
index 8541be6..fa480ef 100644
|
|
||||||
--- a/tests/genfile.c
|
|
||||||
+++ b/tests/genfile.c
|
|
||||||
@@ -485,9 +485,11 @@ generate_files_from_list ()
|
|
||||||
static void
|
|
||||||
mkhole (int fd, off_t displ)
|
|
||||||
{
|
|
||||||
- if (lseek (fd, displ, SEEK_CUR) == -1)
|
|
||||||
+ off_t offset = lseek (fd, displ, SEEK_CUR);
|
|
||||||
+ if (offset < 0)
|
|
||||||
error (EXIT_FAILURE, errno, "lseek");
|
|
||||||
- ftruncate (fd, lseek (fd, 0, SEEK_CUR));
|
|
||||||
+ if (ftruncate (fd, offset) != 0)
|
|
||||||
+ error (EXIT_FAILURE, errno, "ftruncate");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -685,13 +687,18 @@ exec_checkpoint (struct action *p)
|
|
||||||
error (0, errno, _("cannot open `%s'"), p->name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
- ftruncate (fd, p->size);
|
|
||||||
+ if (ftruncate (fd, p->size) != 0)
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("cannot truncate `%s'"), p->name);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_EXEC:
|
|
||||||
- system (p->name);
|
|
||||||
+ if (system (p->name) != 0)
|
|
||||||
+ error (0, 0, _("command failed: %s"), p->name);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_UNLINK:
|
|
||||||
@@ -761,7 +768,8 @@ exec_command (void)
|
|
||||||
signal (SIGCHLD, SIG_DFL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- pipe (fd);
|
|
||||||
+ if (pipe (fd) != 0)
|
|
||||||
+ error (EXIT_FAILURE, errno, "pipe");
|
|
||||||
|
|
||||||
pid = fork ();
|
|
||||||
if (pid == -1)
|
|
@ -1,14 +0,0 @@
|
|||||||
diff --git a/gnu/stdio.in.h b/gnu/stdio.in.h
|
|
||||||
index 465a9c9..b703457 100644
|
|
||||||
--- a/gnu/stdio.in.h
|
|
||||||
+++ b/gnu/stdio.in.h
|
|
||||||
@@ -164,7 +164,9 @@ _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
|
|
||||||
so any use of gets warrants an unconditional warning. Assume it is
|
|
||||||
always declared, since it is required by C89. */
|
|
||||||
#undef gets
|
|
||||||
+#if HAVE_RAW_DECL_GETS
|
|
||||||
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#if @GNULIB_FOPEN@
|
|
||||||
# if @REPLACE_FOPEN@
|
|
@ -7,9 +7,9 @@ Previously, tar did not update archive with newly created files in archived
|
|||||||
directory -- it failed instead with "file not found" error (because it looked
|
directory -- it failed instead with "file not found" error (because it looked
|
||||||
in bad directory in filesystem).
|
in bad directory in filesystem).
|
||||||
---
|
---
|
||||||
src/update.c | 4 +-
|
src/update.c | 2 +-
|
||||||
tests/Makefile.am | 3 +-
|
tests/Makefile.am | 1 +-
|
||||||
tests/testsuite.at | 3 +-
|
tests/testsuite.at | 1 +-
|
||||||
tests/update03.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
tests/update03.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
4 files changed, 65 insertions(+), 4 deletions(-)
|
4 files changed, 65 insertions(+), 4 deletions(-)
|
||||||
create mode 100644 tests/update03.at
|
create mode 100644 tests/update03.at
|
||||||
@ -18,15 +18,6 @@ diff --git a/src/update.c b/src/update.c
|
|||||||
index e3228d4..4739e0d 100644
|
index e3228d4..4739e0d 100644
|
||||||
--- a/src/update.c
|
--- a/src/update.c
|
||||||
+++ b/src/update.c
|
+++ b/src/update.c
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
/* Update a tar archive.
|
|
||||||
|
|
||||||
Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
|
|
||||||
- 2004, 2005, 2007, 2010 Free Software Foundation, Inc.
|
|
||||||
+ 2004, 2005, 2007, 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -159,7 +159,7 @@ update_archive (void)
|
@@ -159,7 +159,7 @@ update_archive (void)
|
||||||
|
|
||||||
for (p = dirp; *p; p += strlen (p) + 1)
|
for (p = dirp; *p; p += strlen (p) + 1)
|
||||||
@ -40,15 +31,6 @@ diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|||||||
index ab7d104..119f1f3 100644
|
index ab7d104..119f1f3 100644
|
||||||
--- a/tests/Makefile.am
|
--- a/tests/Makefile.am
|
||||||
+++ b/tests/Makefile.am
|
+++ b/tests/Makefile.am
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
# Makefile for GNU tar regression tests.
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2003, 2004, 2005,
|
|
||||||
-# 2006, 2007, 2009 Free Software Foundation, Inc.
|
|
||||||
+# 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# François Pinard <pinard@iro.umontreal.ca>, 1988.
|
|
||||||
# Sergey Poznyakoff <gray@mirddin.farlep.net>, 2004.
|
|
||||||
@@ -156,6 +156,7 @@ TESTSUITE_AT = \
|
@@ -156,6 +156,7 @@ TESTSUITE_AT = \
|
||||||
update.at\
|
update.at\
|
||||||
update01.at\
|
update01.at\
|
||||||
@ -61,23 +43,14 @@ diff --git a/tests/testsuite.at b/tests/testsuite.at
|
|||||||
index 8366ef0..13f7506 100644
|
index 8366ef0..13f7506 100644
|
||||||
--- a/tests/testsuite.at
|
--- a/tests/testsuite.at
|
||||||
+++ b/tests/testsuite.at
|
+++ b/tests/testsuite.at
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
|
||||||
|
|
||||||
# Test suite for GNU tar.
|
|
||||||
-# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Free Software
|
|
||||||
+# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2012 Free Software
|
|
||||||
# Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
@@ -241,6 +241,7 @@ m4_include([spmvp10.at])
|
@@ -241,6 +241,7 @@ m4_include([spmvp10.at])
|
||||||
m4_include([update.at])
|
m4_include([update.at])
|
||||||
m4_include([update01.at])
|
m4_include([update01.at])
|
||||||
m4_include([update02.at])
|
m4_include([update02.at])
|
||||||
+m4_include([update03.at])
|
+m4_include([update03.at])
|
||||||
|
|
||||||
|
AT_BANNER([Verifying the archive])
|
||||||
m4_include([verify.at])
|
m4_include([verify.at])
|
||||||
|
|
||||||
diff --git a/tests/update03.at b/tests/update03.at
|
diff --git a/tests/update03.at b/tests/update03.at
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..185f9eb
|
index 0000000..185f9eb
|
||||||
|
@ -33,4 +33,4 @@ index 5a4bf72..bdf6ba0 100644
|
|||||||
+ if (xattrs_option > 0 && st->xattr_map_size)
|
+ if (xattrs_option > 0 && st->xattr_map_size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
94
tar.spec
94
tar.spec
@ -4,8 +4,8 @@
|
|||||||
Summary: A GNU file archiving program
|
Summary: A GNU file archiving program
|
||||||
Name: tar
|
Name: tar
|
||||||
Epoch: 2
|
Epoch: 2
|
||||||
Version: 1.26
|
Version: 1.27
|
||||||
Release: 28%{?dist}
|
Release: 1%{?dist}
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: Applications/Archiving
|
Group: Applications/Archiving
|
||||||
URL: http://www.gnu.org/software/tar/
|
URL: http://www.gnu.org/software/tar/
|
||||||
@ -39,90 +39,30 @@ Patch3: tar-1.17-wildcards.patch
|
|||||||
# ~> still downstream
|
# ~> still downstream
|
||||||
Patch4: tar-1.22-atime-rofs.patch
|
Patch4: tar-1.22-atime-rofs.patch
|
||||||
|
|
||||||
# The --old-archive option was not working.
|
|
||||||
# ~> #594044
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2010-05/msg00015.html
|
|
||||||
# ~> upstream (2a61a37)
|
|
||||||
Patch5: tar-1.23-oldarchive.patch
|
|
||||||
|
|
||||||
# Fix for bad cooperation of -C and -u options.
|
# Fix for bad cooperation of -C and -u options.
|
||||||
# ~> #688567
|
# ~> #688567
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2012-02/msg00007.html
|
# ~> http://lists.gnu.org/archive/html/bug-tar/2012-02/msg00007.html
|
||||||
# ~> still downstream
|
# ~> still downstream
|
||||||
Patch6: tar-1.26-update-with-change-directory.patch
|
Patch5: tar-1.26-update-with-change-directory.patch
|
||||||
|
|
||||||
# Fix rawhide build failure with undefined gets.
|
|
||||||
# ~> upstream (gnulib)
|
|
||||||
Patch7: tar-1.26-stdio.in.patch
|
|
||||||
|
|
||||||
# Fix regression with --keep-old-files option.
|
|
||||||
# ~> #799252
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2011-11/msg00043.html
|
|
||||||
# ~> upstream (7a5a3708c)
|
|
||||||
Patch8: tar-1.26-add-skip-old-files-option.patch
|
|
||||||
|
|
||||||
# Prepare included gnulib library for SELinux support.
|
|
||||||
# -> Related to the next patch.
|
|
||||||
Patch9: tar-1.26-selinux-gnulib.patch
|
|
||||||
|
|
||||||
# Add support for extended attributes, SELinux and POSIX ACLs.
|
|
||||||
# ~> Original implementation #200925
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2012-08/msg00012.html
|
|
||||||
# ~> upstream (b997c90f9, 696338043, d36f5a3cc, 085cace18, up-to ~> 83701a590)
|
|
||||||
Patch10: tar-1.26-xattrs.patch
|
|
||||||
|
|
||||||
# Fix problem with bit UIDs/GIDs (> 2^21) and --posix format.
|
|
||||||
# ~> #913406
|
|
||||||
# ~> upstream (it is part of df7b55a8f6354e)
|
|
||||||
Patch11: tar-1.26-posix-biguid.patch
|
|
||||||
|
|
||||||
# Allow store sparse files of effective size >8GB into pax archives
|
|
||||||
# ~> #516309
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-01/msg00001.html
|
|
||||||
# ~> already upstream (2f6c03cba)
|
|
||||||
Patch12: tar-1.26-pax-big-sparse-files.patch
|
|
||||||
|
|
||||||
# Fix: Allow extracting single volume in a multi-volume archive
|
|
||||||
# ~> #919897
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-03/msg00002.html
|
|
||||||
# ~> upstream (beca89bc)
|
|
||||||
Patch13: tar-1.26-allow-extract-single-volume.patch
|
|
||||||
|
|
||||||
# Allow to pass arguments to commands called from tar
|
|
||||||
# ~> resolves #819187 (now we can use ./configure --with-lzma)
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-02/msg00003.html
|
|
||||||
# ~> upstream: 7b5e803963
|
|
||||||
Patch14: tar-1.26-command-args.patch
|
|
||||||
|
|
||||||
# Do not print xattrs/selinux/acls when --no-xattrs/--no-acls/--no-selinux
|
# Do not print xattrs/selinux/acls when --no-xattrs/--no-acls/--no-selinux
|
||||||
# options are used during -tvv output. (TODO: merge this with xattrs patch
|
# options are used during -tvv output. (TODO: merge this with xattrs patch
|
||||||
# once becomes upstream)
|
# once becomes upstream)
|
||||||
# ~> downstream (yet)
|
# ~> downstream (yet)
|
||||||
# ~> proposal: http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
|
# ~> proposal: http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
|
||||||
Patch15: tar-1.26-xattrs-printing.patch
|
Patch6: tar-1.26-xattrs-printing.patch
|
||||||
|
|
||||||
# Use a birthtime instead of ctime.
|
|
||||||
# ~> upstream (189e43 & 49bd10)
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2011-06/msg00000.html
|
|
||||||
# ~> http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00022.html
|
|
||||||
Patch16: tar-1.26-fix-symlink-eating-bug.patch
|
|
||||||
|
|
||||||
# Add documentation which was not yet pushed upstream
|
# Add documentation which was not yet pushed upstream
|
||||||
# ~> downstream
|
# ~> downstream
|
||||||
# ~> #996753
|
# ~> #996753
|
||||||
Patch17: tar-1.26-docu-xattrs.patch
|
Patch7: tar-1.26-docu-xattrs.patch
|
||||||
|
|
||||||
# The --xattrs-include or --xattrs-exclude options should imply --xattrs.
|
# The --xattrs-include or --xattrs-exclude options should imply --xattrs.
|
||||||
# ~> still downstream
|
# ~> still downstream
|
||||||
# http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
|
# http://lists.gnu.org/archive/html/bug-tar/2013-05/msg00020.html
|
||||||
# ~> #965969
|
# ~> #965969
|
||||||
|
|
||||||
Patch18: tar-1.26-xattrs-include-implies-xattrs.patch
|
Patch8: tar-1.26-xattrs-include-implies-xattrs.patch
|
||||||
|
|
||||||
# Silence gcc warnings
|
|
||||||
# ~> upstream tar: 17f99bc6f, 5bb0433
|
|
||||||
# ~> upstream paxutils: 0b3d84a0
|
|
||||||
Patch999: tar-1.26-silence-gcc.patch
|
|
||||||
|
|
||||||
# run "make check" by default
|
# run "make check" by default
|
||||||
%bcond_without check
|
%bcond_without check
|
||||||
@ -161,21 +101,10 @@ the rmt package on the remote box.
|
|||||||
%patch2 -p1 -b .vfatTruncate
|
%patch2 -p1 -b .vfatTruncate
|
||||||
%patch3 -p1 -b .wildcards
|
%patch3 -p1 -b .wildcards
|
||||||
%patch4 -p1 -b .rofs
|
%patch4 -p1 -b .rofs
|
||||||
%patch5 -p1 -b .oldarchive
|
%patch5 -p1 -b .update_and_changedir
|
||||||
%patch6 -p1 -b .update_and_changedir
|
%patch6 -p1 -b .print-xattrs-fix
|
||||||
%patch7 -p1 -b .gets %{?_rawbuild}
|
%patch7 -p1 -b .xattrs-documentation
|
||||||
%patch8 -p1 -b .skip-old-files
|
%patch8 -p1 -b .xattrs-if-xattrs-include
|
||||||
%patch9 -p1 -b .selinux-gnulib-prep
|
|
||||||
%patch10 -p1 -b .xattrs-selinux-acls
|
|
||||||
%patch11 -p1 -b .big_uid_gid
|
|
||||||
%patch12 -p1 -b .pax-sparse-big-files
|
|
||||||
%patch13 -p1 -b .extract-single-volume
|
|
||||||
%patch14 -p1 -b .command-args
|
|
||||||
%patch15 -p1 -b .print-xattrs-fix
|
|
||||||
%patch16 -p1 -b .birthtime
|
|
||||||
%patch17 -p1 -b .xattrs-documentation
|
|
||||||
%patch18 -p1 -b .xattrs-if-xattrs-include
|
|
||||||
%patch999 -p1 -b .silence-gcc
|
|
||||||
|
|
||||||
autoreconf -v
|
autoreconf -v
|
||||||
|
|
||||||
@ -234,6 +163,9 @@ fi
|
|||||||
%{_infodir}/tar.info*
|
%{_infodir}/tar.info*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Oct 09 2013 Ondrej Vasik <ovaisk@redhat.com> - 1.27-1
|
||||||
|
- new upstream release 1.27 (#1016288)
|
||||||
|
|
||||||
* Mon Sep 09 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-28
|
* Mon Sep 09 2013 Pavel Raiskup <praiskup@redhat.com> - 1.26-28
|
||||||
- add documenation for xattrs-like options (#996753)
|
- add documenation for xattrs-like options (#996753)
|
||||||
- the --xattrs-include implies --xattrs now (#965969)
|
- the --xattrs-include implies --xattrs now (#965969)
|
||||||
|
Loading…
Reference in New Issue
Block a user