On Tue, Oct 16, 2018 at 08:41:49AM +0200, Lubomir Rintel wrote: > The wait_for_term_input()'s select() needs to be tripped when the user > starts typing. Otherwise the reloads can abort an already in-progress login. > > Coupled with \4 and \6 expansions that happen to be there on Fedora Server, > this means reload on every netlink event. With a couple of IPv6 routers > announcing their networks and temporary addresses in use can make it > sometimes virtually impossible to log in. It's too late for v2.33. It also seems we need to wait for Stanislav's work on this issue -- his idea is to complete disable the reload notification when user start typing, and it also requires to switch to non-canonical mode. This is definitely something we need to fix in v2.34 and v2.33.1. > Seems like zero lflags do the job just fine on a Linux VT. Reset it to > canonical mode before running login. What about Del/Backspace keys when user is typing login name? :-) Karel > Signed-off-by: Lubomir Rintel <lkundrak@xxxxx> > > --- > Changes since v1: > - Unreversed the logic in termio_final()/reset_vc() conditional > > Tested on a vc and serial console on a stock Fedora installation: > > /sbin/agetty -o -p -- \u --noclear tty1 linux > /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS2 vt220 > > term-utils/agetty.c | 26 ++++++++++++++++++-------- > 1 file changed, 18 insertions(+), 8 deletions(-) > > diff --git a/term-utils/agetty.c b/term-utils/agetty.c > index 3c87ec64e..3834813f1 100644 > --- a/term-utils/agetty.c > +++ b/term-utils/agetty.c > @@ -303,7 +303,7 @@ static void parse_speeds(struct options *op, char *arg); > static void update_utmp(struct options *op); > static void open_tty(char *tty, struct termios *tp, struct options *op); > static void termio_init(struct options *op, struct termios *tp); > -static void reset_vc (const struct options *op, struct termios *tp); > +static void reset_vc(const struct options *op, struct termios *tp, int canon); > static void auto_baud(struct termios *tp); > static void list_speeds(void); > static void output_special_char (unsigned char c, struct options *op, > @@ -485,13 +485,14 @@ int main(int argc, char **argv) > if (options.timeout) > alarm(0); > > - if ((options.flags & F_VCONSOLE) == 0) { > - /* Finalize the termios settings. */ > + /* Finalize the termios settings. */ > + if ((options.flags & F_VCONSOLE) == 0) > termio_final(&options, &termios, &chardata); > + else > + reset_vc(&options, &termios, 1); > > - /* Now the newline character should be properly written. */ > - write_all(STDOUT_FILENO, "\r\n", 2); > - } > + /* Now the newline character should be properly written. */ > + write_all(STDOUT_FILENO, "\r\n", 2); > > sigaction(SIGQUIT, &sa_quit, NULL); > sigaction(SIGINT, &sa_int, NULL); > @@ -1234,7 +1235,7 @@ static void termio_init(struct options *op, struct termios *tp) > setlocale(LC_CTYPE, "POSIX"); > op->flags &= ~F_UTF8; > #endif > - reset_vc(op, tp); > + reset_vc(op, tp, 0); > > if ((tp->c_cflag & (CS8|PARODD|PARENB)) == CS8) > op->flags |= F_EIGHTBITS; > @@ -1344,7 +1345,7 @@ static void termio_init(struct options *op, struct termios *tp) > } > > /* Reset virtual console on stdin to its defaults */ > -static void reset_vc(const struct options *op, struct termios *tp) > +static void reset_vc(const struct options *op, struct termios *tp, int canon) > { > int fl = 0; > > @@ -1353,6 +1354,15 @@ static void reset_vc(const struct options *op, struct termios *tp) > > reset_virtual_console(tp, fl); > > +#ifdef AGETTY_RELOAD > + /* > + * Discard all the flags that makes the line go canonical with echoing. > + * We need to know when the user starts typing. > + */ > + if (canon == 0) > + tp->c_lflag = 0; > +#endif > + > if (tcsetattr(STDIN_FILENO, TCSADRAIN, tp)) > log_warn(_("setting terminal attributes failed: %m")); > > -- > 2.19.1 > -- Karel Zak <kzak@xxxxxxxxxx> http://karelzak.blogspot.com