xref: /netbsd-src/sys/arch/atari/stand/loadkmap/loadkmap.c (revision 55f3b092cec81a6184f07a65dbbec4a076c1d106)
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