diff options
-rw-r--r-- | console-tools/loadkmap.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/console-tools/loadkmap.c b/console-tools/loadkmap.c index bcffe16..66ec3b0 100644 --- a/console-tools/loadkmap.c +++ b/console-tools/loadkmap.c @@ -48,6 +48,7 @@ int loadkmap_main(int argc UNUSED_PARAM, char **argv) if (argv[1]) bb_show_usage(); /* bb_warn_ignoring_args(argv[1]); */ + fd = get_console_fd_or_die(); /* or maybe: opt = getopt32(argv, "C:", &tty_name); @@ -61,14 +62,24 @@ int loadkmap_main(int argc UNUSED_PARAM, char **argv) xread(STDIN_FILENO, flags, MAX_NR_KEYMAPS); for (i = 0; i < MAX_NR_KEYMAPS; i++) { - if (flags[i] == 1) { - xread(STDIN_FILENO, ibuff, NR_KEYS * sizeof(uint16_t)); - for (j = 0; j < NR_KEYS; j++) { - ke.kb_index = j; - ke.kb_table = i; - ke.kb_value = ibuff[j]; - ioctl(fd, KDSKBENT, &ke); - } + if (flags[i] != 1) + continue; + xread(STDIN_FILENO, ibuff, NR_KEYS * sizeof(uint16_t)); + for (j = 0; j < NR_KEYS; j++) { + ke.kb_index = j; + ke.kb_table = i; + ke.kb_value = ibuff[j]; + /* + * Note: table[idx:0] can contain special value + * K_ALLOCATED (marks allocated tables in kernel). + * dumpkmap saves the value as-is; but attempts + * to load it here fail, since it isn't a valid + * key value: it is K(KT_SPEC,126) == 2<<8 + 126, + * whereas last valid KT_SPEC is + * K_BARENUMLOCK == K(KT_SPEC,19). + * So far we just ignore these errors: + */ + ioctl(fd, KDSKBENT, &ke); } } |