--- login-utils/sulogin.c | 11 ++++++----- term-utils/agetty.c | 17 +++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) --- login-utils/sulogin.c +++ login-utils/sulogin.c 2014-05-07 14:06:56.198236254 +0000 @@ -142,8 +142,11 @@ static void tcinit(struct console *con) return; } - /* Handle serial lines here */ - if (ioctl(fd, TIOCMGET, (char *) &mode) == 0) { + /* Handle lines other than virtual consoles here */ +#if defined(KDGKBMODE) + if (ioctl(fd, KDGKBMODE, &mode) < 0) +#endif + { speed_t ispeed, ospeed; struct winsize ws; @@ -191,9 +194,7 @@ static void tcinit(struct console *con) goto setattr; } #if defined(IUTF8) && defined(KDGKBMODE) - /* Detect mode of current keyboard setup, e.g. for UTF-8 */ - if (ioctl(fd, KDGKBMODE, &mode) < 0) - mode = K_RAW; + /* Handle mode of current keyboard setup, e.g. for UTF-8 */ switch(mode) { case K_UNICODE: setlocale(LC_CTYPE, "C.UTF-8"); --- term-utils/agetty.c +++ term-utils/agetty.c 2014-05-07 14:02:49.798735674 +0000 @@ -139,6 +139,7 @@ struct options { int nice; /* Run login with this priority */ int numspeed; /* number of baud rates to try */ int clocal; /* CLOCAL_MODE_* */ + int kbmode; /* Keyboard mode if virtual console */ speed_t speeds[MAX_SPEED]; /* baud rates to be tried */ }; @@ -1080,15 +1081,18 @@ static void open_tty(char *tty, struct t #endif /* * Detect if this is a virtual console or serial/modem line. - * In case of a virtual console the ioctl TIOCMGET fails and - * the error number will be set to EINVAL. + * In case of a virtual console the ioctl KDGKBMODE succeeds + * whereas on other lines it will fails. */ - if (ioctl(STDIN_FILENO, TIOCMGET, &serial) < 0 && (errno == EINVAL)) { + if (ioctl(STDIN_FILENO, KDGKBMODE, &op->kbmode) == 0) { op->flags |= F_VCONSOLE; if (!op->term) op->term = DEFAULT_VCTERM; - } else if (!op->term) - op->term = DEFAULT_STERM; + } else { + op->kbmode = K_RAW; + if (!op->term) + op->term = DEFAULT_STERM; + } setenv("TERM", op->term, 1); } @@ -1124,9 +1128,6 @@ static void termio_init(struct options * #if defined(IUTF8) && defined(KDGKBMODE) int mode; - /* Detect mode of current keyboard setup, e.g. for UTF-8 */ - if (ioctl(STDIN_FILENO, KDGKBMODE, &mode) < 0) - mode = K_RAW; switch(mode) { case K_UNICODE: setlocale(LC_CTYPE, "C.UTF-8");