summaryrefslogtreecommitdiff
path: root/archival/rpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'archival/rpm.c')
-rw-r--r--archival/rpm.c26
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
188static void extract_cpio_gz(int fd) 188static 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;