1#include <stdio.h> 2#include <stdlib.h> 3#include <fcntl.h> 4#include <string.h> 5#include <linux/kd.h> 6#include <linux/vt.h> 7#include <errno.h> 8 9static void setkey_usage(char *argv[]) 10{ 11 fprintf(stderr, "%s [-t <table>] [-k <index>] [-v value] [-r] [-h]\n" 12 " -t <table> Select table\n" 13 " -k <index> Select key\n" 14 " -v <value> Set entry\n" 15 " -r Read current entry\n" 16 " -h Print help\n", argv[0]); 17} 18 19#define TTYDEV "/dev/tty0" 20 21int setkey_main(int argc, char *argv[]) 22{ 23 int fd; 24 struct kbentry kbe; 25 int did_something = 0; 26 27 kbe.kb_table = 0; 28 kbe.kb_index = -1; 29 kbe.kb_value = 0; 30 31 fd = open(TTYDEV, O_RDWR | O_SYNC); 32 if (fd < 0) { 33 fprintf(stderr, "open %s: %s\n", TTYDEV, strerror(errno)); 34 return 1; 35 } 36 37 do { 38 int c, ret; 39 40 c = getopt(argc, argv, "t:k:v:hr"); 41 if (c == EOF) 42 break; 43 44 switch (c) { 45 case 't': 46 kbe.kb_table = strtol(optarg, NULL, 0); 47 break; 48 case 'k': 49 kbe.kb_index = strtol(optarg, NULL, 0); 50 break; 51 case 'v': 52 kbe.kb_value = strtol(optarg, NULL, 0); 53 ret = ioctl(fd, KDSKBENT, &kbe); 54 if (ret < 0) { 55 fprintf(stderr, "KDSKBENT %d %d %d failed: %s\n", 56 kbe.kb_table, kbe.kb_index, kbe.kb_value, 57 strerror(errno)); 58 return 1; 59 } 60 did_something = 1; 61 break; 62 case 'r': 63 ret = ioctl(fd, KDGKBENT, &kbe); 64 if (ret < 0) { 65 fprintf(stderr, "KDGKBENT %d %d failed: %s\n", 66 kbe.kb_table, kbe.kb_index, strerror(errno)); 67 return 1; 68 } 69 printf("0x%x 0x%x 0x%x\n", 70 kbe.kb_table, kbe.kb_index, kbe.kb_value); 71 did_something = 1; 72 break; 73 case 'h': 74 setkey_usage(argv); 75 return 1; 76 case '?': 77 fprintf(stderr, "%s: invalid option -%c\n", 78 argv[0], optopt); 79 return 1; 80 } 81 } while (1); 82 83 if(optind != argc || !did_something) { 84 setkey_usage(argv); 85 return 1; 86 } 87 88 return 0; 89} 90