7 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
8 |
* |
* |
9 |
*/ |
*/ |
10 |
|
/* no options, no getopt */ |
11 |
|
|
12 |
#include "busybox.h" |
#include "libbb.h" |
13 |
|
|
14 |
/* From <linux/kd.h> */ |
/* From <linux/kd.h> */ |
15 |
struct kbentry { |
struct kbentry { |
23 |
#define NR_KEYS 128 |
#define NR_KEYS 128 |
24 |
#define MAX_NR_KEYMAPS 256 |
#define MAX_NR_KEYMAPS 256 |
25 |
|
|
26 |
int dumpkmap_main(int argc, char **argv) |
int dumpkmap_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
27 |
|
int dumpkmap_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) |
28 |
{ |
{ |
29 |
struct kbentry ke; |
struct kbentry ke; |
30 |
int i, j, fd; |
int i, j, fd; |
31 |
char flags[MAX_NR_KEYMAPS], magic[] = "bkeymap"; |
RESERVE_CONFIG_BUFFER(flags,MAX_NR_KEYMAPS); |
32 |
|
|
33 |
if (argc >= 2 && *argv[1] == '-') |
/* bb_warn_ignoring_args(argc>=2);*/ |
|
bb_show_usage(); |
|
34 |
|
|
35 |
fd = xopen(CURRENT_VC, O_RDWR); |
fd = get_console_fd_or_die(); |
36 |
|
|
37 |
write(1, magic, 7); |
write(STDOUT_FILENO, "bkeymap", 7); |
38 |
|
|
39 |
/* Here we want to set everything to 0 except for indexes: |
/* Here we want to set everything to 0 except for indexes: |
40 |
* [0-2] [4-6] [8-10] [12] */ |
* [0-2] [4-6] [8-10] [12] */ |
43 |
flags[3] = flags[7] = flags[11] = 0; |
flags[3] = flags[7] = flags[11] = 0; |
44 |
|
|
45 |
/* dump flags */ |
/* dump flags */ |
46 |
write(1, flags, MAX_NR_KEYMAPS); |
write(STDOUT_FILENO, flags, MAX_NR_KEYMAPS); |
47 |
|
|
48 |
for (i = 0; i < MAX_NR_KEYMAPS; i++) { |
for (i = 0; i < MAX_NR_KEYMAPS; i++) { |
49 |
if (flags[i] == 1) { |
if (flags[i] == 1) { |
50 |
for (j = 0; j < NR_KEYS; j++) { |
for (j = 0; j < NR_KEYS; j++) { |
51 |
ke.kb_index = j; |
ke.kb_index = j; |
52 |
ke.kb_table = i; |
ke.kb_table = i; |
53 |
if (ioctl(fd, KDGKBENT, &ke) < 0) { |
if (!ioctl_or_perror(fd, KDGKBENT, &ke, |
54 |
bb_perror_msg("ioctl failed with %s, %s, %p", |
"ioctl failed with %s, %s, %p", |
55 |
(char *)&ke.kb_index, |
(char *)&ke.kb_index, |
56 |
(char *)&ke.kb_table, |
(char *)&ke.kb_table, |
57 |
&ke.kb_value); |
&ke.kb_value) |
58 |
} else { |
) { |
59 |
write(1, (void*)&ke.kb_value, 2); |
write(STDOUT_FILENO, (void*)&ke.kb_value, 2); |
60 |
} |
} |
61 |
} |
} |
62 |
} |
} |
63 |
} |
} |
64 |
close(fd); |
if (ENABLE_FEATURE_CLEAN_UP) { |
65 |
|
close(fd); |
66 |
|
RELEASE_CONFIG_BUFFER(flags); |
67 |
|
} |
68 |
return EXIT_SUCCESS; |
return EXIT_SUCCESS; |
69 |
} |
} |