From 211f7f88ae67e875bed50409b2edbb6d740fc648 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Wed, 5 Sep 2007 11:48:32 +0000 Subject: tar + gzip/bzip2/etc: support NOMMU machines (by Alex Landau ) --- archival/libunarchive/open_transformer.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'archival/libunarchive/open_transformer.c') 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 */ } -- cgit v1.2.3