From abbc0a1d5c55497140a8f4fcf3fbb3cf9d4e3bc9 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Tue, 16 Jan 2018 16:25:11 +0100 Subject: [PATCH] Fix Ctrl-C, and signals in general, on "logins" in `nologin` mode Signed-off-by: Joachim Nilsson --- docs/TODO.md | 1 - src/getty.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/TODO.md b/docs/TODO.md index 127e2c75..a28bd45d 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -21,7 +21,6 @@ can also be used. Before Release -------------- -* Ctrl-C does not work properly on "logins" in `nologin` mode * Running `initctl restart foo` in the background blocks diff --git a/src/getty.c b/src/getty.c index 169b0fcc..8852488f 100644 --- a/src/getty.c +++ b/src/getty.c @@ -252,6 +252,7 @@ int sh(char *tty) NULL }; size_t len; + struct termios term; /* Detach from initial controlling TTY */ vhangup(); @@ -282,6 +283,17 @@ int sh(char *tty) snprintf(arg0, len, "-%s", _PATH_BSHELL); args[0] = arg0; + /* Reenable Ctrl-D and Ctrl-C, and ... */ + if (!tcgetattr(STDIN_FILENO, &term)) { + term.c_lflag |= ISIG; + term.c_cc[VEOF] = CTL('D'); + term.c_cc[VINTR] = CTL('C'); + tcsetattr(STDIN_FILENO, TCSANOW, &term); + } + + /* ... unblock signals in general */ + sig_unblock(); + return execv(_PATH_BSHELL, args); }