blob: 740e269195ebc15acb2da9cff8026dd99ea146b4 [file] [log] [blame]
Glenn L McGrath60bce492002-11-03 07:28:38 +00001/*
Glenn L McGrathc6992fe2004-04-25 05:11:19 +00002 * Modified for busybox by Glenn McGrath <bug1@iinet.net.au>
Glenn L McGrath60bce492002-11-03 07:28:38 +00003 * Added support output to stdout by Thomas Lundquist <thomasez@zelow.no>
4 *
Rob Landleyc8b8a2d2005-08-30 20:26:17 +00005 * Licensed under GPL v2, see file LICENSE in this tarball for details.
Glenn L McGrath60bce492002-11-03 07:28:38 +00006 */
Glenn L McGrath24e28332001-10-05 03:48:57 +00007
Glenn L McGrath237ae422002-11-03 14:05:15 +00008#include <fcntl.h>
Glenn L McGrathfff11f12001-11-18 14:20:25 +00009#include <getopt.h>
Glenn L McGrath60bce492002-11-03 07:28:38 +000010#include <stdio.h>
11#include <stdlib.h>
Glenn L McGrath237ae422002-11-03 14:05:15 +000012#include <string.h>
Matt Kraai9cdb0602002-03-27 17:31:01 +000013#include <unistd.h>
Glenn L McGrath24e28332001-10-05 03:48:57 +000014
Glenn L McGrath60bce492002-11-03 07:28:38 +000015#include "busybox.h"
16#include "unarchive.h"
Glenn L McGrath24e28332001-10-05 03:48:57 +000017
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000018#define BUNZIP2_OPT_STDOUT 1
19#define BUNZIP2_OPT_FORCE 2
20
Glenn L McGrath24e28332001-10-05 03:48:57 +000021int bunzip2_main(int argc, char **argv)
22{
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000023 char *filename;
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000024 unsigned long opt;
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000025 int status, src_fd, dst_fd;
Glenn L McGrathfff11f12001-11-18 14:20:25 +000026
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000027 opt = bb_getopt_ulflags(argc, argv, "cf");
Glenn L McGrathfff11f12001-11-18 14:20:25 +000028
Matt Kraai9cdb0602002-03-27 17:31:01 +000029 /* Set input filename and number */
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000030 filename = argv[optind];
31 if ((filename) && (filename[0] != '-') && (filename[1] != '\0')) {
Matt Kraai9cdb0602002-03-27 17:31:01 +000032 /* Open input file */
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000033 src_fd = bb_xopen(filename, O_RDONLY);
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000034 } else {
Eric Andersen70060d22004-03-27 10:02:48 +000035 src_fd = STDIN_FILENO;
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000036 filename = 0;
Glenn L McGrath24e28332001-10-05 03:48:57 +000037 }
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000038
39 /* if called as bzcat force the stdout flag */
40 if ((opt & BUNZIP2_OPT_STDOUT) || bb_applet_name[2] == 'c')
41 filename = 0;
Glenn L McGrathfff11f12001-11-18 14:20:25 +000042
Matt Kraai9cdb0602002-03-27 17:31:01 +000043 /* Check that the input is sane. */
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000044 if (isatty(src_fd) && (opt & BUNZIP2_OPT_FORCE) == 0) {
Manuel Novoa III cad53642003-03-19 09:13:01 +000045 bb_error_msg_and_die("compressed data not read from terminal. Use -f to force it.");
Glenn L McGrathfff11f12001-11-18 14:20:25 +000046 }
Glenn L McGrath24e28332001-10-05 03:48:57 +000047
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000048 if (filename) {
49 char *extension=filename+strlen(filename)-4;
50 if (strcmp(extension, ".bz2") != 0) {
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000051 bb_error_msg_and_die("Invalid extension");
52 }
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000053 *extension=0;
54 dst_fd = bb_xopen(filename, O_WRONLY | O_CREAT);
55 } else dst_fd = STDOUT_FILENO;
Glenn L McGrathf235d052003-10-29 03:37:54 +000056 status = uncompressStream(src_fd, dst_fd);
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000057 if(filename) {
58 if (!status) filename[strlen(filename)]='.';
59 if (unlink(filename) < 0) {
60 bb_error_msg_and_die("Couldn't remove %s", filename);
Glenn L McGrath6cb3bc02004-01-05 11:49:55 +000061 }
Matt Kraaicf32ac52002-03-27 17:46:44 +000062 }
63
64 return status;
Glenn L McGrath24e28332001-10-05 03:48:57 +000065}
Rob Landleyc8b8a2d2005-08-30 20:26:17 +000066/* vi:set ts=4: */