Fix exclude/include problem
This commit is contained in:
parent
05fa661123
commit
c5c1a8a112
@ -48,6 +48,7 @@ LIBUNARCHIVE-y:= \
|
|||||||
init_handle.o \
|
init_handle.o \
|
||||||
seek_sub_file.o \
|
seek_sub_file.o \
|
||||||
unpack_ar_archive.o \
|
unpack_ar_archive.o \
|
||||||
|
find_list_entry.o
|
||||||
|
|
||||||
LIBUNARCHIVE-$(CONFIG_DPKG) +=
|
LIBUNARCHIVE-$(CONFIG_DPKG) +=
|
||||||
LIBUNARCHIVE-$(CONFIG_DPKG_DEB) +=
|
LIBUNARCHIVE-$(CONFIG_DPKG_DEB) +=
|
||||||
|
@ -1,24 +1,15 @@
|
|||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Accept names that are in the accept list
|
* 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)
|
extern char filter_accept_list(const llist_t *accept_list, const llist_t *reject_list, const char *key)
|
||||||
{
|
{
|
||||||
llist_t *accept_old;
|
if (find_list_entry(accept_list, key)) {
|
||||||
|
return(EXIT_SUCCESS);
|
||||||
while (accept_list) {
|
} else {
|
||||||
if (fnmatch(accept_list->data, key, 0) == 0) {
|
return(EXIT_FAILURE);
|
||||||
/* 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;
|
|
||||||
}
|
}
|
||||||
return(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
@ -2,33 +2,24 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "unarchive.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
|
* 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)
|
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 */
|
/* 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);
|
return(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the key is in a reject list fail */
|
/* If the key is in a reject list fail */
|
||||||
if (check_list(reject_list, key) == EXIT_FAILURE) {
|
if (reject_entry) {
|
||||||
return(EXIT_FAILURE);
|
return(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Accepted */
|
||||||
return(EXIT_SUCCESS);
|
return(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ extern char get_header_tar(archive_handle_t *archive_handle)
|
|||||||
} tar;
|
} tar;
|
||||||
long sum = 0;
|
long sum = 0;
|
||||||
long i;
|
long i;
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
/* Align header */
|
/* Align header */
|
||||||
archive_handle->offset += data_align(archive_handle->src_fd, archive_handle->offset, 512);
|
archive_handle->offset += data_align(archive_handle->src_fd, archive_handle->offset, 512);
|
||||||
@ -91,6 +92,11 @@ extern char get_header_tar(archive_handle_t *archive_handle)
|
|||||||
} else {
|
} else {
|
||||||
file_header->name = concat_path_file(tar.formated.prefix, tar.formated.name);
|
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->mode = strtol(tar.formated.mode, NULL, 8);
|
||||||
file_header->uid = strtol(tar.formated.uid, NULL, 8);
|
file_header->uid = strtol(tar.formated.uid, NULL, 8);
|
||||||
file_header->gid = strtol(tar.formated.gid, NULL, 8);
|
file_header->gid = strtol(tar.formated.gid, NULL, 8);
|
||||||
@ -159,6 +165,7 @@ extern char get_header_tar(archive_handle_t *archive_handle)
|
|||||||
archive_handle->action_header(archive_handle->file_header);
|
archive_handle->action_header(archive_handle->file_header);
|
||||||
archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
|
archive_handle->flags |= ARCHIVE_EXTRACT_QUIET;
|
||||||
archive_handle->action_data(archive_handle);
|
archive_handle->action_data(archive_handle);
|
||||||
|
archive_handle->passed = add_to_list(archive_handle->passed, archive_handle->file_header->name);
|
||||||
} else {
|
} else {
|
||||||
data_skip(archive_handle);
|
data_skip(archive_handle);
|
||||||
}
|
}
|
||||||
|
@ -586,14 +586,10 @@ static inline int writeTarFile(const char *tarName, const int verboseFlag,
|
|||||||
static const llist_t *append_file_list_to_list(const char *filename, const llist_t *list)
|
static const llist_t *append_file_list_to_list(const char *filename, const llist_t *list)
|
||||||
{
|
{
|
||||||
FILE *src_stream = xfopen(filename, "r");
|
FILE *src_stream = xfopen(filename, "r");
|
||||||
while(1) {
|
char *line;
|
||||||
char *line = get_line_from_file(src_stream);
|
while((line = get_line_from_file(src_stream)) != NULL) {
|
||||||
if (line == NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
chomp(line);
|
chomp(line);
|
||||||
list = add_to_list(list, line);
|
list = add_to_list(list, line);
|
||||||
free(line);
|
|
||||||
}
|
}
|
||||||
fclose(src_stream);
|
fclose(src_stream);
|
||||||
|
|
||||||
@ -715,14 +711,10 @@ int tar_main(int argc, char **argv)
|
|||||||
tar_handle->accept = add_to_list(tar_handle->accept, argv[optind]);
|
tar_handle->accept = add_to_list(tar_handle->accept, argv[optind]);
|
||||||
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))) {
|
if ((base_dir) && (chdir(base_dir))) {
|
||||||
@ -761,13 +753,18 @@ int tar_main(int argc, char **argv)
|
|||||||
#endif /* CONFIG_FEATURE_TAR_CREATE */
|
#endif /* CONFIG_FEATURE_TAR_CREATE */
|
||||||
|
|
||||||
while (get_header_tar(tar_handle) == EXIT_SUCCESS);
|
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
|
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||||
if (tar_handle->src_fd != fileno(stdin)) {
|
if (tar_handle->src_fd != fileno(stdin)) {
|
||||||
close(tar_handle->src_fd);
|
close(tar_handle->src_fd);
|
||||||
|
@ -36,6 +36,7 @@ typedef struct archive_handle_s {
|
|||||||
char (*filter)(const llist_t *, const llist_t *, const char *);
|
char (*filter)(const llist_t *, const llist_t *, const char *);
|
||||||
const llist_t *accept;
|
const llist_t *accept;
|
||||||
const llist_t *reject;
|
const llist_t *reject;
|
||||||
|
const llist_t *passed; /* List of files that have successfully been worked on */
|
||||||
|
|
||||||
/* Contains the processed header entry */
|
/* Contains the processed header entry */
|
||||||
file_header_t *file_header;
|
file_header_t *file_header;
|
||||||
@ -89,5 +90,5 @@ extern void seek_sub_file(int src_fd, unsigned int amount);
|
|||||||
extern const unsigned short data_align(const int src_fd, const unsigned int offset, const unsigned short align_to);
|
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 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 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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user