aboutsummaryrefslogtreecommitdiff
path: root/archival/libunarchive/open_transformer.c
diff options
context:
space:
mode:
authorGravatar Denis Vlasenko <vda.linux@googlemail.com>2007-09-05 11:48:32 +0000
committerGravatar Denis Vlasenko <vda.linux@googlemail.com>2007-09-05 11:48:32 +0000
commit211f7f88ae67e875bed50409b2edbb6d740fc648 (patch)
treeae37652f75374919fff81e732fd2ab867e6a947a /archival/libunarchive/open_transformer.c
parentbeffd43d8e393b68787a00d9c6078a2b367afd01 (diff)
downloadbusybox-211f7f88ae67e875bed50409b2edbb6d740fc648.tar.gz
busybox-211f7f88ae67e875bed50409b2edbb6d740fc648.tar.bz2
tar + gzip/bzip2/etc: support NOMMU machines (by Alex Landau <landau_alex@yahoo.com>)
Diffstat (limited to 'archival/libunarchive/open_transformer.c')
-rw-r--r--archival/libunarchive/open_transformer.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/archival/libunarchive/open_transformer.c b/archival/libunarchive/open_transformer.c
index 93f01be6f..f8f587e8d 100644
--- a/archival/libunarchive/open_transformer.c
+++ b/archival/libunarchive/open_transformer.c
@@ -7,29 +7,48 @@
#include "unarchive.h"
/* transformer(), more than meets the eye */
+/*
+ * On MMU machine, the transform_prog and ... are stripped
+ * by a macro in include/unarchive.h. On NOMMU, transformer is stripped.
+ */
int open_transformer(int src_fd,
- USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd))
+ USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd),
+ const char *transform_prog, ...)
{
int fd_pipe[2];
int pid;
xpipe(fd_pipe);
+#if BB_MMU
pid = fork();
- if (pid == -1) {
+#else
+ pid = vfork();
+#endif
+ if (pid == -1)
bb_perror_msg_and_die("fork failed");
- }
if (pid == 0) {
+#if !BB_MMU
+ va_list ap;
+#endif
/* child process */
close(fd_pipe[0]); /* We don't wan't to read from the parent */
// FIXME: error check?
+#if BB_MMU
transformer(src_fd, fd_pipe[1]);
if (ENABLE_FEATURE_CLEAN_UP) {
close(fd_pipe[1]); /* Send EOF */
close(src_fd);
}
exit(0);
+#else
+ xmove_fd(src_fd, 0);
+ xmove_fd(fd_pipe[1], 1);
+ va_start(ap, transform_prog);
+ BB_EXECVP(transform_prog, ap);
+ bb_perror_and_die("exec failed");
+#endif
/* notreached */
}