int child_handle_noninteractive(int fd, wshd_t *w, msg_request_t *req) { int i, j; int p[4][2]; int p_[4]; int rv; msg_response_t res; msg_response_init(&res); /* Initialize so that the error handler can do its job */ for (i = 0; i < 4; i++) { p[i][0] = -1; p[i][1] = -1; p_[i] = -1; } for (i = 0; i < 4; i++) { rv = pipe(p[i]); if (rv == -1) { perror("pipe"); abort(); } fcntl_mix_cloexec(p[i][0]); fcntl_mix_cloexec(p[i][1]); } /* Descriptors to send to client */ p_[0] = p[0][1]; p_[1] = p[1][0]; p_[2] = p[2][0]; p_[3] = p[3][0]; rv = un_send_fds(fd, (char *)&res, sizeof(res), p_, 4); if (rv == -1) { goto err; } rv = child_fork(req, p[0][0], p[1][1], p[2][1]); assert(rv > 0); child_pid_to_fd_add(w, rv, p[3][1]); err: for (i = 0; i < 4; i++) { for (j = 0; j < 2; j++) { if (p[i][j] > -1) { close(p[i][j]); p[i][j] = -1; } } } if (fd > -1) { close(fd); fd = -1; } return 0; }
int fork_pty(t_opt *opt) { int pid; if ((pid = fork()) < 0) { close(opt->fd_master); ft_errorexit("fork have fail"); } if (pid > 0) { return ((opt->pid_c = pid)); } else child_fork(opt); return (0); }