62313e77f297eefd9d09efce152ed71bd5355680
[oweals/busybox.git] / console-tools / dumpkmap.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Mini dumpkmap implementation for busybox
4  *
5  * Copyright (C) Arne Bernin <arne@matrix.loopback.org>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8  *
9  */
10
11 #include <errno.h>
12 #include <fcntl.h>
13 #include <stdio.h>
14 #include <unistd.h>
15 #include <string.h>
16 #include <stdlib.h>
17 #include <sys/ioctl.h>
18 #include "busybox.h"
19
20 /* From <linux/kd.h> */
21 struct kbentry {
22         unsigned char kb_table;
23         unsigned char kb_index;
24         unsigned short kb_value;
25 };
26 #define KDGKBENT 0x4B46  /* gets one entry in translation table */
27
28 /* From <linux/keyboard.h> */
29 #define NR_KEYS 128
30 #define MAX_NR_KEYMAPS 256
31
32 int dumpkmap_main(int argc, char **argv)
33 {
34         struct kbentry ke;
35         int i, j, fd;
36         char flags[MAX_NR_KEYMAPS], magic[] = "bkeymap";
37
38         if (argc >= 2 && *argv[1] == '-')
39                 bb_show_usage();
40
41         fd = bb_xopen(CURRENT_VC, O_RDWR);
42
43         write(1, magic, 7);
44
45         /* Here we want to set everything to 0 except for indexes:
46          * [0-2] [4-6] [8-10] [12] */
47         memset(flags, 0x00, MAX_NR_KEYMAPS);
48         memset(flags, 0x01, 13);
49         flags[3] = flags[7] = flags[11] = 0;
50
51         /* dump flags */
52         write(1, flags, MAX_NR_KEYMAPS);
53
54         for (i = 0; i < MAX_NR_KEYMAPS; i++) {
55                 if (flags[i] == 1) {
56                         for (j = 0; j < NR_KEYS; j++) {
57                                 ke.kb_index = j;
58                                 ke.kb_table = i;
59                                 if (ioctl(fd, KDGKBENT, &ke) < 0) {
60                                         bb_perror_msg("ioctl failed with %s, %s, %p",
61                                                 (char *)&ke.kb_index,
62                                                 (char *)&ke.kb_table,
63                                                 &ke.kb_value);
64                                 } else {
65                                         write(1, (void*)&ke.kb_value, 2);
66                                 }
67                         }
68                 }
69         }
70         close(fd);
71         return EXIT_SUCCESS;
72 }