tar -Z, uncompress support

This commit is contained in:
Glenn L McGrath 2003-11-18 21:37:52 +00:00
parent 20872be9a4
commit 56f16b42c9
5 changed files with 37 additions and 11 deletions

View File

@ -193,6 +193,14 @@ config CONFIG_FEATURE_TAR_GZIP
If you enable this option tar will be able to call gzip, If you enable this option tar will be able to call gzip,
when creating or extracting tar gziped archives. when creating or extracting tar gziped archives.
config CONFIG_FEATURE_TAR_COMPRESS
bool " Enable -Z option"
default n
depends on CONFIG_TAR
help
If you enable this option tar will be able to call uncompress,
when extracting .tar.Z archives.
config CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY config CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
bool " Enable support for old tar header format" bool " Enable support for old tar header format"
default N default N

View File

@ -73,6 +73,7 @@ LIBUNARCHIVE-$(CONFIG_RPM) += $(GUNZIP_FILES) get_header_cpio.o
LIBUNARCHIVE-$(CONFIG_TAR) += get_header_tar.o LIBUNARCHIVE-$(CONFIG_TAR) += get_header_tar.o
LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_BZIP2) += decompress_bunzip2.o get_header_tar_bz2.o LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_BZIP2) += decompress_bunzip2.o get_header_tar_bz2.o
LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_GZIP) += $(GUNZIP_FILES) get_header_tar_gz.o LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_GZIP) += $(GUNZIP_FILES) get_header_tar_gz.o
LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_COMPRESS) += uncompress.o
LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += uncompress.o LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += uncompress.o
LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES) LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES)

View File

@ -1,8 +1,6 @@
#include "config.h" #include "config.h"
#include "libbb.h" #include "libbb.h"
#if defined CONFIG_UNCOMPRESS || defined CONFIG_FEATURE_GUNZIP_UNCOMPRESS
/* uncompress for busybox -- (c) 2002 Robert Griebl /* uncompress for busybox -- (c) 2002 Robert Griebl
* *
* based on the original compress42.c source * based on the original compress42.c source
@ -293,6 +291,3 @@ extern int uncompress(int fd_in, int fd_out)
return 0; return 0;
} }
#endif

View File

@ -1,8 +1,6 @@
#include "config.h" #include "config.h"
#include "libbb.h" #include "libbb.h"
#if defined CONFIG_UNCOMPRESS || defined CONFIG_FEATURE_GUNZIP_UNCOMPRESS
/* uncompress for busybox -- (c) 2002 Robert Griebl /* uncompress for busybox -- (c) 2002 Robert Griebl
* *
* based on the original compress42.c source * based on the original compress42.c source
@ -293,6 +291,3 @@ extern int uncompress(int fd_in, int fd_out)
return 0; return 0;
} }
#endif

View File

@ -594,8 +594,27 @@ static llist_t *append_file_list_to_list(llist_t *list)
} }
#endif #endif
#ifdef CONFIG_FEATURE_TAR_COMPRESS
static char get_header_tar_Z(archive_handle_t *archive_handle)
{
/* Cant lseek over pipe's */
archive_handle->seek = seek_by_char;
static const char tar_options[]="ctxjT:X:C:f:Opvzk"; /* do the decompression, and cleanup */
if ((bb_xread_char(archive_handle->src_fd) != 0x1f) || (bb_xread_char(archive_handle->src_fd) != 0x9d)) {
bb_error_msg_and_die("Invalid magic");
}
archive_handle->src_fd = open_transformer(archive_handle->src_fd, uncompress);
archive_handle->offset = 0;
while (get_header_tar(archive_handle) == EXIT_SUCCESS);
/* Can only do one file at a time */
return(EXIT_FAILURE);
}
#endif
static const char tar_options[]="ctxjT:X:C:f:OpvzkZ";
#define CTX_CREATE 1 #define CTX_CREATE 1
#define CTX_TEST 2 #define CTX_TEST 2
@ -610,6 +629,7 @@ static const char tar_options[]="ctxjT:X:C:f:Opvzk";
#define TAR_OPT_VERBOSE 1024 #define TAR_OPT_VERBOSE 1024
#define TAR_OPT_GZIP 2048 #define TAR_OPT_GZIP 2048
#define TAR_OPT_KEEP_OLD 4096 #define TAR_OPT_KEEP_OLD 4096
#define TAR_OPT_UNCOMPRESS 8192
int tar_main(int argc, char **argv) int tar_main(int argc, char **argv)
{ {
@ -688,6 +708,13 @@ int tar_main(int argc, char **argv)
get_header_ptr = get_header_tar_bz2; get_header_ptr = get_header_tar_bz2;
#else #else
bb_show_usage(); bb_show_usage();
#endif
}
if(opt & TAR_OPT_UNCOMPRESS) {
#ifdef CONFIG_FEATURE_TAR_COMPRESS
get_header_ptr = get_header_tar_Z;
#else
bb_show_usage();
#endif #endif
} }
if(opt & TAR_OPT_EXCLUDE) { if(opt & TAR_OPT_EXCLUDE) {