11.12Stsutsui/* $NetBSD: loadkmap.c,v 1.12 2019/06/29 16:29:24 tsutsui Exp $ */ 21.1Sleo 31.1Sleo#include <sys/types.h> 41.1Sleo#include <sys/stat.h> 51.1Sleo#include <sys/ioctl.h> 61.1Sleo#include "../../dev/iteioctl.h" 71.1Sleo#include "../../dev/kbdmap.h" 81.1Sleo#include <stdio.h> 91.10Schristos#include <string.h> 101.4Smhitch#include <stdlib.h> 111.9Schristos#include <unistd.h> 121.9Schristos#include <fcntl.h> 131.1Sleo 141.11Stsutsuistatic int load_kmap(const char *, int); 151.11Stsutsuistatic int dump_kmap(void); 161.1Sleo 171.1Sleoint 181.7Sdslmain(int argc, char *argv[]) 191.1Sleo{ 201.2Sleo int set_sysmap = 0; 211.2Sleo char *mapfile; 221.3Sleo int rc = 0; 231.1Sleo 241.2Sleo if (argc > 2) { 251.2Sleo if ((argc == 3) && !strcmp(argv[1], "-f")) { 261.2Sleo mapfile = argv[2]; 271.2Sleo set_sysmap = 1; 281.12Stsutsui } else { 291.2Sleo fprintf(stderr, "%s [-f] keymap\n", argv[0]); 301.2Sleo exit(1); 311.2Sleo } 321.12Stsutsui } else 331.12Stsutsui mapfile = argv[1]; 341.2Sleo 351.2Sleo if (argc == 1) 361.3Sleo rc = dump_kmap(); 371.12Stsutsui else 381.12Stsutsui rc = load_kmap(mapfile, set_sysmap); 391.2Sleo 401.12Stsutsui exit(rc); 411.1Sleo} 421.1Sleo 431.1Sleo 441.11Stsutsuistatic int 451.6Sdslload_kmap(const char *file, int set_sysmap) 461.1Sleo{ 471.2Sleo int fd; 481.12Stsutsui char buf[sizeof(struct kbdmap)]; 491.2Sleo int ioc; 501.2Sleo 511.2Sleo ioc = set_sysmap ? ITEIOCSSKMAP : ITEIOCSKMAP; 521.2Sleo 531.12Stsutsui if ((fd = open(file, 0)) >= 0) { 541.12Stsutsui if (read(fd, buf, sizeof(buf)) == sizeof(buf)) { 551.12Stsutsui if (ioctl(0, ioc, buf) == 0) { 561.3Sleo close(fd); 571.3Sleo return 0; 581.12Stsutsui } else 591.12Stsutsui perror("ITEIOCSKMAP"); 601.12Stsutsui } else 611.12Stsutsui perror("read kmap"); 621.1Sleo 631.2Sleo close(fd); 641.12Stsutsui } else 651.12Stsutsui perror("open kmap"); 661.3Sleo return 1; 671.1Sleo} 681.1Sleo 691.11Stsutsuistatic int 701.8Sceggerdump_kmap(void) 711.1Sleo{ 721.12Stsutsui char buf[sizeof(struct kbdmap)]; 731.2Sleo 741.12Stsutsui if (ioctl(0, ITEIOCGKMAP, buf) == 0) { 751.12Stsutsui write(1, buf, sizeof(buf)); 761.3Sleo return 0; 771.3Sleo } 781.12Stsutsui perror("ITEIOCGKMAP"); 791.3Sleo return 1; 801.1Sleo} 81