diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-05 15:48:32 +0400 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-05 15:48:32 +0400 |
commit | 211f7f88ae67e875bed50409b2edbb6d740fc648 (patch) | |
tree | ae37652f75374919fff81e732fd2ab867e6a947a /archival/libunarchive/open_transformer.c | |
parent | beffd43d8e393b68787a00d9c6078a2b367afd01 (diff) |
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.c | 25 |
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 */ } |