Annotation of /trunk/mkinitrd-magellan/busybox/archival/rpm2cpio.c
Parent Directory | Revision Log
Revision 1123 -
(hide annotations)
(download)
Wed Aug 18 21:56:57 2010 UTC (13 years, 8 months ago) by niro
File MIME type: text/plain
File size: 2874 byte(s)
Wed Aug 18 21:56:57 2010 UTC (13 years, 8 months ago) by niro
File MIME type: text/plain
File size: 2874 byte(s)
-updated to busybox-1.17.1
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | * Mini rpm2cpio implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2001 by Laurence Anderson | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
8 | */ | ||
9 | niro | 816 | #include "libbb.h" |
10 | niro | 532 | #include "unarchive.h" |
11 | niro | 1123 | #include "rpm.h" |
12 | niro | 532 | |
13 | niro | 984 | enum { rpm_fd = STDIN_FILENO }; |
14 | |||
15 | static unsigned skip_header(void) | ||
16 | niro | 532 | { |
17 | struct rpm_header header; | ||
18 | niro | 984 | unsigned len; |
19 | niro | 532 | |
20 | niro | 984 | xread(rpm_fd, &header, sizeof(header)); |
21 | // if (strncmp((char *) &header.magic, RPM_HEADER_MAGIC_STR, 3) != 0) { | ||
22 | // bb_error_msg_and_die("invalid RPM header magic"); | ||
23 | // } | ||
24 | // if (header.version != 1) { | ||
25 | // bb_error_msg_and_die("unsupported RPM header version"); | ||
26 | // } | ||
27 | if (header.magic_and_ver != htonl(RPM_HEADER_MAGICnVER)) { | ||
28 | bb_error_msg_and_die("invalid RPM header magic or unsupported version"); | ||
29 | // ": %x != %x", header.magic_and_ver, htonl(RPM_HEADER_MAGICnVER)); | ||
30 | niro | 532 | } |
31 | niro | 984 | |
32 | /* Seek past index entries, and past store */ | ||
33 | len = 16 * ntohl(header.entries) + ntohl(header.size); | ||
34 | seek_by_jump(rpm_fd, len); | ||
35 | |||
36 | return sizeof(header) + len; | ||
37 | niro | 532 | } |
38 | |||
39 | /* No getopt required */ | ||
40 | niro | 816 | int rpm2cpio_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
41 | niro | 984 | int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) |
42 | niro | 532 | { |
43 | struct rpm_lead lead; | ||
44 | niro | 984 | unsigned pos; |
45 | niro | 532 | |
46 | niro | 984 | if (argv[1]) { |
47 | xmove_fd(xopen(argv[1], O_RDONLY), rpm_fd); | ||
48 | niro | 532 | } |
49 | niro | 984 | xread(rpm_fd, &lead, sizeof(lead)); |
50 | niro | 532 | |
51 | niro | 984 | /* Just check the magic, the rest is irrelevant */ |
52 | niro | 1123 | if (lead.magic != htonl(RPM_LEAD_MAGIC)) { |
53 | niro | 984 | bb_error_msg_and_die("invalid RPM magic"); |
54 | niro | 532 | } |
55 | |||
56 | niro | 984 | /* Skip the signature header, align to 8 bytes */ |
57 | pos = skip_header(); | ||
58 | niro | 1123 | seek_by_jump(rpm_fd, (-(int)pos) & 7); |
59 | niro | 532 | |
60 | /* Skip the main header */ | ||
61 | niro | 984 | skip_header(); |
62 | niro | 532 | |
63 | niro | 1123 | #if 0 |
64 | /* This works, but doesn't report uncompress errors (they happen in child) */ | ||
65 | setup_unzip_on_fd(rpm_fd /*fail_if_not_detected: 1*/); | ||
66 | if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0) | ||
67 | bb_error_msg_and_die("error unpacking"); | ||
68 | #else | ||
69 | /* BLOAT */ | ||
70 | { | ||
71 | union { | ||
72 | uint8_t b[4]; | ||
73 | uint16_t b16[2]; | ||
74 | uint32_t b32[1]; | ||
75 | } magic; | ||
76 | IF_DESKTOP(long long) int FAST_FUNC (*unpack)(int src_fd, int dst_fd); | ||
77 | |||
78 | xread(rpm_fd, magic.b16, sizeof(magic.b16[0])); | ||
79 | if (magic.b16[0] == GZIP_MAGIC) { | ||
80 | unpack = unpack_gz_stream; | ||
81 | } else | ||
82 | if (ENABLE_FEATURE_SEAMLESS_BZ2 | ||
83 | && magic.b16[0] == BZIP2_MAGIC | ||
84 | niro | 984 | ) { |
85 | niro | 1123 | unpack = unpack_bz2_stream; |
86 | } else | ||
87 | if (ENABLE_FEATURE_SEAMLESS_XZ | ||
88 | && magic.b16[0] == XZ_MAGIC1 | ||
89 | ) { | ||
90 | xread(rpm_fd, magic.b32, sizeof(magic.b32[0])); | ||
91 | if (magic.b32[0] != XZ_MAGIC2) | ||
92 | goto no_magic; | ||
93 | /* unpack_xz_stream wants fd at position 6, no need to seek */ | ||
94 | //xlseek(rpm_fd, -6, SEEK_CUR); | ||
95 | unpack = unpack_xz_stream; | ||
96 | } else { | ||
97 | no_magic: | ||
98 | bb_error_msg_and_die("no gzip" | ||
99 | niro | 984 | IF_FEATURE_SEAMLESS_BZ2("/bzip2") |
100 | niro | 1123 | IF_FEATURE_SEAMLESS_XZ("/xz") |
101 | niro | 984 | " magic"); |
102 | } | ||
103 | niro | 1123 | if (unpack(rpm_fd, STDOUT_FILENO) < 0) |
104 | bb_error_msg_and_die("error unpacking"); | ||
105 | niro | 532 | } |
106 | niro | 1123 | #endif |
107 | niro | 532 | |
108 | niro | 984 | if (ENABLE_FEATURE_CLEAN_UP) { |
109 | close(rpm_fd); | ||
110 | } | ||
111 | niro | 532 | |
112 | return 0; | ||
113 | } |