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, ...); 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