Support old-style compress (.Z) files via libbb / unzip( ) calls
authorRobert Griebl <griebl@gmx.de>
Wed, 15 May 2002 22:13:47 +0000 (22:13 -0000)
committerRobert Griebl <griebl@gmx.de>
Wed, 15 May 2002 22:13:47 +0000 (22:13 -0000)
(configurable) - When enabled an applet "uncompress" is also made
available (oddname to gunzip)

archival/libunarchive/decompress_unzip.c
archival/libunarchive/unzip.c
include/applets.h
libbb/Makefile.in
libbb/unzip.c
sysdeps/linux/config.in

index 9f6ed2ebe059197540c4a25cd97d6e0bbf7371f0..cde16d067582bf2a22e7e488d7b54448de403d3c 100644 (file)
@@ -65,8 +65,13 @@ static char *license_msg[] = {
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
+#include "config.h"
 #include "libbb.h"
 
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+int uncompress ( FILE *in, FILE *out );
+#endif
+
 static FILE *in_file, *out_file;
 
 /* these are freed by gz_close */
@@ -911,6 +916,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        unsigned char flags;    /* compression flags */
        typedef void (*sig_type) (int);
        unsigned short i;
+       unsigned char magic [2];
 
        if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
                (void) signal(SIGINT, (sig_type) abort_gzip);
@@ -926,8 +932,18 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        }
 #endif
 
+       magic [0] = fgetc(l_in_file);
+       magic [1] = fgetc(l_in_file);
+       
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+       /* Magic header for compress files, 1F 9d = \037\235 */
+       if (( magic [0] == 0x1F ) && ( magic [1] == 0x9d)) {
+               return uncompress ( l_in_file, l_out_file );
+       }
+#endif
+
        /* Magic header for gzip files, 1F 8B = \037\213 */
-       if ((fgetc(l_in_file) != 0x1F) || (fgetc(l_in_file) != 0x8b)) {
+       if (( magic [0] != 0x1F ) || ( magic [1] != 0x8b)) {
                error_msg("Invalid gzip magic");
                return EXIT_FAILURE;
        }
index 9f6ed2ebe059197540c4a25cd97d6e0bbf7371f0..cde16d067582bf2a22e7e488d7b54448de403d3c 100644 (file)
@@ -65,8 +65,13 @@ static char *license_msg[] = {
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
+#include "config.h"
 #include "libbb.h"
 
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+int uncompress ( FILE *in, FILE *out );
+#endif
+
 static FILE *in_file, *out_file;
 
 /* these are freed by gz_close */
@@ -911,6 +916,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        unsigned char flags;    /* compression flags */
        typedef void (*sig_type) (int);
        unsigned short i;
+       unsigned char magic [2];
 
        if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
                (void) signal(SIGINT, (sig_type) abort_gzip);
@@ -926,8 +932,18 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        }
 #endif
 
+       magic [0] = fgetc(l_in_file);
+       magic [1] = fgetc(l_in_file);
+       
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+       /* Magic header for compress files, 1F 9d = \037\235 */
+       if (( magic [0] == 0x1F ) && ( magic [1] == 0x9d)) {
+               return uncompress ( l_in_file, l_out_file );
+       }
+#endif
+
        /* Magic header for gzip files, 1F 8B = \037\213 */
-       if ((fgetc(l_in_file) != 0x1F) || (fgetc(l_in_file) != 0x8b)) {
+       if (( magic [0] != 0x1F ) || ( magic [1] != 0x8b)) {
                error_msg("Invalid gzip magic");
                return EXIT_FAILURE;
        }
index aaac6a9d40ab75bd2cfbbaebba0a79c9af35425d..6d01901a3c127cbaba8997eca857fe968144d558 100644 (file)
 #ifdef CONFIG_UNAME
        APPLET(uname, uname_main, _BB_DIR_BIN)
 #endif
+#ifdef CONFIG_GUNZIP   
+# ifdef CONFIG_FEATURE_UNCOMPRESS
+       APPLET_ODDNAME("uncompress", gunzip_main, _BB_DIR_BIN, gunzip)
+# endif
+#endif
 #ifdef CONFIG_UNIQ
        APPLET(uniq, uniq_main, _BB_DIR_USR_BIN)
 #endif
index 6d098c0e5f7b97b4f4a0a598e3d0b7533d081d9e..c6493bfa6dc7265b382996ed13c12baf0477760d 100644 (file)
@@ -34,7 +34,7 @@ LIBBB_SRC:= \
        my_getpwuid.c parse_mode.c parse_number.c perror_msg.c perror_msg_and_die.c \
        print_file.c process_escape_sequence.c read_package_field.c recursive_action.c \
        safe_read.c safe_strncpy.c syscalls.c syslog_msg_with_name.c time_string.c \
-       trim.c unzip.c vdprintf.c verror_msg.c vperror_msg.c wfopen.c xfuncs.c \
+       trim.c unzip.c uncompress.c vdprintf.c verror_msg.c vperror_msg.c wfopen.c xfuncs.c \
        xgetcwd.c xreadlink.c xregcomp.c interface.c remove_file.c last_char_is.c \
        copyfd.c vherror_msg.c herror_msg.c herror_msg_and_die.c xgethostbyname.c \
        dirname.c make_directory.c create_icmp_socket.c u_signal_names.c arith.c \
index 9f6ed2ebe059197540c4a25cd97d6e0bbf7371f0..cde16d067582bf2a22e7e488d7b54448de403d3c 100644 (file)
@@ -65,8 +65,13 @@ static char *license_msg[] = {
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
+#include "config.h"
 #include "libbb.h"
 
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+int uncompress ( FILE *in, FILE *out );
+#endif
+
 static FILE *in_file, *out_file;
 
 /* these are freed by gz_close */
@@ -911,6 +916,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        unsigned char flags;    /* compression flags */
        typedef void (*sig_type) (int);
        unsigned short i;
+       unsigned char magic [2];
 
        if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
                (void) signal(SIGINT, (sig_type) abort_gzip);
@@ -926,8 +932,18 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
        }
 #endif
 
+       magic [0] = fgetc(l_in_file);
+       magic [1] = fgetc(l_in_file);
+       
+#ifdef CONFIG_FEATURE_UNCOMPRESS
+       /* Magic header for compress files, 1F 9d = \037\235 */
+       if (( magic [0] == 0x1F ) && ( magic [1] == 0x9d)) {
+               return uncompress ( l_in_file, l_out_file );
+       }
+#endif
+
        /* Magic header for gzip files, 1F 8B = \037\213 */
-       if ((fgetc(l_in_file) != 0x1F) || (fgetc(l_in_file) != 0x8b)) {
+       if (( magic [0] != 0x1F ) || ( magic [1] != 0x8b)) {
                error_msg("Invalid gzip magic");
                return EXIT_FAILURE;
        }
index c1461602a14181ec18d7431ddf376d29f6cdb515..f1b064a405b6bd2433c8034ade5346d362450c26 100644 (file)
@@ -14,6 +14,7 @@ bool 'Show verbose applet usage messages'                             CONFIG_FEATURE_VERBOSE_USAGE
 bool 'Support --install [-s] to install applet links at runtime'       CONFIG_FEATURE_INSTALLER
 bool 'Enable locale support (system needs locale for this to work)'    CONFIG_LOCALE_SUPPORT
 bool 'Support for devfs'                                               CONFIG_FEATURE_DEVFS
+bool 'Support compress format (.Z) in unzip operations'                CONFIG_FEATURE_UNCOMPRESS 
 bool 'Clean up all memory before exiting (usually not needed)'         CONFIG_FEATURE_CLEAN_UP
 endmenu