Blob Blame History Raw
From 7974045302fe53629e70501f0180f30cbaa25b1e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 6 Jun 2018 15:57:24 +0200
Subject: [PATCH 162/173] agetty: keep c_iflags unmodified on --autologin

agetty sets c_iflags according to interaction with serial line in
get_logname(). For --autologin it does not read from the line, so we
have no clue how to set the flags.

The current behavior is to zeroize the flags.  Unfortunately, it seems
like bad idea, because the line may be already properly initialized by
kernel (or systemd, etc.).

The new behavior is not touch the flags on --autologin.

Upstream: http://github.com/karelzak/util-linux/commit/2c4d86abdadab19be76abecb156da7f7dc284d81
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1252764
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 term-utils/agetty.8 |  4 ++++
 term-utils/agetty.c | 17 +++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/term-utils/agetty.8 b/term-utils/agetty.8
index a42cdf158..fe4bfd427 100644
--- a/term-utils/agetty.8
+++ b/term-utils/agetty.8
@@ -94,6 +94,10 @@ password. The \-f \fIusername\fP option is added to the \fB/bin/login\fP
 command line by default. The \-\-login-options option changes this default
 behaviour and then only \\u is replaced by the \fIusername\fP and no other
 option is added to the login command line.
+
+Note that \fB\-\-autologin\fP may affect the way how agetty initializes the
+serial line, because on auto-login agetty does not read from the line and it
+has no opportunity optimize the line setting.
 .TP
 \-c, \-\-noreset
 Don't reset terminal cflags (control modes). See \fItermios(3)\fP for more
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
index b626cdbeb..948d77246 100644
--- a/term-utils/agetty.c
+++ b/term-utils/agetty.c
@@ -1100,13 +1100,22 @@ static void termio_init(struct options *op, struct termios *tp)
 	 /* Flush input and output queues, important for modems! */
 	tcflush(STDIN_FILENO, TCIOFLUSH);
 
+	/* The defaul is set c_iflag in termio_final() according to chardata.
+	 * Unfortunately, the chardata are not set according to the serial line
+	 * if --autolog is enabled. In this case we do not read from the line
+	 * at all. The best what we can do in this case is to keep c_iflag
+	 * unmodified for --autolog.
+	 */
+	if (!op->autolog) {
 #ifdef IUTF8
-	tp->c_iflag = tp->c_iflag & IUTF8;
-	if (tp->c_iflag & IUTF8)
-		op->flags |= F_UTF8;
+		tp->c_iflag = tp->c_iflag & IUTF8;
+		if (tp->c_iflag & IUTF8)
+			op->flags |= F_UTF8;
 #else
-	tp->c_iflag = 0;
+		tp->c_iflag = 0;
 #endif
+	}
+
 	tp->c_lflag = 0;
 	tp->c_oflag &= OPOST | ONLCR;
 
-- 
2.14.4