diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/ar.c | 2 | ||||
-rw-r--r-- | archival/cpio.c | 93 | ||||
-rw-r--r-- | archival/dpkg_deb.c | 3 |
3 files changed, 96 insertions, 2 deletions
diff --git a/archival/ar.c b/archival/ar.c index fd98d86f5..09a4a8894 100644 --- a/archival/ar.c +++ b/archival/ar.c @@ -34,7 +34,7 @@ extern int ar_main(int argc, char **argv) FILE *src_stream = NULL; char **extract_names = NULL; char ar_magic[8]; - int extract_function = 0; + int extract_function = extract_unconditional; int opt; int num_of_entries = 0; extern off_t archive_offset; diff --git a/archival/cpio.c b/archival/cpio.c new file mode 100644 index 000000000..ecd6f534a --- /dev/null +++ b/archival/cpio.c @@ -0,0 +1,93 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini cpio implementation for busybox + * + * Copyright (C) 2001 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 + * + * Limitations: + * Doesn't check CRC's + * Only supports new ASCII and CRC formats + * Doesnt support hard links + * + */ +#include <fcntl.h> +#include <getopt.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "busybox.h" + +extern int cpio_main(int argc, char **argv) +{ + FILE *src_stream = stdin; + char **extract_names = NULL; + int extract_function = 0; + int num_of_entries = 0; + int opt = 0; + mode_t oldmask = 0; + + while ((opt = getopt(argc, argv, "idmuvtF:")) != -1) { + switch (opt) { + case 'i': // extract + extract_function |= extract_all_to_fs; + break; + case 'd': // create directories + extract_function |= extract_create_dirs; + oldmask = umask(077); /* Make create_path act like GNU cpio */ + break; + case 'm': // preserve modification time + extract_function |= extract_preserve_date; + break; + case 'v': // verbosly list files + extract_function |= extract_verbose_list; + break; + case 'u': // unconditional + extract_function |= extract_unconditional; + break; + case 't': // list files + extract_function |= extract_list; + break; + case 'F': + src_stream = xfopen(optarg, "r"); + break; + default: + show_usage(); + } + } + + if (extract_function & extract_all_to_fs && extract_function & extract_list) { + extract_function ^= extract_all_to_fs; /* If specify t, don't extract*/ + } + + if (extract_function & extract_all_to_fs && extract_function & extract_verbose_list) { /* The meaning of v changes on extract */ + extract_function ^= extract_verbose_list; + extract_function |= extract_list; + } + + extract_names = malloc(4); + while (optind < argc) { + num_of_entries++; + *extract_names = realloc(*extract_names, num_of_entries); + extract_names[num_of_entries - 1] = xstrdup(argv[optind]); + optind++; + } + + unarchive(src_stream, &get_header_cpio, extract_function, "./", extract_names); + if (oldmask) umask(oldmask); /* Restore umask if we changed it */ + return EXIT_SUCCESS; +} + diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index 77172b0f6..b1cbb1bbc 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c @@ -26,7 +26,7 @@ extern int dpkg_deb_main(int argc, char **argv) char *output_buffer = NULL; int opt = 0; int arg_type = 0; - int deb_extract_funct = extract_create_dirs; + int deb_extract_funct = extract_create_dirs | extract_unconditional; const int arg_type_prefix = 1; const int arg_type_field = 2; @@ -92,6 +92,7 @@ extern int dpkg_deb_main(int argc, char **argv) strcat(prefix, "/"); } } + mkdir(prefix, 0777); } if (arg_type == arg_type_filename) { |