|
|
b394b9 |
From 46537bc28d48acb9ae5cac76535262e6b2ec48a2 Mon Sep 17 00:00:00 2001
|
|
|
b394b9 |
From: Werner Fink <werner@suse.de>
|
|
|
b394b9 |
Date: Thu, 8 May 2014 12:09:25 +0200
|
|
|
b394b9 |
Subject: [PATCH 80/84] sulogin: (and agetty) virtual consoles support, xvc and
|
|
|
b394b9 |
hvc device
|
|
|
b394b9 |
|
|
|
b394b9 |
For this approach do not use the ioctl TIOCMGET anymore as this
|
|
|
b394b9 |
is for real serial lines only. But switch over to use the ioctl
|
|
|
b394b9 |
KDGKBMODE as this is unique to the virtual console lines only.
|
|
|
b394b9 |
|
|
|
b394b9 |
Upstream: http://github.com/karelzak/util-linux/commit/b9c7390948c7850db2bee82ad64624930962cc14
|
|
|
b394b9 |
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1029385
|
|
|
b394b9 |
Signed-off-by: Werner Fink <werner@suse.de>
|
|
|
b394b9 |
Signed-off-by: Karel Zak <kzak@redhat.com>
|
|
|
b394b9 |
---
|
|
|
b394b9 |
login-utils/sulogin.c | 17 ++++++++++++-----
|
|
|
b394b9 |
term-utils/agetty.c | 23 +++++++++++------------
|
|
|
b394b9 |
2 files changed, 23 insertions(+), 17 deletions(-)
|
|
|
b394b9 |
|
|
|
b394b9 |
diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c
|
|
|
b394b9 |
index 32ae9a2..bbd67b3 100644
|
|
|
b394b9 |
--- a/login-utils/sulogin.c
|
|
|
b394b9 |
+++ b/login-utils/sulogin.c
|
|
|
b394b9 |
@@ -49,6 +49,11 @@
|
|
|
b394b9 |
# include <selinux/get_context_list.h>
|
|
|
b394b9 |
#endif
|
|
|
b394b9 |
|
|
|
b394b9 |
+#ifdef __linux__
|
|
|
b394b9 |
+# include <sys/kd.h>
|
|
|
b394b9 |
+# include <sys/param.h>
|
|
|
b394b9 |
+#endif
|
|
|
b394b9 |
+
|
|
|
b394b9 |
#include "c.h"
|
|
|
b394b9 |
#include "closestream.h"
|
|
|
b394b9 |
#include "nls.h"
|
|
|
b394b9 |
@@ -93,10 +98,14 @@ static void tcinit(struct console *con)
|
|
|
b394b9 |
return;
|
|
|
b394b9 |
}
|
|
|
b394b9 |
|
|
|
b394b9 |
- /* Handle serial lines here */
|
|
|
b394b9 |
- if (ioctl(fd, TIOCMGET, (char *) &mode) == 0) {
|
|
|
b394b9 |
+ /* Handle lines other than virtual consoles here */
|
|
|
b394b9 |
+#if defined(KDGKBMODE)
|
|
|
b394b9 |
+ if (ioctl(fd, KDGKBMODE, &mode) < 0)
|
|
|
b394b9 |
+#endif
|
|
|
b394b9 |
+ {
|
|
|
b394b9 |
speed_t ispeed, ospeed;
|
|
|
b394b9 |
struct winsize ws;
|
|
|
b394b9 |
+ errno = 0;
|
|
|
b394b9 |
|
|
|
b394b9 |
/* this is a modem line */
|
|
|
b394b9 |
con->flags |= CON_SERIAL;
|
|
|
b394b9 |
@@ -142,9 +151,7 @@ static void tcinit(struct console *con)
|
|
|
b394b9 |
goto setattr;
|
|
|
b394b9 |
}
|
|
|
b394b9 |
#if defined(IUTF8) && defined(KDGKBMODE)
|
|
|
b394b9 |
- /* Detect mode of current keyboard setup, e.g. for UTF-8 */
|
|
|
b394b9 |
- if (ioctl(fd, KDGKBMODE, &mode) < 0)
|
|
|
b394b9 |
- mode = K_RAW;
|
|
|
b394b9 |
+ /* Handle mode of current keyboard setup, e.g. for UTF-8 */
|
|
|
b394b9 |
switch(mode) {
|
|
|
b394b9 |
case K_UNICODE:
|
|
|
b394b9 |
setlocale(LC_CTYPE, "C.UTF-8");
|
|
|
b394b9 |
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
|
|
|
b394b9 |
index c7af154..5692126 100644
|
|
|
b394b9 |
--- a/term-utils/agetty.c
|
|
|
b394b9 |
+++ b/term-utils/agetty.c
|
|
|
b394b9 |
@@ -134,6 +134,7 @@ struct options {
|
|
|
b394b9 |
int nice; /* Run login with this priority */
|
|
|
b394b9 |
int numspeed; /* number of baud rates to try */
|
|
|
b394b9 |
int clocal; /* CLOCAL_MODE_* */
|
|
|
b394b9 |
+ int kbmode; /* Keyboard mode if virtual console */
|
|
|
b394b9 |
speed_t speeds[MAX_SPEED]; /* baud rates to be tried */
|
|
|
b394b9 |
};
|
|
|
b394b9 |
|
|
|
b394b9 |
@@ -886,7 +887,7 @@ static void update_utmp(struct options *op)
|
|
|
b394b9 |
static void open_tty(char *tty, struct termios *tp, struct options *op)
|
|
|
b394b9 |
{
|
|
|
b394b9 |
const pid_t pid = getpid();
|
|
|
b394b9 |
- int serial, closed = 0;
|
|
|
b394b9 |
+ int closed = 0;
|
|
|
b394b9 |
|
|
|
b394b9 |
/* Set up new standard input, unless we are given an already opened port. */
|
|
|
b394b9 |
|
|
|
b394b9 |
@@ -1016,15 +1017,18 @@ static void open_tty(char *tty, struct termios *tp, struct options *op)
|
|
|
b394b9 |
|
|
|
b394b9 |
/*
|
|
|
b394b9 |
* Detect if this is a virtual console or serial/modem line.
|
|
|
b394b9 |
- * In case of a virtual console the ioctl TIOCMGET fails and
|
|
|
b394b9 |
- * the error number will be set to EINVAL.
|
|
|
b394b9 |
+ * In case of a virtual console the ioctl KDGKBMODE succeeds
|
|
|
b394b9 |
+ * whereas on other lines it will fails.
|
|
|
b394b9 |
*/
|
|
|
b394b9 |
- if (ioctl(STDIN_FILENO, TIOCMGET, &serial) < 0 && (errno == EINVAL)) {
|
|
|
b394b9 |
+ if (ioctl(STDIN_FILENO, KDGKBMODE, &op->kbmode) == 0) {
|
|
|
b394b9 |
op->flags |= F_VCONSOLE;
|
|
|
b394b9 |
if (!op->term)
|
|
|
b394b9 |
op->term = DEFAULT_VCTERM;
|
|
|
b394b9 |
- } else if (!op->term)
|
|
|
b394b9 |
- op->term = DEFAULT_STERM;
|
|
|
b394b9 |
+ } else {
|
|
|
b394b9 |
+ op->kbmode = K_RAW;
|
|
|
b394b9 |
+ if (!op->term)
|
|
|
b394b9 |
+ op->term = DEFAULT_STERM;
|
|
|
b394b9 |
+ }
|
|
|
b394b9 |
|
|
|
b394b9 |
setenv("TERM", op->term, 1);
|
|
|
b394b9 |
}
|
|
|
b394b9 |
@@ -1037,12 +1041,7 @@ static void termio_init(struct options *op, struct termios *tp)
|
|
|
b394b9 |
|
|
|
b394b9 |
if (op->flags & F_VCONSOLE) {
|
|
|
b394b9 |
#if defined(IUTF8) && defined(KDGKBMODE)
|
|
|
b394b9 |
- int mode;
|
|
|
b394b9 |
-
|
|
|
b394b9 |
- /* Detect mode of current keyboard setup, e.g. for UTF-8 */
|
|
|
b394b9 |
- if (ioctl(STDIN_FILENO, KDGKBMODE, &mode) < 0)
|
|
|
b394b9 |
- mode = K_RAW;
|
|
|
b394b9 |
- switch(mode) {
|
|
|
b394b9 |
+ switch(op->kbmode) {
|
|
|
b394b9 |
case K_UNICODE:
|
|
|
b394b9 |
setlocale(LC_CTYPE, "C.UTF-8");
|
|
|
b394b9 |
op->flags |= F_UTF8;
|
|
|
b394b9 |
--
|
|
|
b394b9 |
2.7.4
|
|
|
b394b9 |
|