diff --git a/CHANGELOG.md b/CHANGELOG.md index ab3524a0..a430a660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ `shift` to be pressed while used in a mouse grabbing application. This meant the mouse event was never seen by the application. +* Terminals spawned with `ctrl`+`shift`+`n` not terminating when + exiting shell (https://codeberg.org/dnkl/foot/issues/366). ### Security diff --git a/fdm.c b/fdm.c index 548e4230..d0466a6d 100644 --- a/fdm.c +++ b/fdm.c @@ -27,7 +27,6 @@ struct fd_handler { }; struct sig_handler { - int signo; fdm_signal_handler_t callback; void *callback_data; }; diff --git a/slave.c b/slave.c index 432e21ff..ed36a0b1 100644 --- a/slave.c +++ b/slave.c @@ -274,15 +274,10 @@ slave_spawn(int ptmx, int argc, const char *cwd, char *const *argv, _exit(_errno); } - /* Restore signals */ + /* Restore signal mask */ sigset_t mask; sigemptyset(&mask); - const struct sigaction sa = {.sa_handler = SIG_DFL}; - if (sigaction(SIGINT, &sa, NULL) < 0 || - sigaction(SIGTERM, &sa, NULL) < 0 || - sigaction(SIGHUP, &sa, NULL) < 0 || - sigprocmask(SIG_SETMASK, &mask, NULL) < 0) - { + if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) { const int _errno = errno; LOG_ERRNO_P(errno, "failed to restore signals"); (void)!write(fork_pipe[1], &_errno, sizeof(_errno)); diff --git a/spawn.c b/spawn.c index e9fb2f96..5f8fc13b 100644 --- a/spawn.c +++ b/spawn.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,16 @@ spawn(struct reaper *reaper, const char *cwd, char *const argv[], /* Child */ close(pipe_fds[0]); + /* Clear signal mask */ + sigset_t mask; + sigemptyset(&mask); + if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) { + const int _errno = errno; + LOG_ERRNO_P(errno, "failed to restore signals"); + (void)!write(pipe_fds[1], &_errno, sizeof(_errno)); + _exit(_errno); + } + if ((stdin_fd >= 0 && (dup2(stdin_fd, STDIN_FILENO) < 0 || close(stdin_fd) < 0)) || (stdout_fd >= 0 && (dup2(stdout_fd, STDOUT_FILENO) < 0 || close(stdout_fd) < 0)) || (stderr_fd >= 0 && (dup2(stderr_fd, STDERR_FILENO) < 0 || close(stderr_fd) < 0)) ||