Linux console tools development discussion
 help / color / mirror / Atom feed
From: Alexey Gladkov <gladkov.alexey@gmail.com>
To: kbd@lists.altlinux.org
Subject: Re: [kbd] New vt_mode tool for kbd?
Date: Tue, 29 Mar 2011 01:07:28 +0400
Message-ID: <4D90F890.9000703@gmail.com> (raw)
In-Reply-To: <20110328111918.GC15694@altlinux.org>

[-- Attachment #1: Type: text/plain, Size: 170 bytes --]

28.03.2011 15:19, Dmitry V. Levin wrote:
> This interface would be both script-friendly and extensible.

Ok. Another implementation. How about this ?

-- 
Rgrds, legion


[-- Attachment #2: kbdinfo.c --]
[-- Type: text/plain, Size: 3121 bytes --]

#include <stdio.h>
#include <errno.h>
#include <error.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include <getopt.h>
#include "getfd.h"
#include "nls.h"
#include "version.h"

static char *action = NULL;
static char *value  = NULL;

static void attr_noreturn
usage(int code) {
	fprintf(stderr, _("Usage: %s [-C DEVICE] getmode [text|graphics]\n"), progname);
	fprintf(stderr, _("   or: %s [-C DEVICE] gkbmode [raw|xlate|mediumraw|unicode]\n"), progname);
	fprintf(stderr, _("   or: %s [-C DEVICE] gkbmeta [metabit|escprefix]\n"), progname);
	fprintf(stderr, _("   or: %s [-C DEVICE] gkbled  [scrolllock|numlock|capslock]\n"), progname);
	exit(code);
}

static int
answer(char *ans) {
	if (value)
		return !strcasecmp(value, ans) ? EXIT_SUCCESS : EXIT_FAILURE;

	printf("%s\n", ans);
	return EXIT_SUCCESS;
}

int
main(int argc, char **argv) {
	int fd, mode, c;
	int rc = EXIT_FAILURE;
	char flags;
	char *console = NULL;

	set_progname(argv[0]);

	setlocale(LC_ALL, "");
	bindtextdomain(PACKAGE_NAME, LOCALEDIR);
	textdomain(PACKAGE_NAME);

	while ((c = getopt(argc, argv, "C:hV")) != EOF) {
		switch (c) {
			case 'C':
				if (optarg == NULL || optarg[0] == '\0')
					usage(EXIT_FAILURE);
				console = optarg;
				break;
			case 'V':
				print_version_and_exit();
				break;
			case 'h':
				usage(EXIT_SUCCESS);
				break;
		}
	}

	if (optind == argc) {
		fprintf(stderr, _("Error: Not enough arguments.\n"));
		exit(EXIT_FAILURE);
	}

	action = argv[optind++];

	if (optind < argc)
		value = argv[optind++];

	fd = getfd(console);

	if (!strcasecmp("GETMODE", action)) {
		if (ioctl(fd, KDGETMODE, &mode) == -1)
			error(EXIT_FAILURE, errno, "ioctl");

		switch (mode) {
			case KD_TEXT:		rc = answer("text");		break;
			case KD_GRAPHICS:	rc = answer("graphics");	break;
		}

	} else if (!strcasecmp("GKBMODE", action)) {
		if (ioctl(fd, KDGKBMODE, &mode) == -1)
			error(EXIT_FAILURE, errno, "ioctl");

		switch (mode) {
			case K_RAW:		rc = answer("raw");		break;
			case K_XLATE:		rc = answer("xlate");		break;
			case K_MEDIUMRAW:	rc = answer("mediumraw");	break;
			case K_UNICODE:		rc = answer("unicode");		break;
		}

	} else if (!strcasecmp("GKBMETA", action)) {
		if (ioctl(fd, KDGKBMETA, &mode) == -1)
			error(EXIT_FAILURE, errno, "ioctl");

		switch (mode) {
			case K_METABIT:		rc = answer("metabit");		break;
			case K_ESCPREFIX:	rc = answer("escprefix");	break;
		}

	} else if (!strcasecmp("GKBLED", action)) {
		if (ioctl(fd, KDGKBLED, &flags) == -1)
			error(EXIT_FAILURE, errno, "ioctl");

		mode = (flags & 0x7);

		if (value) {
			if (((mode & LED_SCR) && !strcasecmp(value, "scrolllock")) ||
			    ((mode & LED_NUM) && !strcasecmp(value, "numlock"))    ||
			    ((mode & LED_CAP) && !strcasecmp(value, "capslock")))
				rc = EXIT_SUCCESS;
		} else {
			printf("scrolllock:%s ", (mode & LED_SCR) ? "on" : "off");
			printf("numlock:%s ",    (mode & LED_NUM) ? "on" : "off");
			printf("capslock:%s\n",  (mode & LED_CAP) ? "on" : "off");
			rc = EXIT_SUCCESS;
		}

	} else {
		fprintf(stderr, _("Error: Unrecognized action: %s\n"), action);
	}

	close(fd);
	return rc;
}

  parent reply	other threads:[~2011-03-28 21:07 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-21 21:42 Michael Schutte
2011-03-21 22:13 ` Dmitry V. Levin
2011-03-21 22:25   ` Michael Schutte
2011-03-25 13:20 ` Alexey Gladkov
2011-03-26 17:33   ` Michael Schutte
2011-03-26 22:33   ` Dmitry V. Levin
2011-03-27  9:33     ` Alexey Gladkov
2011-03-28 10:55       ` Alexey Gladkov
2011-03-28 11:19       ` Dmitry V. Levin
2011-03-28 11:26         ` Alexey Gladkov
2011-03-28 21:07         ` Alexey Gladkov [this message]
2011-03-29 21:51           ` Dmitry V. Levin
2011-03-29 22:27             ` Alexey Gladkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D90F890.9000703@gmail.com \
    --to=gladkov.alexey@gmail.com \
    --cc=kbd@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Linux console tools development discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/kbd/0 kbd/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 kbd kbd/ http://lore.altlinux.org/kbd \
		kbd@lists.altlinux.org kbd@lists.altlinux.ru kbd@lists.altlinux.com
	public-inbox-index kbd

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.kbd


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git