On 10/05/11 08:09, Ales Kozumplik wrote:
First, internally translate '.utf8' to '.UTF-8' so it matches the lang-table. Second, if a language missing from the lang-table is used with lang=, fallback on en_US. Resolves: rhbz#731356 --- loader/lang.c | 39 +++++++++++++++++++++++++++++++++++++-- loader/lang.h | 1 + loader/loader.c | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/loader/lang.c b/loader/lang.c index 6b1fa8e..3dda676 100644 --- a/loader/lang.c +++ b/loader/lang.c @@ -36,6 +36,7 @@ #include<sys/wait.h> #include<unistd.h> #include<wchar.h> +#include<glib.h> #include "loader.h" #include "lang.h" @@ -103,6 +104,14 @@ char * translateString(char * str) { static struct langInfo * languages = NULL; static int numLanguages = 0; +static int defaultLanguageIndex(void) { + int i; + for (i = 0; i< numLanguages; ++i) + if (!strcmp(languages[i].lc_all, LANG_DEFAULT)) + return i; + return -1; +} + static void loadLanguageList(void) { char * file = "/etc/lang-table"; FILE * f; @@ -144,6 +153,31 @@ int getLangInfo(struct langInfo ** langs) { return numLanguages; } +/** + * Normalize the value of lang= boot argument. + * + * Currently only replaces the trailing .utf8 with .UTF-8. + * + * Returns a heap-allocated string. + */ +char *normalizeLang(const char *s) { + char *ending = g_strrstr(s, ".utf8"); + /* check this is at the end */ + if (!ending || strlen(ending)> strlen(".utf8")) + goto dup; + int basic_length = strlen(s) - strlen(".utf8"); /* length before .utf8 */ + char *result = g_malloc(strlen(s) + 2); + if (!result) + goto dup; + strncpy(result, s, basic_length); + strcpy(result + basic_length, ".UTF-8"); + return result; + + dup: + /* if normalization fails simply return a dup of the original */ + return strdup(s); +}
normalizeLang() needs to use glib's allocator passthrough entirely so that g_free() can safely be used on the pointer it returns. I recommend changing the strdup() to a g_strdup().
I also second the removal of the goto and just moving the return to where the goto is.
+ void loadLanguage(void) { char *filename; @@ -395,8 +429,9 @@ int setLanguage (const char * key, int forced) { } } - logMessage(ERROR, "unable to set to requested language %s", key); - return -1; + logMessage(ERROR, "unable to set the requested language '%s', " + "setting the default '%s'", key, LANG_DEFAULT); + return setupLanguage(defaultLanguageIndex(), forced | !FL_KICKSTART(flags)); } int chooseLanguage(char ** lang) { diff --git a/loader/lang.h b/loader/lang.h index 168ffa3..c8590a9 100644 --- a/loader/lang.h +++ b/loader/lang.h @@ -34,6 +34,7 @@ int chooseLanguage(char ** lang); char * translateString(char * str); int setLanguage (const char * key, int forced); int getLangInfo(struct langInfo **langs); +char *normalizeLang(const char *s); extern const char *LANG_DEFAULT; diff --git a/loader/loader.c b/loader/loader.c index eedf439..cb8b7ab 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -992,7 +992,7 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData) { } else if (!strcasecmp(k, "display")) { setenv("DISPLAY", v, 1); } else if (!strcasecmp(k, "lang")) { - loaderData->lang = g_strdup(v); + loaderData->lang = normalizeLang(v); loaderData->lang_set = 1; } else if (!strcasecmp(k, "keymap")) { loaderData->kbd = g_strdup(v);
-- David Cantrell <dcantrell@xxxxxxxxxx> Supervisor, Installer Engineering Team Red Hat, Inc. | Westford, MA | EST5EDT _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list