]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/sade/keymap.c
This commit was generated by cvs2svn to compensate for changes in r101615,
[FreeBSD/FreeBSD.git] / usr.sbin / sade / keymap.c
1 /*
2  * Copyright (c) 1996 Joerg Wunsch
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  * $FreeBSD$
25  *
26  */
27
28 #include "sysinstall.h"
29 #include <errno.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <sys/kbio.h>
34
35 struct keymapInfo {
36     const char *name;
37     const struct keymap *map;
38 };
39
40 #include "keymap.h"
41
42 /*
43  * keymap.h is being automatically generated by the Makefile.  It
44  * contains definitions for all desired keymaps.  Note that since we
45  * don't support font loading nor screen mapping during installation,
46  * we simply don't care for any other keys than the ASCII subset.
47  *
48  * Therefore, if no keymap with the exact name has been found in the
49  * first pass, we make a second pass over the table looking just for
50  * the language name only.
51  */
52
53 /*
54  * Return values:
55  *
56  *  0: OK
57  * -1: no appropriate keymap found
58  * -2: error installing map (other than ENXIO which means we're not on syscons)
59  */
60
61 int
62 loadKeymap(const char *lang)
63 {
64     int passno, err;
65     char *llang;
66     size_t l;
67     struct keymapInfo *kip;
68
69     llang = strdup(lang);
70     if (llang == NULL)
71         abort();
72
73     for (passno = 0; passno < 2; passno++)
74     {
75         if (passno > 0) 
76         {
77             /* make the match more fuzzy */
78             l = strspn(llang, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
79             llang[l] = '\0';
80         }
81
82         l = strlen(llang);
83
84         for (kip = keymapInfos; kip->name; kip++)
85             if (strncmp(kip->name, llang, l) == 0)
86             {
87                 /* Yep, got it! */
88                 err = ioctl(0, PIO_KEYMAP, kip->map);
89                 free(llang);
90                 return (err == -1 && errno != ENOTTY)? -2: 0;
91             }
92     }
93     free(llang);
94     return -1;
95 }