From: Tim Kientzle Date: Thu, 8 May 2008 20:28:36 +0000 (-0400) Subject: If there are leftover inclusions (command-line patterns) after X-Git-Tag: v2.6.0~257 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=31f358cf9b3bf5007d089edfc425fd8eca69a29b;p=thirdparty%2Flibarchive.git If there are leftover inclusions (command-line patterns) after extraction, warn about them: $ bsdtar xfv tar.tgz foo bar -rw-r--r-- 0 tim tim 0 May 8 19:50 foo bsdtar: bar: Not found in archive bsdtar: Error exit delayed from previous errors. PR: bin/121598 SVN-Revision: 35 --- diff --git a/tar/bsdtar.h b/tar/bsdtar.h index 726e29eb9..7fe27df41 100644 --- a/tar/bsdtar.h +++ b/tar/bsdtar.h @@ -121,6 +121,7 @@ void tar_mode_t(struct bsdtar *bsdtar); void tar_mode_u(struct bsdtar *bsdtar); void tar_mode_x(struct bsdtar *bsdtar); int unmatched_inclusions(struct bsdtar *bsdtar); +int unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg); void usage(struct bsdtar *); int yes(const char *fmt, ...); diff --git a/tar/matching.c b/tar/matching.c index 9a6b27951..59be17b9a 100644 --- a/tar/matching.c +++ b/tar/matching.c @@ -259,6 +259,29 @@ unmatched_inclusions(struct bsdtar *bsdtar) } +int +unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg) +{ + struct matching *matching; + struct match *p; + + matching = bsdtar->matching; + if (matching == NULL) + return (0); + + p = matching->inclusions; + while (p != NULL) { + if (p->matches == 0) { + bsdtar->return_value = 1; + bsdtar_warnc(bsdtar, 0, "%s: %s", + p->pattern, msg); + } + p = p->next; + } + return (matching->inclusions_unmatched_count); +} + + #if defined(HAVE_FNMATCH) && defined(HAVE_FNM_LEADING_DIR) diff --git a/tar/read.c b/tar/read.c index 0795c7941..edb33cb45 100644 --- a/tar/read.c +++ b/tar/read.c @@ -77,12 +77,14 @@ void tar_mode_t(struct bsdtar *bsdtar) { read_archive(bsdtar, 't'); + unmatched_inclusions_warn(bsdtar, "Not found in archive"); } void tar_mode_x(struct bsdtar *bsdtar) { read_archive(bsdtar, 'x'); + unmatched_inclusions_warn(bsdtar, "Not found in archive"); } /* diff --git a/tar/test/Makefile b/tar/test/Makefile index e54a6eb3f..dd527fd18 100644 --- a/tar/test/Makefile +++ b/tar/test/Makefile @@ -15,6 +15,7 @@ TESTS= \ test_getdate.c \ test_help.c \ test_option_T.c \ + test_patterns.c \ test_stdio.c \ test_version.c diff --git a/tar/test/test_patterns.c b/tar/test/test_patterns.c new file mode 100644 index 000000000..e7b1679fd --- /dev/null +++ b/tar/test/test_patterns.c @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +DEFINE_TEST(test_patterns) +{ + int fd, r; + + /* + * Test basic command-line pattern handling. + */ + + /* + * John Baldwin reported this problem in PR bin/121598 + */ + fd = open("foo", O_CREAT | O_WRONLY, 0644); + assert(fd >= 0); + close(fd); + r = systemf("%s zcfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog); + assertEqualInt(r, 0); + r = systemf("%s zxfv tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog); + failure("tar should return non-zero because a file was given on the command line that's not in the archive"); + assert(r != 0); +}