diff --git a/archival/bunzip2.c b/archival/bunzip2.c index b0a11fd83..678779e64 100644 --- a/archival/bunzip2.c +++ b/archival/bunzip2.c @@ -58,6 +58,7 @@ #include #include #include +#include #include //#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(); + /* 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 = 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'; } - 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_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; diff --git a/include/usage.h b/include/usage.h index 6692aa520..e7de6f53f 100644 --- a/include/usage.h +++ b/include/usage.h @@ -52,11 +52,12 @@ "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 index 000000000..7bc842135 --- /dev/null +++ b/testsuite/bunzip2/bunzip2-reads-from-standard-input @@ -0,0 +1,2 @@ +echo foo | bzip2 -c | busybox bunzip2 -c > output +echo foo | cmp - output