diff options
Diffstat (limited to 'archival/rpm.c')
-rw-r--r-- | archival/rpm.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/archival/rpm.c b/archival/rpm.c index 71ed32e41..674ee2640 100644 --- a/archival/rpm.c +++ b/archival/rpm.c | |||
@@ -187,10 +187,11 @@ int rpm_main(int argc, char **argv) | |||
187 | 187 | ||
188 | static void extract_cpio_gz(int fd) | 188 | static void extract_cpio_gz(int fd) |
189 | { | 189 | { |
190 | USE_DESKTOP(long long) int (*xformer)(int src_fd, int dst_fd); | ||
190 | archive_handle_t *archive_handle; | 191 | archive_handle_t *archive_handle; |
191 | unsigned char magic[2]; | 192 | unsigned char magic[2]; |
192 | 193 | ||
193 | /* Initialise */ | 194 | /* Initialize */ |
194 | archive_handle = init_handle(); | 195 | archive_handle = init_handle(); |
195 | archive_handle->seek = seek_by_read; | 196 | archive_handle->seek = seek_by_read; |
196 | //archive_handle->action_header = header_list; | 197 | //archive_handle->action_header = header_list; |
@@ -201,16 +202,26 @@ static void extract_cpio_gz(int fd) | |||
201 | archive_handle->offset = 0; | 202 | archive_handle->offset = 0; |
202 | 203 | ||
203 | xread(archive_handle->src_fd, &magic, 2); | 204 | xread(archive_handle->src_fd, &magic, 2); |
205 | xformer = unpack_gz_stream; | ||
204 | if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { | 206 | if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { |
205 | bb_error_msg_and_die("invalid gzip magic"); | 207 | if (ENABLE_FEATURE_RPM_BZ2 |
206 | } | 208 | && (magic[0] == 0x42) && (magic[1] == 0x5a)) { |
207 | check_header_gzip_or_die(archive_handle->src_fd); | 209 | xformer = unpack_bz2_stream; |
208 | xchdir("/"); /* Install RPM's to root */ | 210 | /* We can do better, need modifying unpack_bz2_stream to not require |
211 | * first 2 bytes. Not very hard to do... I mean, TODO :) */ | ||
212 | xlseek(archive_handle->src_fd, -2, SEEK_CUR); | ||
213 | } else | ||
214 | bb_error_msg_and_die("no gzip" | ||
215 | USE_FEATURE_RPM_BZ2("/bzip") | ||
216 | " magic"); | ||
217 | } else | ||
218 | check_header_gzip_or_die(archive_handle->src_fd); | ||
209 | 219 | ||
210 | archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip); | 220 | xchdir("/"); /* Install RPM's to root */ |
221 | archive_handle->src_fd = open_transformer(archive_handle->src_fd, xformer); | ||
211 | archive_handle->offset = 0; | 222 | archive_handle->offset = 0; |
212 | while (get_header_cpio(archive_handle) == EXIT_SUCCESS) | 223 | while (get_header_cpio(archive_handle) == EXIT_SUCCESS) |
213 | /* loop */; | 224 | continue; |
214 | } | 225 | } |
215 | 226 | ||
216 | 227 | ||