blob: cba049f1fa1f5b8b74db7bf3b88cd311006c9b1d [file] [log] [blame]
"Robert P. J. Day"63fc1a92006-07-02 19:47:05 +00001/* vi: set sw=4 ts=4: */
Glenn L McGrath5699b852003-11-15 23:19:05 +00002/*
Bernhard Reutner-Fischercfb53df2006-04-02 21:50:01 +00003 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Glenn L McGrath5699b852003-11-15 23:19:05 +00004 */
5
Glenn L McGrath5699b852003-11-15 23:19:05 +00006#include "libbb.h"
Bernhard Reutner-Fischercfb53df2006-04-02 21:50:01 +00007#include "unarchive.h"
8
Glenn L McGrath5699b852003-11-15 23:19:05 +00009/* transformer(), more than meets the eye */
Denis Vlasenko211f7f82007-09-05 11:48:32 +000010/*
Denis Vlasenko059c9172007-11-12 02:13:12 +000011 * On MMU machine, the transform_prog is removed by macro magic
12 * in include/unarchive.h. On NOMMU, transformer is removed.
Denis Vlasenko211f7f82007-09-05 11:48:32 +000013 */
Denis Vlasenkob6052722008-07-10 17:43:01 +000014void FAST_FUNC open_transformer(int fd,
Denis Vlasenko5e34ff22009-04-21 11:09:40 +000015 IF_DESKTOP(long long) int FAST_FUNC (*transformer)(int src_fd, int dst_fd),
Denis Vlasenko059c9172007-11-12 02:13:12 +000016 const char *transform_prog)
Glenn L McGrath5699b852003-11-15 23:19:05 +000017{
Denis Vlasenko37188322008-02-16 13:20:56 +000018 struct fd_pair fd_pipe;
Glenn L McGrath5699b852003-11-15 23:19:05 +000019 int pid;
20
Denis Vlasenko37188322008-02-16 13:20:56 +000021 xpiped_pair(fd_pipe);
Pascal Bellard926031b2010-07-04 15:32:38 +020022 pid = BB_MMU ? xfork() : xvfork();
Glenn L McGrath5699b852003-11-15 23:19:05 +000023 if (pid == 0) {
Pascal Bellard926031b2010-07-04 15:32:38 +020024 /* Child */
Denis Vlasenkob6052722008-07-10 17:43:01 +000025 close(fd_pipe.rd); /* we don't want to read from the parent */
Denis Vlasenkoea620772006-10-14 02:23:43 +000026 // FIXME: error check?
Denis Vlasenko211f7f82007-09-05 11:48:32 +000027#if BB_MMU
Denis Vlasenkob6052722008-07-10 17:43:01 +000028 transformer(fd, fd_pipe.wr);
Denis Vlasenko7e0fbf92007-09-04 19:33:22 +000029 if (ENABLE_FEATURE_CLEAN_UP) {
Denis Vlasenkob6052722008-07-10 17:43:01 +000030 close(fd_pipe.wr); /* send EOF */
31 close(fd);
Denis Vlasenko7e0fbf92007-09-04 19:33:22 +000032 }
Denis Vlasenko2649f212008-06-26 03:26:57 +000033 /* must be _exit! bug was actually seen here */
34 _exit(EXIT_SUCCESS);
Denis Vlasenko211f7f82007-09-05 11:48:32 +000035#else
Denis Vlasenko059c9172007-11-12 02:13:12 +000036 {
37 char *argv[4];
Denis Vlasenkob6052722008-07-10 17:43:01 +000038 xmove_fd(fd, 0);
Denis Vlasenko37188322008-02-16 13:20:56 +000039 xmove_fd(fd_pipe.wr, 1);
Denis Vlasenko059c9172007-11-12 02:13:12 +000040 argv[0] = (char*)transform_prog;
41 argv[1] = (char*)"-cf";
42 argv[2] = (char*)"-";
43 argv[3] = NULL;
44 BB_EXECVP(transform_prog, argv);
Denis Vlasenkof9d4fc32009-04-21 20:40:51 +000045 bb_perror_msg_and_die("can't execute '%s'", transform_prog);
Denis Vlasenko059c9172007-11-12 02:13:12 +000046 }
Denis Vlasenko211f7f82007-09-05 11:48:32 +000047#endif
Denis Vlasenkoea620772006-10-14 02:23:43 +000048 /* notreached */
Glenn L McGrath5699b852003-11-15 23:19:05 +000049 }
Glenn L McGrath20872be2003-11-18 21:31:19 +000050
Glenn L McGrath5699b852003-11-15 23:19:05 +000051 /* parent process */
Denis Vlasenkob6052722008-07-10 17:43:01 +000052 close(fd_pipe.wr); /* don't want to write to the child */
53 xmove_fd(fd_pipe.rd, fd);
Glenn L McGrath5699b852003-11-15 23:19:05 +000054}