terminal: shutdown (or --hold) when the client process terminates

Shutdown the terminal when the client process terminates, not when the
ptmx file descriptor is closed.

This fixes an issue where the terminal remains running after the
client process has terminated, if it spawned child processes that
inherited the ptmx file descriptor.
This commit is contained in:
Daniel Eklöf 2020-12-26 01:29:40 +01:00
parent 3c6789fb8b
commit 8b0ef6aa85
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 28 additions and 6 deletions

View file

@ -33,6 +33,11 @@
### Deprecated
### Removed
### Fixed
* Exit when the client application terminates, not when the TTY file
descriptor is closed.
### Security
### Contributors

View file

@ -13,6 +13,7 @@
#include "async.h"
#include "config.h"
#include "reaper.h"
#include "sixel.h"
#include "user-notification.h"
#include "vt.h"
@ -134,6 +135,9 @@ notify_notify(const struct terminal *term, const char *title, const char *body)
{
}
void reaper_add(struct reaper *reaper, pid_t pid, reaper_cb cb, void *cb_data) {}
int
main(int argc, const char *const *argv)
{

View file

@ -314,12 +314,8 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
}
if (hup) {
if (term->conf->hold_at_exit) {
fdm_del(fdm, fd);
term->ptmx = -1;
return true;
} else
return term_shutdown(term);
fdm_del(fdm, fd);
term->ptmx = -1;
}
return true;
@ -954,6 +950,21 @@ load_fonts_from_conf(struct terminal *term)
return reload_fonts(term);
}
static bool
slave_died(struct reaper *reaper, pid_t pid, void *data)
{
struct terminal *term = data;
LOG_DBG("slave (PID=%u) died", pid);
if (term->conf->hold_at_exit) {
fdm_del(term->fdm, term->ptmx);
term->ptmx = -1;
return true;
}
return term_shutdown(term);
}
struct terminal *
term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
struct wayland *wayl, const char *foot_exe, const char *cwd,
@ -1159,6 +1170,8 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
goto err;
}
reaper_add(term->reaper, term->slave, &slave_died, term);
/* Guess scale; we're not mapped yet, so we don't know on which
* output we'll be. Pick highest scale we find for now */
tll_foreach(term->wl->monitors, it) {