summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath2001-04-18 13:34:09 +0000
committerGlenn L McGrath2001-04-18 13:34:09 +0000
commitbcfeb2ac44a468f7f7487883f418e026f8e76348 (patch)
treedbc3934a4d88ad99d6563a32778a0f276739dfa4
parent2771d1a574dbf940cc7d03a04ed1ae0f6d97d3c2 (diff)
downloadbusybox-bcfeb2ac44a468f7f7487883f418e026f8e76348.zip
busybox-bcfeb2ac44a468f7f7487883f418e026f8e76348.tar.gz
Fix zcat/gunzip when reading from stdin
-rw-r--r--archival/gunzip.c54
-rw-r--r--gunzip.c54
2 files changed, 56 insertions, 52 deletions
diff --git a/archival/gunzip.c b/archival/gunzip.c
index 246ce2f..c3960e9 100644
--- a/archival/gunzip.c
+++ b/archival/gunzip.c
@@ -60,9 +60,6 @@ static char *license_msg[] = {
};
#endif
-//#include <sys/types.h>
-//#include <sys/wait.h>
-//#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -93,37 +90,42 @@ extern int gunzip_main(int argc, char **argv)
/* if called as zcat */
if (strcmp(applet_name, "zcat") == 0) {
- if (argc != 2) {
+ if (argc > 2) {
show_usage();
}
- optind = 1;
- flags |= (gunzip_force | gunzip_to_stdout);
+ else if (argc == 2) {
+ /* a filename was specified */
+ flags |= (gunzip_to_stdout | gunzip_force);
+ optind = 1;
+ } else {
+ /* read from stdin, this gets caught below as argv[optind] will be NULL */
+ optind = argc;
+ }
} else {
/* workout flags as regular gunzip */
- /* set default flags */
- if (argc == 1) {
- flags |= (gunzip_from_stdin | gunzip_to_stdout);
- } else {
- /* Parse any options */
- while ((opt = getopt(argc, argv, "ctfh")) != -1) {
- switch (opt) {
- case 'c':
- flags |= gunzip_to_stdout;
- break;
- case 'f':
- flags |= gunzip_force;
- break;
- case 't':
- flags |= gunzip_test;
- break;
- case 'h':
- default:
- show_usage(); /* exit's inside usage */
- }
+ while ((opt = getopt(argc, argv, "ctfh")) != -1) {
+ switch (opt) {
+ case 'c':
+ flags |= gunzip_to_stdout;
+ break;
+ case 'f':
+ flags |= gunzip_force;
+ break;
+ case 't':
+ flags |= gunzip_test;
+ break;
+ case 'h':
+ default:
+ show_usage(); /* exit's inside usage */
}
}
}
+ /* no filename specified so it must be reading from stdin to stdout */
+ if (argv[optind] == NULL) {
+ flags |= (gunzip_from_stdin |gunzip_to_stdout |gunzip_force);
+ }
+
/* Set input filename and number */
if (flags & gunzip_from_stdin) {
in_file = stdin;
diff --git a/gunzip.c b/gunzip.c
index 246ce2f..c3960e9 100644
--- a/gunzip.c
+++ b/gunzip.c
@@ -60,9 +60,6 @@ static char *license_msg[] = {
};
#endif
-//#include <sys/types.h>
-//#include <sys/wait.h>
-//#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -93,37 +90,42 @@ extern int gunzip_main(int argc, char **argv)
/* if called as zcat */
if (strcmp(applet_name, "zcat") == 0) {
- if (argc != 2) {
+ if (argc > 2) {
show_usage();
}
- optind = 1;
- flags |= (gunzip_force | gunzip_to_stdout);
+ else if (argc == 2) {
+ /* a filename was specified */
+ flags |= (gunzip_to_stdout | gunzip_force);
+ optind = 1;
+ } else {
+ /* read from stdin, this gets caught below as argv[optind] will be NULL */
+ optind = argc;
+ }
} else {
/* workout flags as regular gunzip */
- /* set default flags */
- if (argc == 1) {
- flags |= (gunzip_from_stdin | gunzip_to_stdout);
- } else {
- /* Parse any options */
- while ((opt = getopt(argc, argv, "ctfh")) != -1) {
- switch (opt) {
- case 'c':
- flags |= gunzip_to_stdout;
- break;
- case 'f':
- flags |= gunzip_force;
- break;
- case 't':
- flags |= gunzip_test;
- break;
- case 'h':
- default:
- show_usage(); /* exit's inside usage */
- }
+ while ((opt = getopt(argc, argv, "ctfh")) != -1) {
+ switch (opt) {
+ case 'c':
+ flags |= gunzip_to_stdout;
+ break;
+ case 'f':
+ flags |= gunzip_force;
+ break;
+ case 't':
+ flags |= gunzip_test;
+ break;
+ case 'h':
+ default:
+ show_usage(); /* exit's inside usage */
}
}
}
+ /* no filename specified so it must be reading from stdin to stdout */
+ if (argv[optind] == NULL) {
+ flags |= (gunzip_from_stdin |gunzip_to_stdout |gunzip_force);
+ }
+
/* Set input filename and number */
if (flags & gunzip_from_stdin) {
in_file = stdin;