Fix exclude/include problem
No binary (build failed)
—
(log yok)
| @@ -48,6 +48,7 @@ LIBUNARCHIVE-y:= \ | |
| init_handle.o \ | |
| seek_sub_file.o \ | |
| unpack_ar_archive.o \ | |
| + | find_list_entry.o |
| LIBUNARCHIVE-$(CONFIG_DPKG) += | |
| LIBUNARCHIVE-$(CONFIG_DPKG_DEB) += | |
| @@ -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); |
| } | |
| @@ -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); | |
| } | |
| @@ -47,6 +47,7 @@ extern char get_header_tar(archive_handle_t *archive_handle) | |
| } 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 @@ extern char get_header_tar(archive_handle_t *archive_handle) | |
| } 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 @@ extern char get_header_tar(archive_handle_t *archive_handle) | |
| 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); | |
| } | |
| @@ -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) | |
| { | |
| 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 @@ int tar_main(int argc, char **argv) | |
| 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 @@ int tar_main(int argc, char **argv) | |
| #endif /* CONFIG_FEATURE_TAR_CREATE */ | |
| while (get_header_tar(tar_handle) == EXIT_SUCCESS); | |
| - | } |
| - | /* 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; |
| + | /* 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; |
| + | } |
| } | |
| + | |
| #ifdef CONFIG_FEATURE_CLEAN_UP | |
| if (tar_handle->src_fd != fileno(stdin)) { | |
| close(tar_handle->src_fd); | |
| @@ -36,6 +36,7 @@ typedef struct archive_handle_s { | |
| 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 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 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 | |