1*55f3b092Stsutsui /* $NetBSD: loadkmap.c,v 1.12 2019/06/29 16:29:24 tsutsui Exp $ */
2d9019191Sleo
3d9019191Sleo #include <sys/types.h>
4d9019191Sleo #include <sys/stat.h>
5d9019191Sleo #include <sys/ioctl.h>
6d9019191Sleo #include "../../dev/iteioctl.h"
7d9019191Sleo #include "../../dev/kbdmap.h"
8d9019191Sleo #include <stdio.h>
952e90f00Schristos #include <string.h>
1040168232Smhitch #include <stdlib.h>
112d48e20cSchristos #include <unistd.h>
122d48e20cSchristos #include <fcntl.h>
13d9019191Sleo
146a40721fStsutsui static int load_kmap(const char *, int);
156a40721fStsutsui static int dump_kmap(void);
16d9019191Sleo
17d9019191Sleo int
main(int argc,char * argv[])1882357f6dSdsl main(int argc, char *argv[])
19d9019191Sleo {
20a4578576Sleo int set_sysmap = 0;
21a4578576Sleo char *mapfile;
22cbe57bbdSleo int rc = 0;
23a4578576Sleo
24a4578576Sleo if (argc > 2) {
25a4578576Sleo if ((argc == 3) && !strcmp(argv[1], "-f")) {
26a4578576Sleo mapfile = argv[2];
27a4578576Sleo set_sysmap = 1;
28*55f3b092Stsutsui } else {
29a4578576Sleo fprintf(stderr, "%s [-f] keymap\n", argv[0]);
30d9019191Sleo exit(1);
31d9019191Sleo }
32*55f3b092Stsutsui } else
33*55f3b092Stsutsui mapfile = argv[1];
34d9019191Sleo
35d9019191Sleo if (argc == 1)
36cbe57bbdSleo rc = dump_kmap();
37*55f3b092Stsutsui else
38*55f3b092Stsutsui rc = load_kmap(mapfile, set_sysmap);
39d9019191Sleo
40cbe57bbdSleo exit(rc);
41d9019191Sleo }
42d9019191Sleo
43d9019191Sleo
446a40721fStsutsui static int
load_kmap(const char * file,int set_sysmap)45454af1c0Sdsl load_kmap(const char *file, int set_sysmap)
46d9019191Sleo {
47d9019191Sleo int fd;
48d9019191Sleo char buf[sizeof(struct kbdmap)];
49a4578576Sleo int ioc;
50d9019191Sleo
51a4578576Sleo ioc = set_sysmap ? ITEIOCSSKMAP : ITEIOCSKMAP;
52a4578576Sleo
53a4578576Sleo if ((fd = open(file, 0)) >= 0) {
54a4578576Sleo if (read(fd, buf, sizeof(buf)) == sizeof(buf)) {
55cbe57bbdSleo if (ioctl(0, ioc, buf) == 0) {
56cbe57bbdSleo close(fd);
57cbe57bbdSleo return 0;
58*55f3b092Stsutsui } else
59*55f3b092Stsutsui perror("ITEIOCSKMAP");
60*55f3b092Stsutsui } else
61*55f3b092Stsutsui perror("read kmap");
62d9019191Sleo
63d9019191Sleo close(fd);
64*55f3b092Stsutsui } else
65*55f3b092Stsutsui perror("open kmap");
66cbe57bbdSleo return 1;
67d9019191Sleo }
68d9019191Sleo
696a40721fStsutsui static int
dump_kmap(void)70df7f595eScegger dump_kmap(void)
71d9019191Sleo {
72d9019191Sleo char buf[sizeof(struct kbdmap)];
73a4578576Sleo
74cbe57bbdSleo if (ioctl(0, ITEIOCGKMAP, buf) == 0) {
75d9019191Sleo write(1, buf, sizeof(buf));
76cbe57bbdSleo return 0;
77cbe57bbdSleo }
78cbe57bbdSleo perror("ITEIOCGKMAP");
79cbe57bbdSleo return 1;
80d9019191Sleo }
81