Change filter paramaters, filters can be more powefull now
No binary (build failed)
—
(log yok)
| @@ -116,7 +116,7 @@ extern int cpio_main(int argc, char **argv) | |
| tmp = tmp->next; | |
| } | |
| pending_hardlinks = 0; /* No more pending hardlinks, read next file entry */ | |
| - | } |
| + | } |
| /* There can be padding before archive header */ | |
| data_align(archive_handle, 4); | |
| @@ -138,7 +138,7 @@ extern int cpio_main(int argc, char **argv) | |
| if ((cpio_header[5] != '1') && (cpio_header[5] != '2')) { | |
| error_msg_and_die("Unsupported cpio format, use newc or crc"); | |
| - | } |
| + | } |
| sscanf(cpio_header, "%6c%8x%8x%8x%8x%8x%8lx%8lx%16c%8x%8x%8x%8c", | |
| dummy, &inode, (unsigned int*)&file_header->mode, | |
| @@ -206,7 +206,7 @@ extern int cpio_main(int argc, char **argv) | |
| file_header->device = (major << 8) | minor; | |
| extract_flag = FALSE; | |
| - | if (archive_handle->filter(archive_handle->accept, archive_handle->reject, file_header->name) == EXIT_SUCCESS) { |
| + | if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { |
| struct stat statbuf; | |
| extract_flag = TRUE; | |
| @@ -1,12 +1,30 @@ | |
| + | /* |
| + | * Copyright (C) 2002 by Glenn McGrath |
| + | * |
| + | * This program is free software; you can redistribute it and/or modify |
| + | * it under the terms of the GNU General Public License as published by |
| + | * the Free Software Foundation; either version 2 of the License, or |
| + | * (at your option) any later version. |
| + | * |
| + | * This program is distributed in the hope that it will be useful, |
| + | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + | * GNU General Public License for more details. |
| + | * |
| + | * You should have received a copy of the GNU General Public License |
| + | * along with this program; if not, write to the Free Software |
| + | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| + | */ |
| + | |
| #include <fnmatch.h> | |
| #include <stdlib.h> | |
| + | |
| #include "unarchive.h" | |
| - | /* |
| - | * Accept names that are in the accept list |
| - | */ |
| - | extern char filter_accept_all(const llist_t *accept_list, const llist_t *reject_list, const char *key) |
| + | |
| + | /* Accept any non-null name, its not really a filter at all */ |
| + | extern char filter_accept_all(const archive_handle_t *archive_handle) |
| { | |
| - | if (key) { |
| + | if (archive_handle->file_header->name) { |
| return(EXIT_SUCCESS); | |
| } else { | |
| return(EXIT_FAILURE); | |
| @@ -1,13 +1,32 @@ | |
| + | /* |
| + | * Copyright (C) 2002 by Glenn McGrath |
| + | * |
| + | * This program is free software; you can redistribute it and/or modify |
| + | * it under the terms of the GNU General Public License as published by |
| + | * the Free Software Foundation; either version 2 of the License, or |
| + | * (at your option) any later version. |
| + | * |
| + | * This program is distributed in the hope that it will be useful, |
| + | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + | * GNU General Public License for more details. |
| + | * |
| + | * You should have received a copy of the GNU General Public License |
| + | * along with this program; if not, write to the Free Software |
| + | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| + | */ |
| + | |
| #include <fnmatch.h> | |
| #include <stdlib.h> | |
| + | |
| #include "unarchive.h" | |
| /* | |
| - | * Accept names that are in the accept list |
| + | * Accept names that are in the accept list, ignoring reject 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 archive_handle_t *archive_handle) |
| { | |
| - | if (find_list_entry(accept_list, key)) { |
| + | if (find_list_entry(archive_handle->accept, archive_handle->file_header->name)) { |
| return(EXIT_SUCCESS); | |
| } else { | |
| return(EXIT_FAILURE); | |
| @@ -1,22 +1,42 @@ | |
| + | /* |
| + | * Copyright (C) 2002 by Glenn McGrath |
| + | * |
| + | * This program is free software; you can redistribute it and/or modify |
| + | * it under the terms of the GNU General Public License as published by |
| + | * the Free Software Foundation; either version 2 of the License, or |
| + | * (at your option) any later version. |
| + | * |
| + | * This program is distributed in the hope that it will be useful, |
| + | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + | * GNU General Public License for more details. |
| + | * |
| + | * You should have received a copy of the GNU General Public License |
| + | * along with this program; if not, write to the Free Software |
| + | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| + | */ |
| + | |
| #include <fnmatch.h> | |
| #include <stdlib.h> | |
| + | |
| #include "unarchive.h" | |
| /* | |
| - | * Accept names that are in the accept list |
| + | * Accept names that are in the accept list and not in the reject 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 archive_handle_t *archive_handle) |
| { | |
| - | const llist_t *accept_entry = find_list_entry(accept_list, key); |
| - | const llist_t *reject_entry = find_list_entry(reject_list, key); |
| + | const char *key = archive_handle->file_header->name; |
| + | const llist_t *accept_entry = find_list_entry(archive_handle->accept, key); |
| + | const llist_t *reject_entry = find_list_entry(archive_handle->reject, key); |
| - | /* Fail if an accept list was specified and the key wasnt in there */ |
| - | if (accept_list && (accept_entry == NULL)) { |
| + | /* If the key is in a reject list fail */ |
| + | if (reject_entry) { |
| return(EXIT_FAILURE); | |
| } | |
| - | /* If the key is in a reject list fail */ |
| - | if (reject_entry) { |
| + | /* Fail if an accept list was specified and the key wasnt in there */ |
| + | if (archive_handle->accept && (accept_entry == NULL)) { |
| return(EXIT_FAILURE); | |
| } | |
| @@ -104,7 +104,7 @@ extern char get_header_ar(archive_handle_t *archive_handle) | |
| typed->name[strcspn(typed->name, " /")] = '\0'; | |
| - | if (archive_handle->filter(archive_handle->accept, archive_handle->reject, typed->name) == EXIT_SUCCESS) { |
| + | if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { |
| archive_handle->action_header(typed); | |
| if (archive_handle->sub_archive) { | |
| while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS); | |
| @@ -160,7 +160,7 @@ extern char get_header_tar(archive_handle_t *archive_handle) | |
| # endif | |
| } | |
| #endif | |
| - | if (archive_handle->filter(archive_handle->accept, archive_handle->reject, archive_handle->file_header->name) == EXIT_SUCCESS) { |
| + | if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { |
| archive_handle->action_header(archive_handle->file_header); | |
| archive_handle->flags |= ARCHIVE_EXTRACT_QUIET; | |
| archive_handle->action_data(archive_handle); | |
| @@ -28,7 +28,7 @@ typedef struct llist_s { | |
| typedef struct archive_handle_s { | |
| /* define if the header and data compenent should processed */ | |
| - | char (*filter)(const llist_t *, const llist_t *, const char *); |
| + | char (*filter)(const struct archive_handle_s *); |
| const llist_t *accept; | |
| const llist_t *reject; | |
| const llist_t *passed; /* List of files that have successfully been worked on */ | |
| @@ -68,9 +68,9 @@ typedef struct archive_handle_s { | |
| extern archive_handle_t *init_handle(void); | |
| - | extern char filter_accept_all(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); |
| - | extern char filter_accept_reject_list(const llist_t *accept_list, const llist_t *reject_list, const char *key); |
| + | extern char filter_accept_all(const archive_handle_t *archive_handle); |
| + | extern char filter_accept_list(const archive_handle_t *archive_handle); |
| + | extern char filter_accept_reject_list(const archive_handle_t *archive_handle); |
| extern void unpack_ar_archive(archive_handle_t *ar_archive); | |