186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino * $Id: lang.c,v 1.5 2005/02/12 00:31:46 cpressey Exp $
386d7f5d3SJohn Marino */
486d7f5d3SJohn Marino
586d7f5d3SJohn Marino #include <err.h>
686d7f5d3SJohn Marino #include <stdio.h>
786d7f5d3SJohn Marino #include <stdarg.h>
886d7f5d3SJohn Marino #include <stdlib.h>
986d7f5d3SJohn Marino #include <string.h>
1086d7f5d3SJohn Marino #include <unistd.h>
1186d7f5d3SJohn Marino
1286d7f5d3SJohn Marino #include "lang.h"
1386d7f5d3SJohn Marino
1486d7f5d3SJohn Marino struct _langset {
1586d7f5d3SJohn Marino const char *name;
1686d7f5d3SJohn Marino const char *font8x8;
1786d7f5d3SJohn Marino const char *font8x14;
1886d7f5d3SJohn Marino const char *font8x16;
1986d7f5d3SJohn Marino const char *keymap;
2086d7f5d3SJohn Marino const char *scrnmap;
2186d7f5d3SJohn Marino const char *language;
2286d7f5d3SJohn Marino const char *charset;
2386d7f5d3SJohn Marino const char *term;
2486d7f5d3SJohn Marino } langset[] = {
2586d7f5d3SJohn Marino { "ru", "cp866-8x8", "cp866-8x14", "cp866-8x16", "ru.koi8-r", "koi8-r2cp866", "ru_RU.KOI8-R", "KOI8-R", "cons25r" }
2686d7f5d3SJohn Marino };
2786d7f5d3SJohn Marino
2886d7f5d3SJohn Marino #define langcount (sizeof(langset) / sizeof(struct _langset))
2986d7f5d3SJohn Marino
3086d7f5d3SJohn Marino static int get_lang_num(const char *langname);
3186d7f5d3SJohn Marino static int system_fmt(const char *fmt, ...) __printflike(1, 2);
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino
3486d7f5d3SJohn Marino static int
get_lang_num(const char * langname)3586d7f5d3SJohn Marino get_lang_num(const char *langname)
3686d7f5d3SJohn Marino {
3786d7f5d3SJohn Marino size_t i;
3886d7f5d3SJohn Marino
3986d7f5d3SJohn Marino for(i =0; i < langcount; i++)
4086d7f5d3SJohn Marino if(strcmp(langset[i].name, langname) == 0)
4186d7f5d3SJohn Marino return i;
4286d7f5d3SJohn Marino
4386d7f5d3SJohn Marino return -1;
4486d7f5d3SJohn Marino }
4586d7f5d3SJohn Marino
4686d7f5d3SJohn Marino static int
system_fmt(const char * fmt,...)4786d7f5d3SJohn Marino system_fmt(const char *fmt, ...)
4886d7f5d3SJohn Marino {
4986d7f5d3SJohn Marino char *command;
5086d7f5d3SJohn Marino va_list args;
5186d7f5d3SJohn Marino
5286d7f5d3SJohn Marino va_start(args, fmt);
5386d7f5d3SJohn Marino vasprintf(&command, fmt, args);
5486d7f5d3SJohn Marino va_end(args);
5586d7f5d3SJohn Marino
5686d7f5d3SJohn Marino #ifdef DEBUG
5786d7f5d3SJohn Marino fprintf(stderr, "%s\n", command);
5886d7f5d3SJohn Marino #endif
5986d7f5d3SJohn Marino
6086d7f5d3SJohn Marino return(system(command));
6186d7f5d3SJohn Marino }
6286d7f5d3SJohn Marino
6386d7f5d3SJohn Marino /* do this once */
6486d7f5d3SJohn Marino int
set_lang_syscons(const char * id)6586d7f5d3SJohn Marino set_lang_syscons(const char *id)
6686d7f5d3SJohn Marino {
6786d7f5d3SJohn Marino int lang_num;
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marino lang_num = get_lang_num(id);
7086d7f5d3SJohn Marino
7186d7f5d3SJohn Marino if(lang_num < 0)
7286d7f5d3SJohn Marino return(0);
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marino #define kbddev "/dev/ttyv0"
7586d7f5d3SJohn Marino #define viddev "/dev/ttyv0"
7686d7f5d3SJohn Marino #define kbdcontrol "/usr/sbin/kbdcontrol"
7786d7f5d3SJohn Marino #define vidcontrol "/usr/sbin/vidcontrol"
7886d7f5d3SJohn Marino
7986d7f5d3SJohn Marino if (
8086d7f5d3SJohn Marino system_fmt("%s < %s -l %s", kbdcontrol, kbddev, langset[lang_num].keymap) != 0 ||
8186d7f5d3SJohn Marino system_fmt("%s < %s -l %s", vidcontrol, viddev, langset[lang_num].scrnmap) != 0 ||
8286d7f5d3SJohn Marino system_fmt("%s < %s -f 8x8 %s", vidcontrol, viddev, langset[lang_num].font8x8) != 0 ||
8386d7f5d3SJohn Marino system_fmt("%s < %s -f 8x14 %s", vidcontrol, viddev, langset[lang_num].font8x14) != 0 ||
8486d7f5d3SJohn Marino system_fmt("%s < %s -f 8x16 %s", vidcontrol, viddev, langset[lang_num].font8x16) != 0)
8586d7f5d3SJohn Marino return(0);
8686d7f5d3SJohn Marino
8786d7f5d3SJohn Marino return(1);
8886d7f5d3SJohn Marino }
8986d7f5d3SJohn Marino
9086d7f5d3SJohn Marino /* do this for each side (backend, frontend) */
9186d7f5d3SJohn Marino int
set_lang_envars(const char * id)9286d7f5d3SJohn Marino set_lang_envars(const char *id)
9386d7f5d3SJohn Marino {
9486d7f5d3SJohn Marino char *term;
9586d7f5d3SJohn Marino
9686d7f5d3SJohn Marino int lang_num;
9786d7f5d3SJohn Marino
9886d7f5d3SJohn Marino lang_num = get_lang_num(id);
9986d7f5d3SJohn Marino
10086d7f5d3SJohn Marino if(lang_num < 0)
10186d7f5d3SJohn Marino return(0);
10286d7f5d3SJohn Marino
10386d7f5d3SJohn Marino /* gettext recommended setting */
10486d7f5d3SJohn Marino setenv("LANGUAGE", langset[lang_num].name, 1);
10586d7f5d3SJohn Marino
10686d7f5d3SJohn Marino /* also should be set */
10786d7f5d3SJohn Marino setenv("LANG", langset[lang_num].language, 1);
10886d7f5d3SJohn Marino
10986d7f5d3SJohn Marino /* set this too for completeness */
11086d7f5d3SJohn Marino setenv("MM_CHARSET", langset[lang_num].charset, 1);
11186d7f5d3SJohn Marino
11286d7f5d3SJohn Marino /* TERM must be set for some encodings */
11386d7f5d3SJohn Marino term = getenv("TERM");
11486d7f5d3SJohn Marino if((strcmp(term,"cons25") == 0) &&
11586d7f5d3SJohn Marino langset[lang_num].term != NULL)
11686d7f5d3SJohn Marino setenv("TERM", langset[lang_num].term, 1);
11786d7f5d3SJohn Marino
11886d7f5d3SJohn Marino return(1);
11986d7f5d3SJohn Marino }
120