When pid 1 crashes, the getty unit for the console will happily keep
running which means we end up with two shells competing for the same
tty. Let's call vhangup on /dev/console to kill every other process
attached to the console before we spawn the crash shell. The getty
units have Restart=always but lucky for us, pid 1 just crashed in fire
and flames so it isn't actually able to restart the getty unit.
return RET_NERRNO(ioctl(fd, TIOCVHANGUP));
}
+int terminal_vhangup(const char *tty) {
+ _cleanup_close_ int fd = -EBADF;
+
+ assert(tty);
+
+ fd = open_terminal(tty, O_RDWR|O_NOCTTY|O_CLOEXEC);
+ if (fd < 0)
+ return fd;
+
+ return terminal_vhangup_fd(fd);
+}
+
int vt_disallocate(const char *tty_path) {
assert(tty_path);
ColorMode color_mode_from_string(const char *s) _pure_;
int terminal_vhangup_fd(int fd);
+int terminal_vhangup(const char *tty);
int terminal_set_size_fd(int fd, const char *ident, unsigned rows, unsigned cols);
int proc_cmdline_tty_size(const char *tty, unsigned *ret_rows, unsigned *ret_cols);
"MESSAGE_ID=" SD_MESSAGE_CRASH_SHELL_FORK_FAILED_STR);
else if (pid == 0) {
(void) setsid();
+ (void) terminal_vhangup("/dev/console");
(void) make_console_stdio();
(void) rlimit_nofile_safe();
(void) execle("/bin/sh", "/bin/sh", NULL, environ);