diff options
Diffstat (limited to 'archival/rpm.c')
-rw-r--r-- | archival/rpm.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/archival/rpm.c b/archival/rpm.c index 674ee2640..4d723b73f 100644 --- a/archival/rpm.c +++ b/archival/rpm.c | |||
@@ -187,9 +187,15 @@ 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); | ||
191 | archive_handle_t *archive_handle; | 190 | archive_handle_t *archive_handle; |
192 | unsigned char magic[2]; | 191 | unsigned char magic[2]; |
192 | #if BB_MMU | ||
193 | USE_DESKTOP(long long) int (*xformer)(int src_fd, int dst_fd); | ||
194 | enum { xformer_prog = 0 }; | ||
195 | #else | ||
196 | enum { xformer = 0 }; | ||
197 | const char *xformer_prog; | ||
198 | #endif | ||
193 | 199 | ||
194 | /* Initialize */ | 200 | /* Initialize */ |
195 | archive_handle = init_handle(); | 201 | archive_handle = init_handle(); |
@@ -202,11 +208,19 @@ static void extract_cpio_gz(int fd) | |||
202 | archive_handle->offset = 0; | 208 | archive_handle->offset = 0; |
203 | 209 | ||
204 | xread(archive_handle->src_fd, &magic, 2); | 210 | xread(archive_handle->src_fd, &magic, 2); |
211 | #if BB_MMU | ||
205 | xformer = unpack_gz_stream; | 212 | xformer = unpack_gz_stream; |
213 | #else | ||
214 | xformer_prog = "gunzip"; | ||
215 | #endif | ||
206 | if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { | 216 | if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { |
207 | if (ENABLE_FEATURE_RPM_BZ2 | 217 | if (ENABLE_FEATURE_RPM_BZ2 |
208 | && (magic[0] == 0x42) && (magic[1] == 0x5a)) { | 218 | && (magic[0] == 0x42) && (magic[1] == 0x5a)) { |
219 | #if BB_MMU | ||
209 | xformer = unpack_bz2_stream; | 220 | xformer = unpack_bz2_stream; |
221 | #else | ||
222 | xformer_prog = "bunzip2"; | ||
223 | #endif | ||
210 | /* We can do better, need modifying unpack_bz2_stream to not require | 224 | /* We can do better, need modifying unpack_bz2_stream to not require |
211 | * first 2 bytes. Not very hard to do... I mean, TODO :) */ | 225 | * first 2 bytes. Not very hard to do... I mean, TODO :) */ |
212 | xlseek(archive_handle->src_fd, -2, SEEK_CUR); | 226 | xlseek(archive_handle->src_fd, -2, SEEK_CUR); |
@@ -214,11 +228,17 @@ static void extract_cpio_gz(int fd) | |||
214 | bb_error_msg_and_die("no gzip" | 228 | bb_error_msg_and_die("no gzip" |
215 | USE_FEATURE_RPM_BZ2("/bzip") | 229 | USE_FEATURE_RPM_BZ2("/bzip") |
216 | " magic"); | 230 | " magic"); |
217 | } else | 231 | } else { |
218 | check_header_gzip_or_die(archive_handle->src_fd); | 232 | check_header_gzip_or_die(archive_handle->src_fd); |
233 | #if !BB_MMU | ||
234 | /* NOMMU version of open_transformer execs an external unzipper that should | ||
235 | * have the file position at the start of the file */ | ||
236 | xlseek(archive_handle->src_fd, 0, SEEK_SET); | ||
237 | #endif | ||
238 | } | ||
219 | 239 | ||
220 | xchdir("/"); /* Install RPM's to root */ | 240 | xchdir("/"); /* Install RPM's to root */ |
221 | archive_handle->src_fd = open_transformer(archive_handle->src_fd, xformer); | 241 | archive_handle->src_fd = open_transformer(archive_handle->src_fd, xformer, xformer_prog, xformer_prog, "-cf", "-", NULL); |
222 | archive_handle->offset = 0; | 242 | archive_handle->offset = 0; |
223 | while (get_header_cpio(archive_handle) == EXIT_SUCCESS) | 243 | while (get_header_cpio(archive_handle) == EXIT_SUCCESS) |
224 | continue; | 244 | continue; |