blob: 1ff27744c0f90c06560d63278c2a0e270e2e1bcc [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001#include <stdio.h>
2#include <stdlib.h>
3#include <fcntl.h>
4#include <string.h>
5#include <linux/kd.h>
6#include <linux/vt.h>
7#include <errno.h>
8
9static void setkey_usage(char *argv[])
10{
11 fprintf(stderr, "%s [-t <table>] [-k <index>] [-v value] [-r] [-h]\n"
12 " -t <table> Select table\n"
13 " -k <index> Select key\n"
14 " -v <value> Set entry\n"
15 " -r Read current entry\n"
16 " -h Print help\n", argv[0]);
17}
18
19#define TTYDEV "/dev/tty0"
20
21int setkey_main(int argc, char *argv[])
22{
23 int fd;
24 struct kbentry kbe;
25 int did_something = 0;
26
27 kbe.kb_table = 0;
28 kbe.kb_index = -1;
29 kbe.kb_value = 0;
30
31 fd = open(TTYDEV, O_RDWR | O_SYNC);
32 if (fd < 0) {
33 fprintf(stderr, "open %s: %s\n", TTYDEV, strerror(errno));
34 return 1;
35 }
36
37 do {
38 int c, ret;
39
40 c = getopt(argc, argv, "t:k:v:hr");
41 if (c == EOF)
42 break;
43
44 switch (c) {
45 case 't':
46 kbe.kb_table = strtol(optarg, NULL, 0);
47 break;
48 case 'k':
49 kbe.kb_index = strtol(optarg, NULL, 0);
50 break;
51 case 'v':
52 kbe.kb_value = strtol(optarg, NULL, 0);
53 ret = ioctl(fd, KDSKBENT, &kbe);
54 if (ret < 0) {
55 fprintf(stderr, "KDSKBENT %d %d %d failed: %s\n",
56 kbe.kb_table, kbe.kb_index, kbe.kb_value,
57 strerror(errno));
58 return 1;
59 }
60 did_something = 1;
61 break;
62 case 'r':
63 ret = ioctl(fd, KDGKBENT, &kbe);
64 if (ret < 0) {
65 fprintf(stderr, "KDGKBENT %d %d failed: %s\n",
66 kbe.kb_table, kbe.kb_index, strerror(errno));
67 return 1;
68 }
69 printf("0x%x 0x%x 0x%x\n",
70 kbe.kb_table, kbe.kb_index, kbe.kb_value);
71 did_something = 1;
72 break;
73 case 'h':
74 setkey_usage(argv);
75 return 1;
76 case '?':
77 fprintf(stderr, "%s: invalid option -%c\n",
78 argv[0], optopt);
79 return 1;
80 }
81 } while (1);
82
83 if(optind != argc || !did_something) {
84 setkey_usage(argv);
85 return 1;
86 }
87
88 return 0;
89}