source: MondoRescue/branches/2.2.9/mindi-busybox/archival/libunarchive/open_transformer.c@ 3320

Last change on this file since 3320 was 3320, checked in by Bruno Cornec, 9 years ago
  • Re-add (thanks git BTW) the 2.2.9 branch which had been destroyed in the move to 3.0
  • Property svn:eol-style set to native
File size: 1.2 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
4 */
5
6#include "libbb.h"
7#include "unarchive.h"
8
9/* transformer(), more than meets the eye */
10/*
11 * On MMU machine, the transform_prog and ... are stripped
12 * by a macro in include/unarchive.h. On NOMMU, transformer is stripped.
13 */
14int open_transformer(int src_fd,
15 USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd),
16 const char *transform_prog, ...)
17{
18 int fd_pipe[2];
19 int pid;
20
21 xpipe(fd_pipe);
22
23#if BB_MMU
24 pid = fork();
25#else
26 pid = vfork();
27#endif
28 if (pid == -1)
29 bb_perror_msg_and_die("fork failed");
30
31 if (pid == 0) {
32#if !BB_MMU
33 va_list ap;
34#endif
35 /* child process */
36 close(fd_pipe[0]); /* We don't wan't to read from the parent */
37 // FIXME: error check?
38#if BB_MMU
39 transformer(src_fd, fd_pipe[1]);
40 if (ENABLE_FEATURE_CLEAN_UP) {
41 close(fd_pipe[1]); /* Send EOF */
42 close(src_fd);
43 }
44 exit(0);
45#else
46 xmove_fd(src_fd, 0);
47 xmove_fd(fd_pipe[1], 1);
48 va_start(ap, transform_prog);
49 BB_EXECVP(transform_prog, ap);
50 bb_perror_and_die("exec failed");
51#endif
52 /* notreached */
53 }
54
55 /* parent process */
56 close(fd_pipe[1]); /* Don't want to write to the child */
57
58 return fd_pipe[0];
59}
Note: See TracBrowser for help on using the repository browser.