90 lines
2.3 KiB
C
90 lines
2.3 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <linux/kd.h>
|
|
#include <linux/vt.h>
|
|
#include <errno.h>
|
|
|
|
static void setkey_usage(char *argv[])
|
|
{
|
|
fprintf(stderr, "%s [-t <table>] [-k <index>] [-v value] [-r] [-h]\n"
|
|
" -t <table> Select table\n"
|
|
" -k <index> Select key\n"
|
|
" -v <value> Set entry\n"
|
|
" -r Read current entry\n"
|
|
" -h Print help\n", argv[0]);
|
|
}
|
|
|
|
#define TTYDEV "/dev/tty0"
|
|
|
|
int setkey_main(int argc, char *argv[])
|
|
{
|
|
int fd;
|
|
struct kbentry kbe;
|
|
int did_something = 0;
|
|
|
|
kbe.kb_table = 0;
|
|
kbe.kb_index = -1;
|
|
kbe.kb_value = 0;
|
|
|
|
fd = open(TTYDEV, O_RDWR | O_SYNC);
|
|
if (fd < 0) {
|
|
fprintf(stderr, "open %s: %s\n", TTYDEV, strerror(errno));
|
|
return 1;
|
|
}
|
|
|
|
do {
|
|
int c, ret;
|
|
|
|
c = getopt(argc, argv, "t:k:v:hr");
|
|
if (c == EOF)
|
|
break;
|
|
|
|
switch (c) {
|
|
case 't':
|
|
kbe.kb_table = strtol(optarg, NULL, 0);
|
|
break;
|
|
case 'k':
|
|
kbe.kb_index = strtol(optarg, NULL, 0);
|
|
break;
|
|
case 'v':
|
|
kbe.kb_value = strtol(optarg, NULL, 0);
|
|
ret = ioctl(fd, KDSKBENT, &kbe);
|
|
if (ret < 0) {
|
|
fprintf(stderr, "KDSKBENT %d %d %d failed: %s\n",
|
|
kbe.kb_table, kbe.kb_index, kbe.kb_value,
|
|
strerror(errno));
|
|
return 1;
|
|
}
|
|
did_something = 1;
|
|
break;
|
|
case 'r':
|
|
ret = ioctl(fd, KDGKBENT, &kbe);
|
|
if (ret < 0) {
|
|
fprintf(stderr, "KDGKBENT %d %d failed: %s\n",
|
|
kbe.kb_table, kbe.kb_index, strerror(errno));
|
|
return 1;
|
|
}
|
|
printf("0x%x 0x%x 0x%x\n",
|
|
kbe.kb_table, kbe.kb_index, kbe.kb_value);
|
|
did_something = 1;
|
|
break;
|
|
case 'h':
|
|
setkey_usage(argv);
|
|
return 1;
|
|
case '?':
|
|
fprintf(stderr, "%s: invalid option -%c\n",
|
|
argv[0], optopt);
|
|
return 1;
|
|
}
|
|
} while (1);
|
|
|
|
if(optind != argc || !did_something) {
|
|
setkey_usage(argv);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|