4 #define _POSIX_C_SOURCE 200809L
16 static void accept_signal(int const signum
, bool const accept
) {
17 if (signal(signum
, accept
? SIG_DFL
: SIG_IGN
) == SIG_ERR
) {
22 static void accept_interactive_signals(bool const accept
) {
23 accept_signal(SIGINT
, accept
);
24 accept_signal(SIGQUIT
, accept
);
25 accept_signal(SIGTSTP
, accept
);
28 static Pipe
make_pipe() {
31 if (pipe(fds
) == -1) {
39 static void move_fd(int const old
, int const new) {
40 if (dup2(old
, new) == -1) {
46 static int wait_script(pid_t
const pid
) {
47 int status
= try_waitpid(pid
, WUNTRACED
);
48 while (WIFSTOPPED(status
)) {
49 if (WSTOPSIG(status
) == SIGTSTP
) {
50 accept_signal(SIGTSTP
, true);
52 accept_signal(SIGTSTP
, false);
54 status
= try_waitpid(pid
, WUNTRACED
);
56 if (WIFSIGNALED(status
)) {
57 switch (WTERMSIG(status
)) {
59 accept_signal(SIGINT
, true);
61 case SIGQUIT
: exit(EXIT_FAILURE
);