1 /* vi: set sw=4 ts=4: */
3 * Mini kbd_mode implementation for busybox
5 * Copyright (C) 2007 Loic Grenie <loic.grenie@gmail.com>
6 * written using Andries Brouwer <aeb@cwi.nl>'s kbd_mode from
7 * console-utils v0.2.3, licensed under GNU GPLv2
9 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
11 //config:config KBD_MODE
12 //config: bool "kbd_mode (4.3 kb)"
15 //config: This program reports and sets keyboard mode.
17 //applet:IF_KBD_MODE(APPLET_NOEXEC(kbd_mode, kbd_mode, BB_DIR_BIN, BB_SUID_DROP, kbd_mode))
19 //kbuild:lib-$(CONFIG_KBD_MODE) += kbd_mode.o
21 //usage:#define kbd_mode_trivial_usage
22 //usage: "[-a|k|s|u] [-C TTY]"
23 //usage:#define kbd_mode_full_usage "\n\n"
24 //usage: "Report or set VT console keyboard mode\n"
25 //usage: "\n -a Default (ASCII)"
26 //usage: "\n -k Medium-raw (keycode)"
27 //usage: "\n -s Raw (scancode)"
28 //usage: "\n -u Unicode (utf-8)"
29 //usage: "\n -C TTY Affect TTY"
34 int kbd_mode_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
35 int kbd_mode_main(int argc UNUSED_PARAM
, char **argv
)
47 opt
= getopt32(argv
, "sakuC:", &tty_name
);
49 opt
&= 0xf; /* clear -C bit, see (*) */
50 fd
= xopen_nonblocking(tty_name
);
52 /* kbd-2.0.3 tries in sequence:
53 * fd#0, /dev/tty, /dev/tty0.
54 * get_console_fd_or_die: /dev/console, /dev/tty0, /dev/tty.
55 * kbd-2.0.3 checks KDGKBTYPE, get_console_fd_or_die checks too.
57 fd
= get_console_fd_or_die();
60 if (!opt
) { /* print current setting */
61 const char *mode
= "unknown";
64 xioctl(fd
, KDGKBMODE
, &m
);
66 mode
= "raw (scancode)";
67 else if (m
== K_XLATE
)
68 mode
= "default (ASCII)";
69 else if (m
== K_MEDIUMRAW
)
70 mode
= "mediumraw (keycode)";
71 else if (m
== K_UNICODE
)
72 mode
= "Unicode (UTF-8)";
73 else if (m
== 4 /*K_OFF*/) /* kbd-2.0.3 does not show this mode, says "unknown" */
75 printf("The keyboard is in %s mode\n", mode
);
77 /* here we depend on specific bits assigned to options (*)
78 * KDSKBMODE constants have these values:
80 * #define K_XLATE 0x01
81 * #define K_MEDIUMRAW 0x02
82 * #define K_UNICODE 0x03
84 * (looks like "-ak" together would cause the same effect as -u)
86 opt
= opt
& UNICODE
? 3 : opt
>> 1;
87 /* double cast prevents warnings about widening conversion */
88 xioctl(fd
, KDSKBMODE
, (void*)(ptrdiff_t)opt
);
91 if (ENABLE_FEATURE_CLEAN_UP
)