diff --git a/main.c b/main.c index 7c04e853..15a1189b 100644 --- a/main.c +++ b/main.c @@ -205,6 +205,7 @@ main(int argc, char *const *argv) if (as_server && (server = server_init(&conf, fdm, wayl)) == NULL) goto out; + /* Remember to restore signals in slave */ const struct sigaction sa = {.sa_handler = &sig_handler}; if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) { LOG_ERRNO("failed to register signal handlers"); diff --git a/slave.c b/slave.c index 939293dd..0b453c5d 100644 --- a/slave.c +++ b/slave.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,18 @@ slave_spawn(int ptmx, int argc, char *const *argv, /* Child */ close(fork_pipe[0]); /* Close read end */ + /* Restore signals */ + const struct sigaction sa = {.sa_handler = SIG_DFL}; + if (sigaction(SIGINT, &sa, NULL) < 0 || + sigaction(SIGTERM, &sa, NULL) < 0 || + sigaction(SIGHUP, &sa, NULL) < 0) + { + const int _errno = errno; + LOG_ERRNO_P("failed to restore signals", errno); + (void)!write(fork_pipe[1], &_errno, sizeof(_errno)); + _exit(_errno); + } + setenv("TERM", term_env, 1); char **_shell_argv = NULL; @@ -134,7 +147,6 @@ slave_spawn(int ptmx, int argc, char *const *argv, LOG_ERRNO("failed to set FD_CLOEXEC on ptmx"); return -1; } - break; } }