6338398e24fea073628334afae4c1265d36fc419
[platform/upstream/kbd.git] / src / kbd_mode.c
1 /*
2  * kbd_mode: report and set keyboard mode - aeb, 940406
3  * 
4  * If you make \215A\201 an alias for "kbd_mode -a", and you are
5  * in raw mode, then hitting F7 = (two keys) will return you to sanity.
6  */
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <sys/ioctl.h>
10 #include <linux/types.h>
11 #include <linux/kd.h>
12 #include "getfd.h"
13 #include "nls.h"
14 #include "version.h"
15
16 static void
17 usage(void){
18     fprintf(stderr, _("usage: kbd_mode [-a|-u|-k|-s]\n"));
19     exit(1);
20 }
21
22 int
23 main(int argc, char *argv[]){
24         int fd, mode;
25
26         set_progname(argv[0]);
27
28         setlocale(LC_ALL, "");
29         bindtextdomain(PACKAGE, LOCALEDIR);
30         textdomain(PACKAGE);
31
32         if (argc == 2 && !strcmp(argv[1], "-V"))
33             print_version_and_exit();
34
35         fd = getfd();
36
37         if (argc == 1) {
38             /* report mode */
39             if (ioctl(fd, KDGKBMODE, &mode)) {
40                 perror("KDGKBMODE");
41                 fprintf(stderr, _("kbd_mode: error reading keyboard mode\n"));
42                 exit(1);
43             }
44             switch(mode) {
45               case K_RAW:
46                 printf(_("The keyboard is in raw (scancode) mode\n"));
47                 break;
48               case K_MEDIUMRAW:
49                 printf(_("The keyboard is in mediumraw (keycode) mode\n"));
50                 break;
51               case K_XLATE:
52                 printf(_("The keyboard is in the default (ASCII) mode\n"));
53                 break;
54               case K_UNICODE:
55                 printf(_("The keyboard is in Unicode (UTF-8) mode\n"));
56                 break;
57               default:
58                 printf(_("The keyboard is in some unknown mode\n"));
59             }
60             exit(1);
61         }
62         if (argc != 2)
63           usage();
64         if (!strcmp(argv[1], "-a"))
65           mode = K_XLATE;
66         else if (!strcmp(argv[1], "-u"))
67           mode = K_UNICODE;
68         else if (!strcmp(argv[1], "-s"))
69           mode = K_RAW;
70         else if (!strcmp(argv[1], "-k"))
71           mode = K_MEDIUMRAW;
72         else
73           usage();
74         if (ioctl(fd, KDSKBMODE, mode)) {
75                 perror("KDSKBMODE");
76                 fprintf(stderr, _("%s: error setting keyboard mode\n"), progname);
77                 exit(1);
78         }
79         exit(0);
80 }