From 61dc0571832b88097192a8c0eab190a44c577371 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 11 Jul 2000 17:29:36 +0000 Subject: [PATCH] Added 'dumpkmap' to allow people to dump a binary keymap, which can then be loaded in by 'loadkmap' -- submitted by Arne Bernin -Erik --- Changelog | 3 ++ applets/busybox.c | 3 ++ busybox.c | 3 ++ busybox.def.h | 1 + console-tools/dumpkmap.c | 100 +++++++++++++++++++++++++++++++++++++++ console-tools/loadkmap.c | 2 +- docs/busybox.pod | 12 ++++- docs/busybox.sgml | 35 ++++++++++---- dumpkmap.c | 100 +++++++++++++++++++++++++++++++++++++++ internal.h | 1 + loadkmap.c | 2 +- 11 files changed, 248 insertions(+), 14 deletions(-) create mode 100644 console-tools/dumpkmap.c create mode 100644 dumpkmap.c diff --git a/Changelog b/Changelog index 5d8680390..af2320668 100644 --- a/Changelog +++ b/Changelog @@ -41,6 +41,9 @@ couldn't maintain it very well, so including it was not really very appropriate. Those wanting an fdisk are invited to grab a copy from util-linux. + * Added 'dumpkmap' to allow people to dump a binary keymap, which can + then be loaded in by 'loadkmap' -- submitted by + Arne Bernin * Fixed NFS so it supports 2.4.x kernels and NFSv3. diff --git a/applets/busybox.c b/applets/busybox.c index 44fa16994..5471db597 100644 --- a/applets/busybox.c +++ b/applets/busybox.c @@ -87,6 +87,9 @@ const struct BB_applet applets[] = { #ifdef BB_DU {"du", du_main, _BB_DIR_BIN}, #endif +#ifdef BB_DUMPKMAP + {"dumpkmap", dumpkmap_main, _BB_DIR_BIN}, +#endif #ifdef BB_DUTMP {"dutmp", dutmp_main, _BB_DIR_USR_SBIN}, #endif diff --git a/busybox.c b/busybox.c index 44fa16994..5471db597 100644 --- a/busybox.c +++ b/busybox.c @@ -87,6 +87,9 @@ const struct BB_applet applets[] = { #ifdef BB_DU {"du", du_main, _BB_DIR_BIN}, #endif +#ifdef BB_DUMPKMAP + {"dumpkmap", dumpkmap_main, _BB_DIR_BIN}, +#endif #ifdef BB_DUTMP {"dutmp", dutmp_main, _BB_DIR_USR_SBIN}, #endif diff --git a/busybox.def.h b/busybox.def.h index 0f2bcefeb..854de1466 100644 --- a/busybox.def.h +++ b/busybox.def.h @@ -25,6 +25,7 @@ #define BB_DMESG #define BB_DUTMP #define BB_DU +#define BB_DUMPKMAP #define BB_ECHO #define BB_FBSET #define BB_FDFLUSH diff --git a/console-tools/dumpkmap.c b/console-tools/dumpkmap.c new file mode 100644 index 000000000..a497a07d1 --- /dev/null +++ b/console-tools/dumpkmap.c @@ -0,0 +1,100 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini dumpkmap implementation for busybox + * + * Copyright (C) Arne Bernin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include +#include +#include + +/* From */ +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + unsigned short kb_value; +}; +#define KDGKBENT 0x4B46 /* gets one entry in translation table */ + +/* From */ +#define NR_KEYS 128 +#define MAX_NR_KEYMAPS 256 + + +static const char dumpkmap_usage[] = "dumpkmap\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints out a binary keyboard translation table to standard input.\n" +#endif + ; + + +int dumpkmap_main(int argc, char **argv) +{ + struct kbentry ke; + int i, j, fd; + char flags[MAX_NR_KEYMAPS], magic[] = "bkeymap"; + + if (argc>=2 && *argv[1]=='-') { + usage(dumpkmap_usage); + } + + fd = open("/dev/tty0", O_RDWR); + if (fd < 0) { + fprintf(stderr, "Error opening /dev/tty0: %s\n", strerror(errno)); + return 1; + } + + write(1, magic, 7); + + for (i=0; i < MAX_NR_KEYMAPS; i++) flags[i]=0; + flags[0]=1; + flags[1]=1; + flags[2]=1; + flags[4]=1; + flags[5]=1; + flags[6]=1; + flags[8]=1; + flags[9]=1; + flags[10]=1; + flags[12]=1; + + /* dump flags */ + for (i=0; i < MAX_NR_KEYMAPS; i++) write(1,&flags[i],1); + + for (i = 0; i < MAX_NR_KEYMAPS; i++) { + if (flags[i] == 1) { + for (j = 0; j < NR_KEYS; j++) { + ke.kb_index = j; + ke.kb_table = i; + if (ioctl(fd, KDGKBENT, &ke) < 0) { + + fprintf(stderr, "ioctl returned: %s, %s, %s, %xqq\n",strerror(errno),(char *)&ke.kb_index,(char *)&ke.kb_table,(int)&ke.kb_value); + } + else { + write(1,&ke.kb_value,2); + } + + } + } + } + close(fd); + return 0; +} diff --git a/console-tools/loadkmap.c b/console-tools/loadkmap.c index 0e8c090d2..c2e4c94ed 100644 --- a/console-tools/loadkmap.c +++ b/console-tools/loadkmap.c @@ -41,7 +41,7 @@ struct kbentry { static const char loadkmap_usage[] = "loadkmap\n" #ifndef BB_FEATURE_TRIVIAL_HELP - "Loads a binary keyboard translation table from standard input.\n" + "\nLoads a binary keyboard translation table from standard input.\n" #endif ; diff --git a/docs/busybox.pod b/docs/busybox.pod index b36619909..0e611deef 100644 --- a/docs/busybox.pod +++ b/docs/busybox.pod @@ -56,7 +56,7 @@ terse runtime description of their behavior. Currently defined functions include: ar, basename, cat, chgrp, chmod, chown, chroot, chvt, clear, cp, cut, date, -dc, dd, deallocvt, df, dirname, dmesg, du, dutmp, echo, false, fbset, +dc, dd, deallocvt, df, dirname, dmesg, du, dumpkmap, dutmp, echo, false, fbset, fdflush, find, free, freeramdisk, fsck.minix, grep, gunzip, gzip, halt, head, hostid, hostname, id, init, insmod, kill, killall, length, ln, loadacm, loadfont, loadkmap, logger, logname, ls, lsmod, makedevs, mkdir, @@ -440,6 +440,14 @@ Example: ------------------------------- +=item dumpkmap + +Usage: dumpkmap + +Prints out a binary keyboard translation table to standard input. + +------------------------------- + =item dutmp Usage: dutmp [FILE] @@ -2020,4 +2028,4 @@ Enrique Zanardi =cut -# $Id: busybox.pod,v 1.55 2000/07/08 00:09:30 andersen Exp $ +# $Id: busybox.pod,v 1.56 2000/07/11 17:29:36 andersen Exp $ diff --git a/docs/busybox.sgml b/docs/busybox.sgml index ca76b0f59..92b02c9ee 100644 --- a/docs/busybox.sgml +++ b/docs/busybox.sgml @@ -132,16 +132,19 @@ - ar, basename, cat, chgrp, chmod, chown, chroot, chvt, clear, cp, cut, date, - dc, dd, deallocvt, df, dirname, dmesg, du, dutmp, echo, false, fbset, - fdflush, find, free, freeramdisk, fsck.minix, grep, gunzip, gzip, halt, - head, hostid, hostname, id, init, insmod, kill, killall, length, ln, - loadacm, loadfont, loadkmap, logger, logname, ls, lsmod, makedevs, mkdir, - mkfifo, mkfs.minix, mknod, mkswap, mktemp, more, mount, mt, mv, nc, - nslookup, ping, poweroff, printf, ps, pwd, reboot, rm, rmdir, rmmod, sed, - setkeycodes, sh, sleep, sort, swapoff, swapon, sync, syslogd, tail, - tar, tee, telnet, test, touch, tr, true, tty, umount, uname, uniq, update, - uptime, usleep, uudecode, uuencode, wc, which, whoami, yes, zcat, [ + ar, basename, cat, chgrp, chmod, chown, chroot, chvt, clear, + cp, cut, date, dc, dd, deallocvt, df, dirname, dmesg, du, + dumpkmap, dutmp, echo, false, fbset, fdflush, find, free, + freeramdisk, fsck.minix, grep, gunzip, gzip, halt, head, + hostid, hostname, id, init, insmod, kill, killall, length, ln, + loadacm, loadfont, loadkmap, logger, logname, ls, lsmod, + makedevs, mkdir, mkfifo, mkfs.minix, mknod, mkswap, mktemp, + more, mount, mt, mv, nc, nslookup, ping, poweroff, printf, ps, + pwd, reboot, rm, rmdir, rmmod, sed, setkeycodes, sh, sleep, + sort, swapoff, swapon, sync, syslogd, tail, tar, tee, telnet, + test, touch, tr, true, tty, umount, uname, uniq, update, + uptime, usleep, uudecode, uuencode, wc, which, whoami, yes, + zcat, [ @@ -783,6 +786,18 @@ + + dumpkmap + + + Usage: dumpkmap + + + + Prints out a binary keyboard translation table to standard input. + + + dutmp diff --git a/dumpkmap.c b/dumpkmap.c new file mode 100644 index 000000000..a497a07d1 --- /dev/null +++ b/dumpkmap.c @@ -0,0 +1,100 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini dumpkmap implementation for busybox + * + * Copyright (C) Arne Bernin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include +#include +#include + +/* From */ +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + unsigned short kb_value; +}; +#define KDGKBENT 0x4B46 /* gets one entry in translation table */ + +/* From */ +#define NR_KEYS 128 +#define MAX_NR_KEYMAPS 256 + + +static const char dumpkmap_usage[] = "dumpkmap\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints out a binary keyboard translation table to standard input.\n" +#endif + ; + + +int dumpkmap_main(int argc, char **argv) +{ + struct kbentry ke; + int i, j, fd; + char flags[MAX_NR_KEYMAPS], magic[] = "bkeymap"; + + if (argc>=2 && *argv[1]=='-') { + usage(dumpkmap_usage); + } + + fd = open("/dev/tty0", O_RDWR); + if (fd < 0) { + fprintf(stderr, "Error opening /dev/tty0: %s\n", strerror(errno)); + return 1; + } + + write(1, magic, 7); + + for (i=0; i < MAX_NR_KEYMAPS; i++) flags[i]=0; + flags[0]=1; + flags[1]=1; + flags[2]=1; + flags[4]=1; + flags[5]=1; + flags[6]=1; + flags[8]=1; + flags[9]=1; + flags[10]=1; + flags[12]=1; + + /* dump flags */ + for (i=0; i < MAX_NR_KEYMAPS; i++) write(1,&flags[i],1); + + for (i = 0; i < MAX_NR_KEYMAPS; i++) { + if (flags[i] == 1) { + for (j = 0; j < NR_KEYS; j++) { + ke.kb_index = j; + ke.kb_table = i; + if (ioctl(fd, KDGKBENT, &ke) < 0) { + + fprintf(stderr, "ioctl returned: %s, %s, %s, %xqq\n",strerror(errno),(char *)&ke.kb_index,(char *)&ke.kb_table,(int)&ke.kb_value); + } + else { + write(1,&ke.kb_value,2); + } + + } + } + } + close(fd); + return 0; +} diff --git a/internal.h b/internal.h index 4ef15325e..8086aa1ca 100644 --- a/internal.h +++ b/internal.h @@ -117,6 +117,7 @@ extern int deallocvt_main(int argc, char** argv); extern int df_main(int argc, char** argv); extern int dmesg_main(int argc, char** argv); extern int du_main(int argc, char** argv); +extern int dumpkmap_main(int argc, char** argv); extern int dutmp_main(int argc, char** argv); extern int echo_main(int argc, char** argv); extern int false_main(int argc, char** argv); diff --git a/loadkmap.c b/loadkmap.c index 0e8c090d2..c2e4c94ed 100644 --- a/loadkmap.c +++ b/loadkmap.c @@ -41,7 +41,7 @@ struct kbentry { static const char loadkmap_usage[] = "loadkmap\n" #ifndef BB_FEATURE_TRIVIAL_HELP - "Loads a binary keyboard translation table from standard input.\n" + "\nLoads a binary keyboard translation table from standard input.\n" #endif ; -- 2.25.1