blob: 69d33bd9532c66caa8ed6464d60a2bb8704d1e7f [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
Eric Andersenc4996011999-10-20 22:08:37 +00002/*
3 * Mini loadkmap implementation for busybox
4 *
5 * Copyright (C) 1998 Enrique Zanardi <ezanardi@ull.es>
6 *
"Robert P. J. Day"801ab142006-07-12 07:56:04 +00007 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Eric Andersenc4996011999-10-20 22:08:37 +00008 *
9 */
10
Eric Andersencc8ed391999-10-05 16:24:54 +000011#include <errno.h>
12#include <fcntl.h>
13#include <stdio.h>
Eric Andersened3ef502001-01-27 08:24:39 +000014#include <string.h>
15#include <stdlib.h>
16#include <unistd.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000017#include <sys/ioctl.h>
Eric Andersencbe31da2001-02-20 06:14:08 +000018#include "busybox.h"
Eric Andersencc8ed391999-10-05 16:24:54 +000019
Matt Kraai9133c982000-10-25 16:48:15 +000020#define BINARY_KEYMAP_MAGIC "bkeymap"
21
Eric Andersenbd22ed82000-07-08 18:55:24 +000022/* From <linux/kd.h> */
23struct kbentry {
24 unsigned char kb_table;
25 unsigned char kb_index;
26 unsigned short kb_value;
27};
Glenn L McGrathacbdc472003-11-21 09:27:02 +000028/* sets one entry in translation table */
29#define KDSKBENT 0x4B47
Eric Andersenbd22ed82000-07-08 18:55:24 +000030
31/* From <linux/keyboard.h> */
Glenn L McGrathacbdc472003-11-21 09:27:02 +000032#define NR_KEYS 128
33#define MAX_NR_KEYMAPS 256
Eric Andersenbd22ed82000-07-08 18:55:24 +000034
Erik Andersene49d5ec2000-02-08 19:58:47 +000035int loadkmap_main(int argc, char **argv)
36{
37 struct kbentry ke;
Glenn L McGrathacbdc472003-11-21 09:27:02 +000038 int i, j, fd;
39 u_short ibuff[NR_KEYS];
40 char flags[MAX_NR_KEYMAPS];
41 char buff[7];
Eric Andersencc8ed391999-10-05 16:24:54 +000042
Matt Kraai9133c982000-10-25 16:48:15 +000043 if (argc != 1)
Manuel Novoa III cad53642003-03-19 09:13:01 +000044 bb_show_usage();
Erik Andersen3fe7f9f2000-04-19 03:59:10 +000045
Glenn L McGrathacbdc472003-11-21 09:27:02 +000046 fd = bb_xopen(CURRENT_VC, O_RDWR);
Erik Andersene49d5ec2000-02-08 19:58:47 +000047
Rob Landley53437472006-07-16 08:14:35 +000048 xread(0, buff, 7);
49 if (strncmp(buff, BINARY_KEYMAP_MAGIC, 7))
Manuel Novoa III cad53642003-03-19 09:13:01 +000050 bb_error_msg_and_die("This is not a valid binary keymap.");
Erik Andersene49d5ec2000-02-08 19:58:47 +000051
Rob Landley53437472006-07-16 08:14:35 +000052 xread(0, flags, MAX_NR_KEYMAPS);
Erik Andersene49d5ec2000-02-08 19:58:47 +000053
Erik Andersene49d5ec2000-02-08 19:58:47 +000054 for (i = 0; i < MAX_NR_KEYMAPS; i++) {
55 if (flags[i] == 1) {
Rob Landley53437472006-07-16 08:14:35 +000056 xread(0, ibuff, NR_KEYS * sizeof(u_short));
Erik Andersene49d5ec2000-02-08 19:58:47 +000057 for (j = 0; j < NR_KEYS; j++) {
58 ke.kb_index = j;
59 ke.kb_table = i;
60 ke.kb_value = ibuff[j];
61 ioctl(fd, KDSKBENT, &ke);
62 }
63 }
64 }
Glenn L McGrathacbdc472003-11-21 09:27:02 +000065
Rob Landley53437472006-07-16 08:14:35 +000066 if (ENABLE_FEATURE_CLEAN_UP) close(fd);
67 return 0;
Eric Andersencc8ed391999-10-05 16:24:54 +000068}