[BusyBox] bunzip2/bzcat STDIN

Matt Kraai kraai at alumni.cmu.edu
Wed Mar 27 11:10:03 UTC 2002


On Wed, Mar 27, 2002 at 05:50:29PM +0000, Per Wigren wrote:
> So how do I make it read from STDIN?
> 
> # cat file.bz2 | busybox bzcat
> BusyBox v0.61.pre (2002.03.27-11:30+0000) multi-call binary
> 
> Usage: bzcat FILE
> # cat file.bz2 | busybox bzcat -
> bzcat: -: No such file or directory

You wait for the anonymous CVS repository to catch up, or you
apply the following patch.  :)

Matt

Index: archival/bunzip2.c
===================================================================
RCS file: /var/cvs/busybox/archival/bunzip2.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 bunzip2.c
--- archival/bunzip2.c	20 Dec 2001 23:12:45 -0000	1.5
+++ archival/bunzip2.c	27 Mar 2002 17:22:28 -0000
@@ -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: include/usage.h
===================================================================
RCS file: /var/cvs/busybox/include/usage.h,v
retrieving revision 1.84
diff -u -p -u -p -r1.84 usage.h
--- include/usage.h	20 Mar 2002 17:38:36 -0000	1.84
+++ include/usage.h	27 Mar 2002 17:22:29 -0000
@@ -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"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
Url : http://lists.busybox.net/pipermail/busybox/attachments/20020327/819275f1/attachment.pgp 


More information about the busybox mailing list