xref: /dragonfly/usr.sbin/installer/libdfui/lang.c (revision 73610d44)
1 /*
2  * $Id: lang.c,v 1.5 2005/02/12 00:31:46 cpressey Exp $
3  */
4 
5 #include <err.h>
6 #include <stdio.h>
7 #include <stdarg.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 
12 #include "lang.h"
13 
14 struct _langset {
15 	const char *name;
16 	const char *font8x8;
17 	const char *font8x14;
18 	const char *font8x16;
19 	const char *keymap;
20 	const char *scrnmap;
21 	const char *language;
22 	const char *charset;
23 	const char *term;
24 } langset[] = {
25 	{ "ru", "cp866-8x8", "cp866-8x14", "cp866-8x16", "ru.koi8-r", "koi8-r2cp866", "ru_RU.KOI8-R", "KOI8-R", "cons25r" }
26 };
27 
28 #define langcount (sizeof(langset) / sizeof(struct _langset))
29 
30 static int	get_lang_num(const char *langname);
31 static int	system_fmt(const char *fmt, ...) __printflike(1, 2);
32 
33 
34 static int
35 get_lang_num(const char *langname)
36 {
37 	size_t i;
38 
39 	for(i =0; i < langcount; i++)
40 		if(strcmp(langset[i].name, langname) == 0)
41 			return i;
42 
43 	return -1;
44 }
45 
46 static int
47 system_fmt(const char *fmt, ...)
48 {
49 	char *command;
50         va_list args;
51 
52         va_start(args, fmt);
53         vasprintf(&command, fmt, args);
54         va_end(args);
55 
56 #ifdef DEBUG
57 	fprintf(stderr, "%s\n", command);
58 #endif
59 
60         return(system(command));
61 }
62 
63 /* do this once */
64 int
65 set_lang_syscons(const char *id)
66 {
67 	int lang_num;
68 
69 	lang_num = get_lang_num(id);
70 
71 	if(lang_num < 0)
72 		return(0);
73 
74 #define kbddev "/dev/ttyv0"
75 #define viddev "/dev/ttyv0"
76 #define kbdcontrol "/usr/sbin/kbdcontrol"
77 #define vidcontrol "/usr/sbin/vidcontrol"
78 
79 	if (
80 	system_fmt("%s < %s -l %s", kbdcontrol, kbddev, langset[lang_num].keymap) != 0 ||
81 	system_fmt("%s < %s -l %s", vidcontrol, viddev, langset[lang_num].scrnmap) != 0 ||
82 	system_fmt("%s < %s -f 8x8 %s", vidcontrol, viddev, langset[lang_num].font8x8) != 0 ||
83 	system_fmt("%s < %s -f 8x14 %s", vidcontrol, viddev, langset[lang_num].font8x14) != 0 ||
84 	system_fmt("%s < %s -f 8x16 %s", vidcontrol, viddev, langset[lang_num].font8x16) != 0)
85 		return(0);
86 
87 	return(1);
88 }
89 
90 /* do this for each side (backend, frontend) */
91 int
92 set_lang_envars(const char *id)
93 {
94 	char *term;
95 
96 	int lang_num;
97 
98 	lang_num = get_lang_num(id);
99 
100 	if(lang_num < 0)
101 		return(0);
102 
103 	/* gettext recommended setting */
104 	setenv("LANGUAGE", langset[lang_num].name, 1);
105 
106 	/* also should be set */
107 	setenv("LANG", langset[lang_num].language, 1);
108 
109 	/* set this too for completeness */
110 	setenv("MM_CHARSET", langset[lang_num].charset, 1);
111 
112 	/* TERM must be set for some encodings */
113 	term = getenv("TERM");
114 	if((strcmp(term,"cons25") == 0) &&
115 		langset[lang_num].term != NULL)
116 		setenv("TERM", langset[lang_num].term, 1);
117 
118 	return(1);
119 }
120