summaryrefslogtreecommitdiff
path: root/gunzip.c
diff options
context:
space:
mode:
authorMatt Kraai2001-04-18 15:54:09 +0000
committerMatt Kraai2001-04-18 15:54:09 +0000
commit96dcd19b8a8e9d6fc8c17c20c42d32665b68c141 (patch)
treef76468e801703662d8fedc6b51342b5aa4c39735 /gunzip.c
parent54652230d4f22f17a00a96493721c0688c838cd0 (diff)
downloadbusybox-96dcd19b8a8e9d6fc8c17c20c42d32665b68c141.zip
busybox-96dcd19b8a8e9d6fc8c17c20c42d32665b68c141.tar.gz
Fix a number of problems with argument handling.
Diffstat (limited to 'gunzip.c')
-rw-r--r--gunzip.c78
1 files changed, 29 insertions, 49 deletions
diff --git a/gunzip.c b/gunzip.c
index 65f4356..e6f6bdf 100644
--- a/gunzip.c
+++ b/gunzip.c
@@ -80,58 +80,38 @@ extern int gunzip_main(int argc, char **argv)
char *delete_file_name = NULL;
const int gunzip_to_stdout = 1;
- const int gunzip_from_stdin = 2;
- const int gunzip_force = 4;
- const int gunzip_test = 8;
+ const int gunzip_force = 2;
+ const int gunzip_test = 4;
int flags = 0;
int opt = 0;
int delete_old_file = FALSE;
/* if called as zcat */
- if (strcmp(applet_name, "zcat") == 0) {
- if (argc > 2) {
- show_usage();
+ if (strcmp(applet_name, "zcat") == 0)
+ flags |= gunzip_to_stdout;
+
+ 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 */
}
- 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 */
- 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) {
+ if (argv[optind] == NULL) {
+ flags |= gunzip_to_stdout;
in_file = stdin;
- if ((flags & gunzip_force) == 0) {
- error_msg_and_die("data not written to terminal. Use -f to force it.");
- }
} else {
if_name = strdup(argv[optind]);
/* Open input file */
@@ -139,19 +119,19 @@ extern int gunzip_main(int argc, char **argv)
/* Get the time stamp on the input file. */
if (stat(if_name, &stat_buf) < 0) {
- error_msg_and_die("Couldnt stat file %s",if_name);
+ error_msg_and_die("Couldn't stat file %s", if_name);
}
}
+ /* Check that the input is sane. */
+ if (isatty(fileno(in_file)) && (flags & gunzip_force) == 0)
+ error_msg_and_die("compressed data not read from terminal. Use -f to force it.");
+
/* Set output filename and number */
- if (flags & gunzip_to_stdout) {
- out_file = stdout;
- /* whats the best way to do this with streams ? */
- if (isatty(fileno(out_file)) && ((flags & gunzip_force) == 0)) {
- error_msg_and_die("data not written to terminal. Use -f to force it.");
- }
- } else if (flags & gunzip_test) {
+ if (flags & gunzip_test) {
out_file = xfopen("/dev/null", "w"); /* why does test use filenum 2 ? */
+ } else if (flags & gunzip_to_stdout) {
+ out_file = stdout;
} else {
char *extension;
int length = strlen(if_name);