diff options
| author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-07-14 08:49:53 +0000 |
|---|---|---|
| committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-07-14 08:49:53 +0000 |
| commit | 573b51bdf62e5dfa02b38ebb89059e2c7e1739fb (patch) | |
| tree | fe1823623d327a9954d6c09e57c9d42f4fb575b1 | |
| parent | c9d8d565e8c924528af3c682491f0b0963b5c2e0 (diff) | |
| download | busybox-w32-573b51bdf62e5dfa02b38ebb89059e2c7e1739fb.tar.gz busybox-w32-573b51bdf62e5dfa02b38ebb89059e2c7e1739fb.tar.bz2 busybox-w32-573b51bdf62e5dfa02b38ebb89059e2c7e1739fb.zip | |
Allow the unarchive() extract_list variable to be NULL, meaning extract all
git-svn-id: svn://busybox.net/trunk/busybox@3097 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | ar.c | 10 | ||||
| -rw-r--r-- | archival/ar.c | 10 | ||||
| -rw-r--r-- | archival/cpio.c | 15 | ||||
| -rw-r--r-- | cpio.c | 15 | ||||
| -rw-r--r-- | libbb/unarchive.c | 28 |
5 files changed, 40 insertions, 38 deletions
| @@ -70,17 +70,17 @@ extern int ar_main(int argc, char **argv) | |||
| 70 | 70 | ||
| 71 | /* check ar magic */ | 71 | /* check ar magic */ |
| 72 | fread(ar_magic, 1, 8, src_stream); | 72 | fread(ar_magic, 1, 8, src_stream); |
| 73 | archive_offset = 8; | ||
| 73 | if (strncmp(ar_magic,"!<arch>",7) != 0) { | 74 | if (strncmp(ar_magic,"!<arch>",7) != 0) { |
| 74 | error_msg_and_die("invalid magic"); | 75 | error_msg_and_die("invalid magic"); |
| 75 | } | 76 | } |
| 76 | archive_offset = 8; | ||
| 77 | 77 | ||
| 78 | extract_names = malloc(sizeof(char *)); | 78 | /* Create a list of files to extract */ |
| 79 | extract_names[0] = NULL; | ||
| 80 | while (optind < argc) { | 79 | while (optind < argc) { |
| 80 | extract_names = xrealloc(extract_names, sizeof(char *) * (num_of_entries + 2)); | ||
| 81 | extract_names[num_of_entries] = xstrdup(argv[optind]); | ||
| 81 | num_of_entries++; | 82 | num_of_entries++; |
| 82 | *extract_names = realloc(*extract_names, num_of_entries); | 83 | extract_names[num_of_entries] = NULL; |
| 83 | extract_names[num_of_entries - 1] = xstrdup(argv[optind]); | ||
| 84 | optind++; | 84 | optind++; |
| 85 | } | 85 | } |
| 86 | 86 | ||
diff --git a/archival/ar.c b/archival/ar.c index 2a764ff5e..7f3396c8c 100644 --- a/archival/ar.c +++ b/archival/ar.c | |||
| @@ -70,17 +70,17 @@ extern int ar_main(int argc, char **argv) | |||
| 70 | 70 | ||
| 71 | /* check ar magic */ | 71 | /* check ar magic */ |
| 72 | fread(ar_magic, 1, 8, src_stream); | 72 | fread(ar_magic, 1, 8, src_stream); |
| 73 | archive_offset = 8; | ||
| 73 | if (strncmp(ar_magic,"!<arch>",7) != 0) { | 74 | if (strncmp(ar_magic,"!<arch>",7) != 0) { |
| 74 | error_msg_and_die("invalid magic"); | 75 | error_msg_and_die("invalid magic"); |
| 75 | } | 76 | } |
| 76 | archive_offset = 8; | ||
| 77 | 77 | ||
| 78 | extract_names = malloc(sizeof(char *)); | 78 | /* Create a list of files to extract */ |
| 79 | extract_names[0] = NULL; | ||
| 80 | while (optind < argc) { | 79 | while (optind < argc) { |
| 80 | extract_names = xrealloc(extract_names, sizeof(char *) * (num_of_entries + 2)); | ||
| 81 | extract_names[num_of_entries] = xstrdup(argv[optind]); | ||
| 81 | num_of_entries++; | 82 | num_of_entries++; |
| 82 | *extract_names = realloc(*extract_names, num_of_entries); | 83 | extract_names[num_of_entries] = NULL; |
| 83 | extract_names[num_of_entries - 1] = xstrdup(argv[optind]); | ||
| 84 | optind++; | 84 | optind++; |
| 85 | } | 85 | } |
| 86 | 86 | ||
diff --git a/archival/cpio.c b/archival/cpio.c index 12a4340bd..7f68715eb 100644 --- a/archival/cpio.c +++ b/archival/cpio.c | |||
| @@ -68,25 +68,28 @@ extern int cpio_main(int argc, char **argv) | |||
| 68 | } | 68 | } |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | if (extract_function & extract_all_to_fs && extract_function & extract_list) { | 71 | if ((extract_function & extract_all_to_fs) && (extract_function & extract_list)) { |
| 72 | extract_function ^= extract_all_to_fs; /* If specify t, don't extract*/ | 72 | extract_function ^= extract_all_to_fs; /* If specify t, don't extract*/ |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | if (extract_function & extract_all_to_fs && extract_function & extract_verbose_list) { /* The meaning of v changes on extract */ | 75 | if ((extract_function & extract_all_to_fs) && (extract_function & extract_verbose_list)) { |
| 76 | /* The meaning of v changes on extract */ | ||
| 76 | extract_function ^= extract_verbose_list; | 77 | extract_function ^= extract_verbose_list; |
| 77 | extract_function |= extract_list; | 78 | extract_function |= extract_list; |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | extract_names = malloc(4); | ||
| 81 | while (optind < argc) { | 81 | while (optind < argc) { |
| 82 | extract_names = xrealloc(extract_names, sizeof(char *) * (num_of_entries + 2)); | ||
| 83 | extract_names[num_of_entries] = xstrdup(argv[optind]); | ||
| 82 | num_of_entries++; | 84 | num_of_entries++; |
| 83 | *extract_names = realloc(*extract_names, num_of_entries); | 85 | extract_names[num_of_entries] = NULL; |
| 84 | extract_names[num_of_entries - 1] = xstrdup(argv[optind]); | ||
| 85 | optind++; | 86 | optind++; |
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | unarchive(src_stream, stdout, &get_header_cpio, extract_function, "./", extract_names); | 89 | unarchive(src_stream, stdout, &get_header_cpio, extract_function, "./", extract_names); |
| 89 | if (oldmask) umask(oldmask); /* Restore umask if we changed it */ | 90 | if (oldmask) { |
| 91 | umask(oldmask); /* Restore umask if we changed it */ | ||
| 92 | } | ||
| 90 | return EXIT_SUCCESS; | 93 | return EXIT_SUCCESS; |
| 91 | } | 94 | } |
| 92 | 95 | ||
| @@ -68,25 +68,28 @@ extern int cpio_main(int argc, char **argv) | |||
| 68 | } | 68 | } |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | if (extract_function & extract_all_to_fs && extract_function & extract_list) { | 71 | if ((extract_function & extract_all_to_fs) && (extract_function & extract_list)) { |
| 72 | extract_function ^= extract_all_to_fs; /* If specify t, don't extract*/ | 72 | extract_function ^= extract_all_to_fs; /* If specify t, don't extract*/ |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | if (extract_function & extract_all_to_fs && extract_function & extract_verbose_list) { /* The meaning of v changes on extract */ | 75 | if ((extract_function & extract_all_to_fs) && (extract_function & extract_verbose_list)) { |
| 76 | /* The meaning of v changes on extract */ | ||
| 76 | extract_function ^= extract_verbose_list; | 77 | extract_function ^= extract_verbose_list; |
| 77 | extract_function |= extract_list; | 78 | extract_function |= extract_list; |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | extract_names = malloc(4); | ||
| 81 | while (optind < argc) { | 81 | while (optind < argc) { |
| 82 | extract_names = xrealloc(extract_names, sizeof(char *) * (num_of_entries + 2)); | ||
| 83 | extract_names[num_of_entries] = xstrdup(argv[optind]); | ||
| 82 | num_of_entries++; | 84 | num_of_entries++; |
| 83 | *extract_names = realloc(*extract_names, num_of_entries); | 85 | extract_names[num_of_entries] = NULL; |
| 84 | extract_names[num_of_entries - 1] = xstrdup(argv[optind]); | ||
| 85 | optind++; | 86 | optind++; |
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | unarchive(src_stream, stdout, &get_header_cpio, extract_function, "./", extract_names); | 89 | unarchive(src_stream, stdout, &get_header_cpio, extract_function, "./", extract_names); |
| 89 | if (oldmask) umask(oldmask); /* Restore umask if we changed it */ | 90 | if (oldmask) { |
| 91 | umask(oldmask); /* Restore umask if we changed it */ | ||
| 92 | } | ||
| 90 | return EXIT_SUCCESS; | 93 | return EXIT_SUCCESS; |
| 91 | } | 94 | } |
| 92 | 95 | ||
diff --git a/libbb/unarchive.c b/libbb/unarchive.c index d10e60cbb..78260d2d6 100644 --- a/libbb/unarchive.c +++ b/libbb/unarchive.c | |||
| @@ -232,25 +232,24 @@ char *unarchive(FILE *src_stream, FILE *out_stream, file_header_t *(*get_headers | |||
| 232 | int i; | 232 | int i; |
| 233 | char *buffer = NULL; | 233 | char *buffer = NULL; |
| 234 | 234 | ||
| 235 | if (extract_names == NULL) { | ||
| 236 | return(NULL); | ||
| 237 | } | ||
| 238 | archive_offset = 0; | 235 | archive_offset = 0; |
| 239 | while ((file_entry = get_headers(src_stream)) != NULL) { | 236 | while ((file_entry = get_headers(src_stream)) != NULL) { |
| 240 | found = FALSE; | 237 | found = FALSE; |
| 241 | if (extract_names[0] != NULL) { | 238 | if (extract_names == NULL) { |
| 239 | found = TRUE; | ||
| 240 | } else { | ||
| 242 | for(i = 0; extract_names[i] != 0; i++) { | 241 | for(i = 0; extract_names[i] != 0; i++) { |
| 243 | if (strcmp(extract_names[i], file_entry->name) == 0) { | 242 | if (strcmp(extract_names[i], file_entry->name) == 0) { |
| 244 | found = TRUE; | 243 | found = TRUE; |
| 245 | } | 244 | } |
| 246 | } | 245 | } |
| 247 | if (!found) { | ||
| 248 | /* seek past the data entry */ | ||
| 249 | seek_sub_file(src_stream, file_entry->size); | ||
| 250 | continue; | ||
| 251 | } | ||
| 252 | } | 246 | } |
| 253 | buffer = extract_archive(src_stream, out_stream, file_entry, extract_function, prefix); | 247 | if (found) { |
| 248 | buffer = extract_archive(src_stream, out_stream, file_entry, extract_function, prefix); | ||
| 249 | } else { | ||
| 250 | /* seek past the data entry */ | ||
| 251 | seek_sub_file(src_stream, file_entry->size); | ||
| 252 | } | ||
| 254 | } | 253 | } |
| 255 | return(buffer); | 254 | return(buffer); |
| 256 | } | 255 | } |
| @@ -544,17 +543,14 @@ char *deb_extract(const char *package_filename, FILE *out_stream, | |||
| 544 | FILE *deb_stream; | 543 | FILE *deb_stream; |
| 545 | FILE *uncompressed_stream = NULL; | 544 | FILE *uncompressed_stream = NULL; |
| 546 | file_header_t *ar_header = NULL; | 545 | file_header_t *ar_header = NULL; |
| 546 | char **file_list = NULL; | ||
| 547 | char *output_buffer = NULL; | 547 | char *output_buffer = NULL; |
| 548 | char *ared_file = NULL; | 548 | char *ared_file = NULL; |
| 549 | char ar_magic[8]; | 549 | char ar_magic[8]; |
| 550 | char **file_list; | ||
| 551 | int gunzip_pid; | 550 | int gunzip_pid; |
| 552 | 551 | ||
| 553 | if (filename == NULL) { | 552 | if (filename != NULL) { |
| 554 | file_list = xmalloc(sizeof(char *)); | 553 | file_list = xmalloc(sizeof(char *) * 2); |
| 555 | file_list[0] = NULL; | ||
| 556 | } else { | ||
| 557 | file_list = xmalloc(sizeof(char *) * 3); | ||
| 558 | file_list[0] = xstrdup(filename); | 554 | file_list[0] = xstrdup(filename); |
| 559 | file_list[1] = NULL; | 555 | file_list[1] = NULL; |
| 560 | } | 556 | } |
