| From 6eb1c01e9dd25a73100f06db37190c63fd57d4d9 Mon Sep 17 00:00:00 2001 |
| From: Karel Zak <kzak@redhat.com> |
| Date: Fri, 30 Jul 2021 11:50:46 +0200 |
| Subject: [PATCH] agetty: use CTRL+C to erase username |
| |
| aggety(8) from the beginning ignores ^C (the small exception was |
| between 2.32 and 2.34 when this char has been misinterpreted). |
| |
| This patch forces agetty to interpret ^C like ^U, it means to |
| erase the user's input and wait for a completely new username. |
| The small difference is that for ^C it does not set 'kill character'. |
| |
| This change does not affect serial lines where ^C is still ignored like |
| in previous decades. I'd like to avoid any regression as I have |
| no clue if any serial lines do not send this control char in some |
| context ... |
| |
| Fixes: https://github.com/karelzak/util-linux/issues/1399 |
| References: https://github.com/karelzak/util-linux/issues/1046 |
| Signed-off-by: Karel Zak <kzak@redhat.com> |
| --- |
| term-utils/agetty.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/term-utils/agetty.c b/term-utils/agetty.c |
| index 3b3d5101a..d072d64d3 100644 |
| --- a/term-utils/agetty.c |
| +++ b/term-utils/agetty.c |
| @@ -2267,6 +2267,11 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t |
| break; |
| case CTL('U'): |
| cp->kill = ascval; /* set kill character */ |
| + /* fallthrough */ |
| + case CTL('C'): |
| + if (key == CTL('C') && !(op->flags & F_VCONSOLE)) |
| + /* Ignore CTRL+C on serial line */ |
| + break; |
| while (bp > logname) { |
| if ((tp->c_lflag & ECHO) == 0) |
| write_all(1, erase[cp->parity], 3); |
| @@ -2275,9 +2280,6 @@ static char *get_logname(struct issue *ie, struct options *op, struct termios *t |
| break; |
| case CTL('D'): |
| exit(EXIT_SUCCESS); |
| - case CTL('C'): |
| - /* Ignore */ |
| - break; |
| default: |
| if ((size_t)(bp - logname) >= sizeof(logname) - 1) |
| log_err(_("%s: input overrun"), op->tty); |