#include #include #include #include #include #include "fatal.h" #include "subproc.h" void fork_child(const char **av, int *ifdp, int *ofdp, int *efdp) { int ip[2]; int op[2]; int ep[2]; pid_t kid; if ( (pipe(&ip[0]) < 0) || (pipe(&op[0]) < 0) || (pipe(&ep[0]) < 0) ) { fatal("pipe: %s",strerror(errno)); exit(1); } kid = fork(); if (kid < 0) { fatal("fork: %s",strerror(errno)); exit(1); } if (kid == 0) { close(ip[1]); close(op[0]); close(ep[0]); while (ip[0] < 3) ip[0] = dup(ip[0]); while (op[1] < 3) op[1] = dup(op[1]); while (op[1] < 3) ep[1] = dup(ep[1]); dup2(ip[0],0); close(ip[0]); dup2(op[1],1); close(op[1]); dup2(ep[1],2); close(ep[1]); execvp(av[0],(const void *)av); _exit(1); } close(ip[0]); close(op[1]); close(ep[1]); if (ifdp) { *ifdp = ip[1]; fcntl(ip[1],F_SETFL,fcntl(ip[1],F_GETFL,0)|O_NONBLOCK); } else { close(ip[1]); } if (ofdp) { *ofdp = op[0]; fcntl(op[0],F_SETFL,fcntl(op[0],F_GETFL,0)|O_NONBLOCK); } else { close(op[0]); } if (efdp) { *efdp = ep[0]; fcntl(ep[0],F_SETFL,fcntl(ep[0],F_GETFL,0)|O_NONBLOCK); } else { close(ep[0]); } }