Blame src/kbdinfo.c

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
}