tar -Z, uncompress support
authorGlenn L McGrath <bug1@ihug.co.nz>
Tue, 18 Nov 2003 21:37:52 +0000 (21:37 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Tue, 18 Nov 2003 21:37:52 +0000 (21:37 -0000)
archival/Config.in
archival/libunarchive/Makefile.in
archival/libunarchive/decompress_uncompress.c
archival/libunarchive/uncompress.c
archival/tar.c

index 8859bb1376099d18578ae9b520f8961a1f2c4983..2eab5abfaf3f9dd26c7ebe5dae005a57ca5c0210 100644 (file)
@@ -193,6 +193,14 @@ config CONFIG_FEATURE_TAR_GZIP
          If you enable this option tar will be able to call gzip,
          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
        bool "  Enable support for old tar header format"
        default N
index d449c193ecf580a3478e85fae6224a364d8a96eb..14ceea1108999059f9d759a71915a69d44b2d765 100644 (file)
@@ -73,6 +73,7 @@ LIBUNARCHIVE-$(CONFIG_RPM) += $(GUNZIP_FILES) get_header_cpio.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_GZIP) += $(GUNZIP_FILES) get_header_tar_gz.o
+LIBUNARCHIVE-$(CONFIG_FEATURE_TAR_COMPRESS) += uncompress.o
 LIBUNARCHIVE-$(CONFIG_UNCOMPRESS) += uncompress.o
 LIBUNARCHIVE-$(CONFIG_UNZIP) += $(GUNZIP_FILES)
 
index 9851ca39d824479eae439d59f529ffc4bd7bcc82..5046e8a26e18fe04fd1319ab26d3d3b7b5b2937a 100644 (file)
@@ -1,8 +1,6 @@
 #include "config.h"
 #include "libbb.h"
 
-#if defined CONFIG_UNCOMPRESS || defined CONFIG_FEATURE_GUNZIP_UNCOMPRESS
-
 /* uncompress for busybox -- (c) 2002 Robert Griebl
  *
  * based on the original compress42.c source 
@@ -293,6 +291,3 @@ extern int uncompress(int fd_in, int fd_out)
 
        return 0;
 }
-
-
-#endif
index 9851ca39d824479eae439d59f529ffc4bd7bcc82..5046e8a26e18fe04fd1319ab26d3d3b7b5b2937a 100644 (file)
@@ -1,8 +1,6 @@
 #include "config.h"
 #include "libbb.h"
 
-#if defined CONFIG_UNCOMPRESS || defined CONFIG_FEATURE_GUNZIP_UNCOMPRESS
-
 /* uncompress for busybox -- (c) 2002 Robert Griebl
  *
  * based on the original compress42.c source 
@@ -293,6 +291,3 @@ extern int uncompress(int fd_in, int fd_out)
 
        return 0;
 }
-
-
-#endif
index 7516b5752f9b2dde2ba8373e35b83eecf7786a51..4e763a404476118ab884f87971e2df5ecc81dcc4 100644 (file)
@@ -594,8 +594,27 @@ static llist_t *append_file_list_to_list(llist_t *list)
 }
 #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;
+
+       /* 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");
+       }
 
-static const char tar_options[]="ctxjT:X:C:f:Opvzk";
+       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_TEST       2
@@ -610,6 +629,7 @@ static const char tar_options[]="ctxjT:X:C:f:Opvzk";
 #define TAR_OPT_VERBOSE  1024
 #define TAR_OPT_GZIP     2048
 #define TAR_OPT_KEEP_OLD       4096
+#define TAR_OPT_UNCOMPRESS     8192
 
 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;
 #else
                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
        }
        if(opt & TAR_OPT_EXCLUDE) {