Fix exclude/include problem
diff --git a/archival/libunarchive/Makefile.in b/archival/libunarchive/Makefile.in
index e2ac546..e559cb4 100644
--- a/archival/libunarchive/Makefile.in
+++ b/archival/libunarchive/Makefile.in
@@ -48,6 +48,7 @@
 	init_handle.o \
 	seek_sub_file.o \
 	unpack_ar_archive.o \
+	find_list_entry.o
 
 LIBUNARCHIVE-$(CONFIG_DPKG) += 
 LIBUNARCHIVE-$(CONFIG_DPKG_DEB) += 
diff --git a/archival/libunarchive/filter_accept_list.c b/archival/libunarchive/filter_accept_list.c
index 9f92e64..2b023ec 100644
--- a/archival/libunarchive/filter_accept_list.c
+++ b/archival/libunarchive/filter_accept_list.c
@@ -1,24 +1,15 @@
 #include <fnmatch.h>
 #include <stdlib.h>
 #include "unarchive.h"
+
 /*
  * Accept names that are in the accept list
  */
 extern char filter_accept_list(const llist_t *accept_list, const llist_t *reject_list, const char *key)
 {
-	llist_t *accept_old;
-
-	while (accept_list) {
-		if (fnmatch(accept_list->data, key, 0) == 0) {
-			/* Remove entry from list */
-			accept_old->link = accept_list->link;
-			free(accept_list->data);
-			free(accept_list);
-			accept_list = accept_old;
-			return(EXIT_SUCCESS);
-		}
-		accept_old = accept_list;
-		accept_list = accept_list->link;
+	if (find_list_entry(accept_list, key)) {
+		return(EXIT_SUCCESS);
+	} else {
+		return(EXIT_FAILURE);
 	}
-	return(EXIT_FAILURE);
 }
diff --git a/archival/libunarchive/filter_accept_reject_list.c b/archival/libunarchive/filter_accept_reject_list.c
index c893dfc..21fecf1 100644
--- a/archival/libunarchive/filter_accept_reject_list.c
+++ b/archival/libunarchive/filter_accept_reject_list.c
@@ -2,33 +2,24 @@
 #include <stdlib.h>
 #include "unarchive.h"
 
-static char check_list(const llist_t *list, const char *filename)
-{
-	if (list) {
-		while (list) {
-			if (fnmatch(list->data, filename, 0) == 0) {
-				return(EXIT_SUCCESS);
-			}
-			list = list->link;
-		}
-	}
-	return(EXIT_FAILURE);
-}
-
 /*
  * Accept names that are in the accept list
  */
 extern char filter_accept_reject_list(const llist_t *accept_list, const llist_t *reject_list, const char *key)
 {
+	const llist_t *accept_entry = find_list_entry(accept_list, key);
+	const llist_t *reject_entry = find_list_entry(reject_list, key);
+
 	/* Fail if an accept list was specified and the key wasnt in there */
-	if ((accept_list) && (check_list(accept_list, key) == EXIT_FAILURE)) {
+	if (accept_list && (accept_entry == NULL)) {
 		return(EXIT_FAILURE);
 	}
 
 	/* If the key is in a reject list fail */
-	if (check_list(reject_list, key) == EXIT_FAILURE) {
+	if (reject_entry) {
 		return(EXIT_FAILURE);
 	}
 
+	/* Accepted */
 	return(EXIT_SUCCESS);
 }
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index bb0affe..e87eb77 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -47,6 +47,7 @@
 	} tar;
 	long sum = 0;
 	long i;
+	char *tmp;
 
 	/* Align header */
 	archive_handle->offset += data_align(archive_handle->src_fd, archive_handle->offset, 512);
@@ -91,6 +92,11 @@
 	} else {
 		file_header->name = concat_path_file(tar.formated.prefix, tar.formated.name);
 	}
+	tmp = last_char_is(archive_handle->file_header->name, '/');
+	if (tmp) {
+		*tmp = '\0';
+	}
+
 	file_header->mode = strtol(tar.formated.mode, NULL, 8);
 	file_header->uid = strtol(tar.formated.uid, NULL, 8);
 	file_header->gid = strtol(tar.formated.gid, NULL, 8);
@@ -159,6 +165,7 @@
 		archive_handle->action_header(archive_handle->file_header);
 		archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
 		archive_handle->action_data(archive_handle);
+		archive_handle->passed = add_to_list(archive_handle->passed, archive_handle->file_header->name);
 	} else {
 		data_skip(archive_handle);			
 	}
diff --git a/archival/tar.c b/archival/tar.c
index df110a1..d8889ae 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -586,14 +586,10 @@
 static const llist_t *append_file_list_to_list(const char *filename, const llist_t *list)
 {
 	FILE *src_stream = xfopen(filename, "r");
-	while(1) {
-		char *line = get_line_from_file(src_stream);
-		if (line == NULL) {
-			break;
-		}
+	char *line;
+	while((line = get_line_from_file(src_stream)) != NULL) {
 		chomp(line);
 		list = add_to_list(list, line);
-		free(line);
 	}
 	fclose(src_stream);
 
@@ -715,14 +711,10 @@
 		tar_handle->accept = add_to_list(tar_handle->accept, argv[optind]);
 		optind++;
 
-#ifdef CONFIG_FEATURE_TAR_EXCLUDE
-		if (tar_handle->reject) {
-			printf("Reject list\n");
-			tar_handle->filter = filter_accept_reject_list;
-		} else
-#endif	/* CONFIG_FEATURE_TAR_EXCLUDE */
+	}
 
-			tar_handle->filter = filter_accept_list;
+	if ((tar_handle->accept) || (tar_handle->reject)) {
+		tar_handle->filter = filter_accept_reject_list;
 	}
 
 	if ((base_dir) && (chdir(base_dir))) {
@@ -761,13 +753,18 @@
 #endif /* CONFIG_FEATURE_TAR_CREATE */
 
 			while (get_header_tar(tar_handle) == EXIT_SUCCESS);
+
+		/* Ckeck that every file that should have been extracted was */
+		while (tar_handle->accept) {
+			if (find_list_entry(tar_handle->reject, tar_handle->accept->data) == NULL) {
+				if (find_list_entry(tar_handle->passed, tar_handle->accept->data) == NULL) {
+					error_msg_and_die("%s: Not found in archive\n", tar_handle->accept->data);
+				}
+			}
+			tar_handle->accept = tar_handle->accept->link;
+		}
 	}
 
-	/* Skip through list */
-	while (tar_handle->accept) {
-		error_msg_and_die("%s: Not found in archive\n", tar_handle->accept->data);
-		tar_handle->accept = tar_handle->accept->link;
-	}
 #ifdef CONFIG_FEATURE_CLEAN_UP
 	if (tar_handle->src_fd != fileno(stdin)) {
 		close(tar_handle->src_fd);
diff --git a/include/unarchive.h b/include/unarchive.h
index 023c3e8..956c74f 100644
--- a/include/unarchive.h
+++ b/include/unarchive.h
@@ -36,6 +36,7 @@
 	char (*filter)(const llist_t *, const llist_t *, const char *);
 	const llist_t *accept;
 	const llist_t *reject;
+	const llist_t *passed;	/* List of files that have successfully been worked on */
 
 	/* Contains the processed header entry */
 	file_header_t *file_header;
@@ -89,5 +90,5 @@
 extern const unsigned short data_align(const int src_fd, const unsigned int offset, const unsigned short align_to);
 extern const llist_t *add_to_list(const llist_t *old_head, const char *new_item);
 extern int copy_file_chunk_fd(int src_fd, int dst_fd, unsigned long long chunksize);
-
+extern const llist_t *find_list_entry(const llist_t *list, const char *filename);
 #endif