Annotation of /trunk/mkinitrd-magellan/busybox/archival/bunzip2.c
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1731 byte(s)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1731 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | * Modified for busybox by Glenn McGrath <bug1@iinet.net.au> | ||
4 | * Added support output to stdout by Thomas Lundquist <thomasez@zelow.no> | ||
5 | * | ||
6 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
7 | */ | ||
8 | |||
9 | #include "busybox.h" | ||
10 | #include "unarchive.h" | ||
11 | |||
12 | #define BUNZIP2_OPT_STDOUT 1 | ||
13 | #define BUNZIP2_OPT_FORCE 2 | ||
14 | |||
15 | int bunzip2_main(int argc, char **argv) | ||
16 | { | ||
17 | USE_DESKTOP(long long) int status; | ||
18 | char *filename; | ||
19 | unsigned opt; | ||
20 | int src_fd, dst_fd; | ||
21 | |||
22 | opt = getopt32(argc, argv, "cf"); | ||
23 | |||
24 | /* Set input filename and number */ | ||
25 | filename = argv[optind]; | ||
26 | if (filename && NOT_LONE_DASH(filename)) { | ||
27 | /* Open input file */ | ||
28 | src_fd = xopen(filename, O_RDONLY); | ||
29 | } else { | ||
30 | src_fd = STDIN_FILENO; | ||
31 | filename = 0; | ||
32 | } | ||
33 | |||
34 | /* if called as bzcat force the stdout flag */ | ||
35 | if ((opt & BUNZIP2_OPT_STDOUT) || applet_name[2] == 'c') | ||
36 | filename = 0; | ||
37 | |||
38 | /* Check that the input is sane. */ | ||
39 | if (isatty(src_fd) && (opt & BUNZIP2_OPT_FORCE) == 0) { | ||
40 | bb_error_msg_and_die("compressed data not read from terminal, " | ||
41 | "use -f to force it"); | ||
42 | } | ||
43 | |||
44 | if (filename) { | ||
45 | struct stat stat_buf; | ||
46 | /* extension = filename+strlen(filename)-4 is buggy: | ||
47 | * strlen may be less than 4 */ | ||
48 | char *extension = strrchr(filename, '.'); | ||
49 | if (!extension || strcmp(extension, ".bz2") != 0) { | ||
50 | bb_error_msg_and_die("invalid extension"); | ||
51 | } | ||
52 | xstat(filename, &stat_buf); | ||
53 | *extension = '\0'; | ||
54 | dst_fd = xopen3(filename, O_WRONLY | O_CREAT | O_TRUNC, | ||
55 | stat_buf.st_mode); | ||
56 | } else dst_fd = STDOUT_FILENO; | ||
57 | status = uncompressStream(src_fd, dst_fd); | ||
58 | if (filename) { | ||
59 | if (status >= 0) filename[strlen(filename)] = '.'; | ||
60 | if (unlink(filename) < 0) { | ||
61 | bb_error_msg_and_die("cannot remove %s", filename); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | return status; | ||
66 | } |