1d927b0b9bc1260f282ae5e508635243a5e1bfb0
[platform/upstream/kbd.git] / src / setmetamode.c
1 /*
2  * setmetamode.c - aeb, 940130
3  *
4  * Call: setmetamode { metabit | escprefix }
5  * and report the setting before and after.
6  * Without arguments setmetamode will only report.
7  */
8
9 #include <stdio.h>
10 #include <fcntl.h>
11 #include <linux/kd.h>
12 #include <sys/ioctl.h>
13 #include "nls.h"
14 #include "version.h"
15
16 static void attr_noreturn
17 usage(void)
18 {
19     fprintf(stderr, _(
20 "Usage:\n"
21 "       setmetamode [ metabit | meta | bit | escprefix | esc | prefix ]\n"
22 "Each vt has his own copy of this bit. Use\n"
23 "       setmetamode [arg] < /dev/ttyn\n"
24 "to change the settings of another vt.\n"
25 "The setting before and after the change are reported.\n"
26 ));
27     exit(1);
28 }
29
30 static void
31 report(int meta) {
32     char *s;
33
34     switch(meta) {
35       case K_METABIT:
36         s = _("Meta key sets high order bit\n");
37         break;
38       case K_ESCPREFIX:
39         s = _("Meta key gives Esc prefix\n");
40         break;
41       default:
42         s = _("Strange mode for Meta key?\n");
43     }
44     printf("%s", s);
45 }
46
47 struct meta {
48     char *name;
49     int val;
50 } metas[] = {
51     { "metabit",   K_METABIT },
52     { "meta",      K_METABIT },
53     { "bit",       K_METABIT },
54     { "escprefix", K_ESCPREFIX },
55     { "esc",       K_ESCPREFIX },
56     { "prefix",    K_ESCPREFIX }
57 };
58
59 #define SIZE(a) (sizeof(a)/sizeof(a[0]))
60
61 int
62 main(int argc, char **argv) {
63     char ometa, nmeta;
64     struct meta *mp;
65
66     set_progname(argv[0]);
67
68     setlocale(LC_ALL, "");
69     bindtextdomain(PACKAGE_NAME, LOCALEDIR);
70     textdomain(PACKAGE_NAME);
71
72     if (argc == 2 && !strcmp(argv[1], "-V"))
73         print_version_and_exit();
74
75     if (ioctl(0, KDGKBMETA, &ometa)) {
76         perror("KDGKBMETA");
77         fprintf(stderr,
78                 _("Error reading current setting. Maybe stdin is not a VT?\n"));
79         exit(1);
80     }
81
82     if (argc <= 1) {
83         report(ometa);
84         exit(0);
85     }
86
87     nmeta = 0;                  /* make gcc happy */
88     for (mp = metas; (unsigned) (mp-metas) < SIZE(metas); mp++) {
89         if(!strcmp(argv[1], mp->name)) {
90             nmeta = mp->val;
91             goto fnd;
92         }
93     }
94     fprintf(stderr, _("unrecognized argument: _%s_\n\n"), argv[1]);
95     usage();
96
97   fnd:
98     printf(_("old state:    "));
99     report(ometa);
100     if (ioctl(0, KDSKBMETA, nmeta)) {
101         perror("KDSKBMETA");
102         exit(1);
103     }
104     printf(_("new state:    "));
105     report(nmeta);
106     exit(0);
107 }