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 "libbb.h" 12 13/* From <linux/kd.h> */ 14struct kbentry { 15 unsigned char kb_table; 16 unsigned char kb_index; 17 unsigned short kb_value; 18}; 19#define KDGKBENT 0x4B46 /* gets one entry in translation table */ 20 21/* From <linux/keyboard.h> */ 22#define NR_KEYS 128 23#define MAX_NR_KEYMAPS 256 24 25int dumpkmap_main(int argc, char **argv); 26int dumpkmap_main(int argc, char **argv) 27{ 28 struct kbentry ke; 29 int i, j, fd; 30 char flags[MAX_NR_KEYMAPS]; 31 32 if (argc >= 2 && argv[1][0] == '-') 33 bb_show_usage(); 34 35 fd = xopen(CURRENT_VC, O_RDWR); 36 37 write(1, "bkeymap", 7); 38 39 /* Here we want to set everything to 0 except for indexes: 40 * [0-2] [4-6] [8-10] [12] */ 41 memset(flags, 0x00, MAX_NR_KEYMAPS); 42 memset(flags, 0x01, 13); 43 flags[3] = flags[7] = flags[11] = 0; 44 45 /* dump flags */ 46 write(1, flags, MAX_NR_KEYMAPS); 47 48 for (i = 0; i < MAX_NR_KEYMAPS; i++) { 49 if (flags[i] == 1) { 50 for (j = 0; j < NR_KEYS; j++) { 51 ke.kb_index = j; 52 ke.kb_table = i; 53 if (!ioctl_or_perror(fd, KDGKBENT, &ke, 54 "ioctl failed with %s, %s, %p", 55 (char *)&ke.kb_index, 56 (char *)&ke.kb_table, 57 &ke.kb_value) 58 ) { 59 write(1, (void*)&ke.kb_value, 2); 60 } 61 } 62 } 63 } 64 close(fd); 65 return EXIT_SUCCESS; 66} 67