* archival/bunzip2.c: Include <unistd.h>.
authorMatt Kraai <kraai@debian.org>
Wed, 27 Mar 2002 17:31:01 +0000 (17:31 -0000)
committerMatt Kraai <kraai@debian.org>
Wed, 27 Mar 2002 17:31:01 +0000 (17:31 -0000)
  (bunzip2_main): Read data from standard input if FILE argument is `-' or
  omitted.
* include/usage.h (bunzip2_trivial_usage, bunzip2_full_usage): Rewrite.
* testsuite/bunzip2/bunzip2-reads-from-standard-input: New.

archival/bunzip2.c
include/usage.h
testsuite/bunzip2/bunzip2-reads-from-standard-input [new file with mode: 0644]

index b0a11fd83d97fc3bdaadcd79379d7234b60d5755..678779e64854af255518454b0de8c4a447847f2c 100644 (file)
@@ -58,6 +58,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <getopt.h>
+#include <unistd.h>
 #include <busybox.h>
 
 //#define TRUE 1
@@ -2319,45 +2320,49 @@ errhandler_io:
 int bunzip2_main(int argc, char **argv)
 {
        const int bunzip_to_stdout = 1;
+       const int bunzip_force = 2;
        int flags = 0;
        int opt = 0;
 
        FILE *src_stream;
        FILE *dst_stream;
-       char *save_name;
-       char *save_name_ptr;
+       char *save_name = NULL;
 
        /* if called as bzcat */
        if (strcmp(applet_name, "bzcat") == 0)
                flags |= bunzip_to_stdout;
 
-       while ((opt = getopt(argc, argv, "ch")) != -1) {
+       while ((opt = getopt(argc, argv, "cfh")) != -1) {
                switch (opt) {
                case 'c':
                        flags |= bunzip_to_stdout;
                        break;
+               case 'f':
+                       flags |= bunzip_force;
+                       break;
                case 'h':
                default:
                        show_usage(); /* exit's inside usage */
                }
        }
 
-       save_name = xstrdup(argv[optind]);
-               
-       if (save_name == NULL) {
-               show_usage();
-       }
-
-       src_stream = xfopen(argv[optind], "r");
+       /* Set input filename and number */
+       if (argv[optind] == NULL || strcmp(argv[optind], "-") == 0) {
+               flags |= bunzip_to_stdout;
+               src_stream = stdin;
+       } else {
+               /* Open input file */
+               src_stream = xfopen(argv[optind], "r");
 
-       save_name_ptr = strrchr(save_name, '.');
-       if (save_name_ptr == NULL) {
-               return(FALSE);
-       }
-       if (strcmp(save_name_ptr, ".bz2") != 0) {
-               error_msg("Invalid extension, expected .bz2");
+               save_name = xstrdup(argv[optind]);
+               if (strcmp(save_name + strlen(save_name) - 4, ".bz2") != 0)
+                       error_msg_and_die("Invalid extension");
+               save_name[strlen(save_name) - 4] = '\0';
        }
-       *save_name_ptr = '\0';  
+
+       /* Check that the input is sane.  */
+       if (isatty(fileno(src_stream)) && (flags & bunzip_force) == 0)
+               error_msg_and_die("compressed data not read from terminal.  Use -f to force it.");
 
        if (flags & bunzip_to_stdout) {
                dst_stream = stdout;
index 6692aa5207f2677e667dc96b641f092c910e516c..e7de6f53fc4fff6321ec1dc01607a64bc84e8681 100644 (file)
        "bar"
 
 #define bunzip2_trivial_usage \
-       "[-c] FILE"
+       "[OPTION]... [FILE]"
 #define bunzip2_full_usage \
-       "Uncompress FILE to current directory, stripping its .bz2 extension.\n"\
-       " -c output to stdout\n"\
-       " -k is assumed" 
+       "Uncompress FILE (or standard input if FILE is '-' or omitted).\n\n" \
+       "Options:\n" \
+       "\t-c\tWrite output to standard output\n" \
+       "\t-f\tForce"
 
 #define bzcat_trivial_usage \
        "FILE"
diff --git a/testsuite/bunzip2/bunzip2-reads-from-standard-input b/testsuite/bunzip2/bunzip2-reads-from-standard-input
new file mode 100644 (file)
index 0000000..7bc8421
--- /dev/null
@@ -0,0 +1,2 @@
+echo foo | bzip2 -c | busybox bunzip2 -c > output
+echo foo | cmp - output