blob: cb97947ce60c51c905686bfc2bc4d162b566b6cd [file] [log] [blame]
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +00001/* vi: set sw=4 ts=4: */
2/*
Bernhard Reutner-Fischerae4342c2008-05-19 08:18:50 +00003 * Mini kbd_mode implementation for busybox
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +00004 *
5 * Copyright (C) 2007 Loïc Grenié <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
8 *
9 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
10 *
11 */
12
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +000013#include "libbb.h"
14#include <linux/kd.h>
15
16int kbd_mode_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkoa60f84e2008-07-05 09:18:54 +000017int kbd_mode_main(int argc UNUSED_PARAM, char **argv)
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +000018{
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +000019 int fd;
Bernhard Reutner-Fischerae4342c2008-05-19 08:18:50 +000020 unsigned opt;
21 enum {
Denis Vlasenko2afd5ab2008-08-05 23:32:27 +000022 SCANCODE = (1 << 0),
23 ASCII = (1 << 1),
24 MEDIUMRAW = (1 << 2),
25 UNICODE = (1 << 3)
Bernhard Reutner-Fischerae4342c2008-05-19 08:18:50 +000026 };
27 static const char KD_xxx[] ALIGN1 = "saku";
28 opt = getopt32(argv, KD_xxx);
Denis Vlasenko2afd5ab2008-08-05 23:32:27 +000029 fd = get_console_fd_or_die();
30
Bernhard Reutner-Fischerae4342c2008-05-19 08:18:50 +000031 if (!opt) { /* print current setting */
32 const char *mode = "unknown";
33 int m;
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +000034
Bernhard Reutner-Fischerae4342c2008-05-19 08:18:50 +000035 ioctl(fd, KDGKBMODE, &m);
36 if (m == K_RAW)
37 mode = "raw (scancode)";
38 else if (m == K_XLATE)
39 mode = "default (ASCII)";
40 else if (m == K_MEDIUMRAW)
41 mode = "mediumraw (keycode)";
42 else if (m == K_UNICODE)
43 mode = "Unicode (UTF-8)";
44 printf("The keyboard is in %s mode\n", mode);
45 } else {
46 opt = opt & UNICODE ? 3 : opt >> 1;
Denis Vlasenko2afd5ab2008-08-05 23:32:27 +000047 /* double cast prevents warnings about widening conversion */
48 xioctl(fd, KDSKBMODE, (void*)(ptrdiff_t)opt);
Denis Vlasenkoaa7a8882007-10-20 00:17:34 +000049 }
50
51 if (ENABLE_FEATURE_CLEAN_UP)
52 close(fd);
53 return EXIT_SUCCESS;
54}