]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
If there are leftover inclusions (command-line patterns) after
authorTim Kientzle <kientzle@gmail.com>
Thu, 8 May 2008 20:28:36 +0000 (16:28 -0400)
committerTim Kientzle <kientzle@gmail.com>
Thu, 8 May 2008 20:28:36 +0000 (16:28 -0400)
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

tar/bsdtar.h
tar/matching.c
tar/read.c
tar/test/Makefile
tar/test/test_patterns.c [new file with mode: 0644]

index 726e29eb90ff623a5dd3e4ef812b16abbf124a61..7fe27df41b79896ce8b9846aeeb1c4d879eab91d 100644 (file)
@@ -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, ...);
 
index 9a6b2795161a442857e86c00748b56994ae997da..59be17b9a3a2d59ea51eab48d5dc678af57d52b0 100644 (file)
@@ -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)
 
index 0795c79411665276c71fe52f2a4bed9accc4e729..edb33cb45431213a335a18b9c1c8549e482bdc1b 100644 (file)
@@ -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");
 }
 
 /*
index e54a6eb3f7064cc4d6047c1271fc2752a295e5f1..dd527fd1839eb8001b64101c3c65a5bcc7d0a493 100644 (file)
@@ -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 (file)
index 0000000..e7b1679
--- /dev/null
@@ -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);
+}