|
Packit Service |
50ad14 |
#include "config.h"
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
#include <stdio.h>
|
|
Packit Service |
50ad14 |
#include <errno.h>
|
|
Packit Service |
50ad14 |
#include <unistd.h>
|
|
Packit Service |
50ad14 |
#include <sys/ioctl.h>
|
|
Packit Service |
50ad14 |
#include <linux/kd.h>
|
|
Packit Service |
50ad14 |
#include <getopt.h>
|
|
Packit Service |
50ad14 |
#include "getfd.h"
|
|
Packit Service |
50ad14 |
#include "nls.h"
|
|
Packit Service |
50ad14 |
#include "version.h"
|
|
Packit Service |
50ad14 |
#include "kbd_error.h"
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
static const char *action = NULL;
|
|
Packit Service |
50ad14 |
static const char *value = NULL;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
static void __attribute__((noreturn))
|
|
Packit Service |
50ad14 |
usage(int code)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
fprintf(stderr,
|
|
Packit Service |
50ad14 |
_("Usage: %1$s [-C DEVICE] getmode [text|graphics]\n"
|
|
Packit Service |
50ad14 |
" or: %1$s [-C DEVICE] gkbmode [raw|xlate|mediumraw|unicode]\n"
|
|
Packit Service |
50ad14 |
" or: %1$s [-C DEVICE] gkbmeta [metabit|escprefix]\n"
|
|
Packit Service |
50ad14 |
" or: %1$s [-C DEVICE] gkbled [scrolllock|numlock|capslock]\n"
|
|
Packit Service |
50ad14 |
"Other options:\n"
|
|
Packit Service |
50ad14 |
" -h print this usage message\n"
|
|
Packit Service |
50ad14 |
" -V print version number\n"),
|
|
Packit Service |
50ad14 |
progname);
|
|
Packit Service |
50ad14 |
exit(code);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
static int
|
|
Packit Service |
50ad14 |
answer(const char *ans)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
if (value)
|
|
Packit Service |
50ad14 |
return strcasecmp(value, ans) ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
printf("%s\n", ans);
|
|
Packit Service |
50ad14 |
return EXIT_SUCCESS;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
int main(int argc, char **argv)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
int fd, mode, c;
|
|
Packit Service |
50ad14 |
int rc = EXIT_FAILURE;
|
|
Packit Service |
50ad14 |
char flags;
|
|
Packit Service |
50ad14 |
const char *console = NULL;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
set_progname(argv[0]);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
setlocale(LC_ALL, "");
|
|
Packit Service |
50ad14 |
bindtextdomain(PACKAGE_NAME, LOCALEDIR);
|
|
Packit Service |
50ad14 |
textdomain(PACKAGE_NAME);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
while ((c = getopt(argc, argv, "C:hV")) != EOF) {
|
|
Packit Service |
50ad14 |
switch (c) {
|
|
Packit Service |
50ad14 |
case 'C':
|
|
Packit Service |
50ad14 |
if (optarg == NULL || optarg[0] == '\0')
|
|
Packit Service |
50ad14 |
usage(EXIT_FAILURE);
|
|
Packit Service |
50ad14 |
console = optarg;
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case 'V':
|
|
Packit Service |
50ad14 |
print_version_and_exit();
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case 'h':
|
|
Packit Service |
50ad14 |
usage(EXIT_SUCCESS);
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (optind == argc) {
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, 0, _("Error: Not enough arguments.\n"));
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
action = argv[optind++];
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (optind < argc)
|
|
Packit Service |
50ad14 |
value = argv[optind++];
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if ((fd = getfd(console)) < 0)
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, 0, _("Couldn't get a file descriptor referring to the console"));
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (!strcasecmp("GETMODE", action)) {
|
|
Packit Service |
50ad14 |
if (ioctl(fd, KDGETMODE, &mode) == -1)
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, errno, "ioctl KDGETMODE");
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
switch (mode) {
|
|
Packit Service |
50ad14 |
case KD_TEXT:
|
|
Packit Service |
50ad14 |
rc = answer("text");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case KD_GRAPHICS:
|
|
Packit Service |
50ad14 |
rc = answer("graphics");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
} else if (!strcasecmp("GKBMODE", action)) {
|
|
Packit Service |
50ad14 |
if (ioctl(fd, KDGKBMODE, &mode) == -1)
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, errno, "ioctl KDGKBMODE");
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
switch (mode) {
|
|
Packit Service |
50ad14 |
case K_RAW:
|
|
Packit Service |
50ad14 |
rc = answer("raw");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case K_XLATE:
|
|
Packit Service |
50ad14 |
rc = answer("xlate");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case K_MEDIUMRAW:
|
|
Packit Service |
50ad14 |
rc = answer("mediumraw");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case K_UNICODE:
|
|
Packit Service |
50ad14 |
rc = answer("unicode");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
} else if (!strcasecmp("GKBMETA", action)) {
|
|
Packit Service |
50ad14 |
if (ioctl(fd, KDGKBMETA, &mode) == -1)
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, errno, "ioctl KDGKBMETA");
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
switch (mode) {
|
|
Packit Service |
50ad14 |
case K_METABIT:
|
|
Packit Service |
50ad14 |
rc = answer("metabit");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
case K_ESCPREFIX:
|
|
Packit Service |
50ad14 |
rc = answer("escprefix");
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
} else if (!strcasecmp("GKBLED", action)) {
|
|
Packit Service |
50ad14 |
if (ioctl(fd, KDGKBLED, &flags) == -1)
|
|
Packit Service |
50ad14 |
kbd_error(EXIT_FAILURE, errno, "ioctl KDGKBLED");
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
mode = (flags & 0x7);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (value) {
|
|
Packit Service |
50ad14 |
if (((mode & LED_SCR) && !strcasecmp(value, "scrolllock")) ||
|
|
Packit Service |
50ad14 |
((mode & LED_NUM) && !strcasecmp(value, "numlock")) ||
|
|
Packit Service |
50ad14 |
((mode & LED_CAP) && !strcasecmp(value, "capslock")))
|
|
Packit Service |
50ad14 |
rc = EXIT_SUCCESS;
|
|
Packit Service |
50ad14 |
} else {
|
|
Packit Service |
50ad14 |
printf("scrolllock:%s ", (mode & LED_SCR) ? "on" : "off");
|
|
Packit Service |
50ad14 |
printf("numlock:%s ", (mode & LED_NUM) ? "on" : "off");
|
|
Packit Service |
50ad14 |
printf("capslock:%s\n", (mode & LED_CAP) ? "on" : "off");
|
|
Packit Service |
50ad14 |
rc = EXIT_SUCCESS;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
} else {
|
|
Packit Service |
50ad14 |
kbd_warning(0, _("Error: Unrecognized action: %s\n"), action);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
close(fd);
|
|
Packit Service |
50ad14 |
return rc;
|
|
Packit Service |
50ad14 |
}
|