From: Karel Zak <kzak@redhat.com>
To: Lubomir Rintel <lkundrak@v3.sk>
Cc: util-linux@vger.kernel.org, Stanislav Brabec <sbrabec@suse.cz>
Subject: Re: [PATCH v2] agetty: don't put the VC into canonical mode
Date: Tue, 16 Oct 2018 09:40:53 +0200 [thread overview]
Message-ID: <20181016074053.dea6ydle26y37uva@ws.net.home> (raw)
In-Reply-To: <20181016064149.2698-1-lkundrak@v3.sk>
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@v3.sk>
>
> ---
> 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@redhat.com>
http://karelzak.blogspot.com
next prev parent reply other threads:[~2018-10-16 7:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-16 6:41 [PATCH v2] agetty: don't put the VC into canonical mode Lubomir Rintel
2018-10-16 7:40 ` Karel Zak [this message]
2018-10-18 19:25 ` Stanislav Brabec
2018-10-19 7:53 ` Karel Zak
2018-10-19 6:09 ` Lubomir Rintel
2018-10-19 13:08 ` Stanislav Brabec
2018-10-19 13:48 ` Lubomir Rintel
2018-10-19 20:08 ` Stanislav Brabec
2018-10-22 9:23 ` Karel Zak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181016074053.dea6ydle26y37uva@ws.net.home \
--to=kzak@redhat.com \
--cc=lkundrak@v3.sk \
--cc=sbrabec@suse.cz \
--cc=util-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).