On Wed, 2011-10-05 at 14:41 +0200, Martin Gracik wrote: > Please, see comments below > > On Wed, 2011-10-05 at 14:09 +0200, 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); > > +} > > glib has a g_str_has_suffix () function you could maybe use here. > > And why the goto, when it executes just one return statement? What about this? gchar *normalizeLang(const gchar *s) { if (g_str_has_suffix(s, ".utf8")) { gchar *lang = g_strndup(s, strlen(s) - strlen(".utf8")); gchar *result = g_strconcat(lang, ".UTF-8", NULL); g_free(lang); return result; } return g_strdup(s); } Not sure if I don't have any leaks there... > > > + > > 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); > > Not very consistent * placement. Not sure which one is our coding style. > > > > > 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); > -- Martin Gracik <mgracik@xxxxxxxxxx> _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list