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