Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/archival/libunarchive/open_transformer.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/archival/libunarchive/open_transformer.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 3 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 3 4 */ 4 5 5 #include <stdlib.h>6 #include <unistd.h>7 8 6 #include "libbb.h" 9 10 7 #include "unarchive.h" 11 8 12 9 /* transformer(), more than meets the eye */ 13 int open_transformer(int src_fd, int (*transformer)(int src_fd, int dst_fd)) 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 */ 14 int open_transformer(int src_fd, 15 USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd), 16 const char *transform_prog, ...) 14 17 { 15 18 int fd_pipe[2]; 16 19 int pid; 17 20 18 if (pipe(fd_pipe) != 0) { 19 bb_perror_msg_and_die("Can't create pipe"); 20 } 21 xpipe(fd_pipe); 21 22 23 #if BB_MMU 22 24 pid = fork(); 23 if (pid == -1) { 24 bb_perror_msg_and_die("Fork failed"); 25 } 25 #else 26 pid = vfork(); 27 #endif 28 if (pid == -1) 29 bb_perror_msg_and_die("fork failed"); 26 30 27 31 if (pid == 0) { 32 #if !BB_MMU 33 va_list ap; 34 #endif 28 35 /* child process */ 29 close(fd_pipe[0]); /* We don't wan't to read from the parent */ 30 transformer(src_fd, fd_pipe[1]); 31 close(fd_pipe[1]); /* Send EOF */ 32 close(src_fd); 33 exit(0); 34 /* notreached */ 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 */ 35 53 } 36 54 … … 38 56 close(fd_pipe[1]); /* Don't want to write to the child */ 39 57 40 return (fd_pipe[0]);58 return fd_pipe[0]; 41 59 }
Note:
See TracChangeset
for help on using the changeset viewer.