• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  #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  
setkey_usage(char * argv[])9  static 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  
setkey_main(int argc,char * argv[])21  int 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  }
90