summaryrefslogtreecommitdiffstats
path: root/login-utils/sulogin.c
diff options
context:
space:
mode:
authorKarel Zak2012-03-12 14:41:00 +0100
committerKarel Zak2012-03-12 14:41:00 +0100
commit59ef660f04fdecf46141a79ba9d1c3944ec90c4f (patch)
tree811418f3e40149a6801385eab43240bf39bc27f4 /login-utils/sulogin.c
parentagetty: move vc initialization to ttyutils.h (diff)
downloadkernel-qcow2-util-linux-59ef660f04fdecf46141a79ba9d1c3944ec90c4f.tar.gz
kernel-qcow2-util-linux-59ef660f04fdecf46141a79ba9d1c3944ec90c4f.tar.xz
kernel-qcow2-util-linux-59ef660f04fdecf46141a79ba9d1c3944ec90c4f.zip
sulogin: share vc initialization with agetty
The virtual console initialization has been removed by Dave's commit 5ec4a799c2a8d25c4c8260772363392f805b0a54. We already use this tty initialization for agetty, so reuse the same code. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'login-utils/sulogin.c')
-rw-r--r--login-utils/sulogin.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c
index 7484f9b5c..616442ee4 100644
--- a/login-utils/sulogin.c
+++ b/login-utils/sulogin.c
@@ -50,6 +50,7 @@
#include "nls.h"
#include "pathnames.h"
#include "strutils.h"
+#include "ttyutils.h"
static unsigned int timeout;
static int profile;
@@ -405,6 +406,36 @@ static void sushell(struct passwd *pwd)
warn(_("%s: exec failed"), "/bin/sh");
}
+static void fixtty(void)
+{
+ struct termios tp;
+ int x = 0, fl = 0;
+
+ /* Skip serial console */
+ if (ioctl(STDIN_FILENO, TIOCMGET, (char *) &x) == 0)
+ return;
+
+#if defined(IUTF8) && defined(KDGKBMODE)
+ /* Detect mode of current keyboard setup, e.g. for UTF-8 */
+ if (ioctl(STDIN_FILENO, KDGKBMODE, &x) == 0 && x == K_UNICODE) {
+ setlocale(LC_CTYPE, "C.UTF-8");
+ fl |= UL_TTY_UTF8;
+ }
+#else
+ setlocale(LC_CTYPE, "POSIX");
+#endif
+ memset(&tp, 0, sizeof(struct termios));
+ if (tcgetattr(STDIN_FILENO, &tp) < 0) {
+ warn(_("tcgetattr failed"));
+ return;
+ }
+
+ reset_virtual_console(&tp, fl);
+
+ if (tcsetattr(0, TCSADRAIN, &tp))
+ warn(_("tcsetattr failed"));
+}
+
static void usage(FILE *out)
{
fputs(USAGE_HEADER, out);
@@ -544,6 +575,8 @@ int main(int argc, char **argv)
warn(_("TIOCSCTTY: ioctl failed"));
}
+ fixtty();
+
/*
* Get the root password.
*/