~vcs-imports/busybox/trunk

« back to all changes in this revision

Viewing changes to console-tools/setkeycodes.c

  • Committer: Eric Andersen
  • Date: 1999-11-24 09:04:33 UTC
  • Revision ID: git-v1:b99df0fd65abe3245fa2d04115326100847f865e
First draft

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* vi: set sw=4 ts=4: */
2
 
/*
3
 
 * setkeycodes
4
 
 *
5
 
 * Copyright (C) 1994-1998 Andries E. Brouwer <aeb@cwi.nl>
6
 
 *
7
 
 * Adjusted for BusyBox by Erik Andersen <andersen@codepoet.org>
8
 
 *
9
 
 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
10
 
 */
11
 
//config:config SETKEYCODES
12
 
//config:       bool "setkeycodes (2.4 kb)"
13
 
//config:       default y
14
 
//config:       help
15
 
//config:       This program loads entries into the kernel's scancode-to-keycode
16
 
//config:       map, allowing unusual keyboards to generate usable keycodes.
17
 
 
18
 
//applet:IF_SETKEYCODES(APPLET_NOEXEC(setkeycodes, setkeycodes, BB_DIR_USR_BIN, BB_SUID_DROP, setkeycodes))
19
 
 
20
 
//kbuild:lib-$(CONFIG_SETKEYCODES) += setkeycodes.o
21
 
 
22
 
//usage:#define setkeycodes_trivial_usage
23
 
//usage:       "{ SCANCODE KEYCODE }..."
24
 
//usage:#define setkeycodes_full_usage "\n\n"
25
 
//usage:       "Modify kernel's scancode-to-keycode map,\n"
26
 
//usage:       "allowing unusual keyboards to generate usable keycodes.\n\n"
27
 
//usage:       "SCANCODE is either xx or e0xx (hexadecimal), KEYCODE is decimal."
28
 
//usage:
29
 
//usage:#define setkeycodes_example_usage
30
 
//usage:       "$ setkeycodes e030 127\n"
31
 
 
32
 
#include "libbb.h"
33
 
 
34
 
/* From <linux/kd.h> */
35
 
struct kbkeycode {
36
 
        unsigned scancode, keycode;
37
 
};
38
 
enum {
39
 
        KDSETKEYCODE = 0x4B4D  /* write kernel keycode table entry */
40
 
};
41
 
 
42
 
int setkeycodes_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
43
 
int setkeycodes_main(int argc, char **argv)
44
 
{
45
 
        int fd;
46
 
 
47
 
        if (!(argc & 1) /* if even */ || argc < 2) {
48
 
                bb_show_usage();
49
 
        }
50
 
 
51
 
        fd = get_console_fd_or_die();
52
 
 
53
 
        while (argv[1]) {
54
 
                struct kbkeycode a;
55
 
                int sc;
56
 
 
57
 
                sc = xstrtoul_range(argv[1], 16, 0, 0xe07f);
58
 
                if (sc >= 0xe000) {
59
 
                        sc -= 0xe000;
60
 
                        sc += 0x0080;
61
 
                }
62
 
                a.scancode = sc;
63
 
                a.keycode = xatou_range(argv[2], 0, 255);
64
 
                ioctl_or_perror_and_die(fd, KDSETKEYCODE, &a,
65
 
                        "can't set SCANCODE %x to KEYCODE %d",
66
 
                        sc, a.keycode);
67
 
                argv += 2;
68
 
        }
69
 
        return EXIT_SUCCESS;
70
 
}