[systemd-commits] 2 commits - src/locale-setup.c src/util.c src/vconsole-setup.c

Lennart Poettering lennart at kemper.freedesktop.org
Mon Sep 20 18:16:35 PDT 2010


 src/locale-setup.c   |  102 ++++++++++++++------------
 src/util.c           |    6 -
 src/vconsole-setup.c |  194 ++++++++++++++++++++++++++-------------------------
 3 files changed, 159 insertions(+), 143 deletions(-)

New commits:
commit 653ab83b1828101d4321ddab49c0b09b7d8ed422
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Sep 21 03:16:28 2010 +0200

    vconsole: make sure we don't merge configuration settings from different sources

diff --git a/src/locale-setup.c b/src/locale-setup.c
index cf0d3e5..d2e1b50 100644
--- a/src/locale-setup.c
+++ b/src/locale-setup.c
@@ -94,7 +94,6 @@ int locale_setup(void) {
 
         /* Hmm, nothing set on the kernel cmd line? Then let's
          * try /etc/locale */
-
         if (r <= 0 &&
             (r = parse_env_file("/etc/locale", NEWLINE,
                                "LANG",              &variables[VARIABLE_LANG],
@@ -125,6 +124,7 @@ int locale_setup(void) {
                 if (r != -ENOENT)
                         log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
         }
+
 #elif defined(TARGET_ARCH)
         if (r <= 0 &&
             (r = parse_env_file("/etc/rc.conf", NEWLINE,
@@ -134,6 +134,7 @@ int locale_setup(void) {
                 if (r != -ENOENT)
                         log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
         }
+
 #elif defined(TARGET_GENTOO)
         /* Gentoo's openrc expects locale variables in /etc/env.d/
          * These files are later compiled by env-update into shell
diff --git a/src/vconsole-setup.c b/src/vconsole-setup.c
index 1283550..21f2401 100644
--- a/src/vconsole-setup.c
+++ b/src/vconsole-setup.c
@@ -40,7 +40,7 @@
 #include "log.h"
 #include "macro.h"
 
-static bool is_console(int fd) {
+static bool is_vconsole(int fd) {
         unsigned char data[1];
 
         data[0] = TIOCL_GETFGCONSOLE;
@@ -163,127 +163,134 @@ int main(int argc, char **argv) {
                 goto finish;
         }
 
-        if (!is_console(fd)) {
+        if (!is_vconsole(fd)) {
                 log_error("Device %s is not a virtual console.", vc);
                 goto finish;
         }
 
-        if (!(utf8 = is_locale_utf8()))
-                disable_utf8(fd);
+        utf8 = is_locale_utf8();
 
+        if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
 #ifdef TARGET_FEDORA
-        if ((r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
                                 "SYSFONT", &vc_font,
-                                "SYSFONTACM", &vc_font_map,
-                                "UNIMAP", &vc_font_unimap,
+                                "KEYTABLE", &vc_keymap,
+#endif
+                                "vconsole.keymap", &vc_keymap,
+                                "vconsole.font", &vc_font,
+                                "vconsole.font.map", &vc_font_map,
+                                "vconsole.font.unimap", &vc_font_unimap,
                                 NULL)) < 0) {
 
                 if (r != -ENOENT)
-                        log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
+                        log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
         }
 
-        if ((r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
-                                "KEYTABLE", &vc_keymap,
+        /* Hmm, nothing set on the kernel cmd line? Then let's
+         * try /etc/vconsole */
+        if (r <= 0 &&
+            (r = parse_env_file("/etc/vconsole", NEWLINE,
                                 "KEYMAP", &vc_keymap,
+                                "FONT", &vc_font,
+                                "FONT_MAP", &vc_font_map,
+                                "FONT_UNIMAP", &vc_font_unimap,
                                 NULL)) < 0) {
 
                 if (r != -ENOENT)
-                        log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
+                        log_warning("Failed to read /etc/vconsole: %s", strerror(-r));
         }
 
-        if (access("/etc/sysconfig/console/default.kmap", F_OK) >= 0) {
-                char *t;
-
-                if (!(t = strdup("/etc/sysconfig/console/default.kmap"))) {
-                        log_error("Out of memory.");
-                        goto finish;
+        if (r <= 0) {
+#ifdef TARGET_FEDORA
+                if ((r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
+                                        "SYSFONT", &vc_font,
+                                        "SYSFONTACM", &vc_font_map,
+                                        "UNIMAP", &vc_font_unimap,
+                                        NULL)) < 0) {
+
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
                 }
 
-                free(vc_keymap);
-                vc_keymap = t;
-        }
-#elif defined(TARGET_ARCH)
-        if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
-				"KEYMAP", &vc_keymap,
-                                "CONSOLEFONT", &vc_font,
-                                "CONSOLEMAP", &vc_font_map,
-                                NULL)) < 0) {
+                if ((r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
+                                        "KEYTABLE", &vc_keymap,
+                                        "KEYMAP", &vc_keymap,
+                                        NULL)) < 0) {
 
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
+                }
 
-#elif defined(TARGET_GENTOO)
-        if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
-                                "unicode", &vc_unicode,
-                                NULL)) < 0) {
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
-        }
-        if (vc_unicode) {
-                int rc_unicode = parse_boolean(vc_unicode);
-                if (rc_unicode < 0)
-                        log_error("Unknown value for /etc/rc.conf unicode=%s", vc_unicode);
-                else {
-                        if (rc_unicode && !utf8)
-                                log_warning("/etc/rc.conf wants unicode, but current locale is not UTF-8 capable!");
-                        else if (!rc_unicode && utf8) {
-                                log_debug("/etc/rc.conf does not want unicode, leave it on in kernel but does not apply to vconsole.");
-                                utf8 = false;
+                if (access("/etc/sysconfig/console/default.kmap", F_OK) >= 0) {
+                        char *t;
+
+                        if (!(t = strdup("/etc/sysconfig/console/default.kmap"))) {
+                                log_error("Out of memory.");
+                                goto finish;
                         }
+
+                        free(vc_keymap);
+                        vc_keymap = t;
                 }
-        }
 
-        /* /etc/conf.d/consolefont comments and gentoo documentation
-         * mention uppercase, but the actual contents are lowercase.
-         * the existing /etc/init.d/consolefont tries both
-         */
-        if ((r = parse_env_file("/etc/conf.d/consolefont", NEWLINE,
-                                "CONSOLEFONT", &vc_font,
-                                "consolefont", &vc_font,
-                                "consoletranslation", &vc_font_map,
-                                "CONSOLETRANSLATION", &vc_font_map,
-                                "unicodemap", &vc_font_unimap,
-                                "UNICODEMAP", &vc_font_unimap,
-                                NULL)) < 0) {
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/conf.d/consolefont: %s", strerror(-r));
-        }
+#elif defined(TARGET_ARCH)
+                if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
+                                        "KEYMAP", &vc_keymap,
+                                        "CONSOLEFONT", &vc_font,
+                                        "CONSOLEMAP", &vc_font_map,
+                                        NULL)) < 0) {
+
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
+                }
 
-        if ((r = parse_env_file("/etc/conf.d/keymaps", NEWLINE,
-                                "keymap", &vc_keymap,
-                                "KEYMAP", &vc_keymap,
-                                NULL)) < 0) {
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/conf.d/keymaps: %s", strerror(-r));
-        }
-#endif
+#elif defined(TARGET_GENTOO)
+                if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
+                                        "unicode", &vc_unicode,
+                                        NULL)) < 0) {
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
+                }
 
-        /* Override distribution-specific options with the
-         * distribution-independent configuration */
-        if ((r = parse_env_file("/etc/vconsole", NEWLINE,
-                                "KEYMAP", &vc_keymap,
-                                "FONT", &vc_font,
-                                "FONT_MAP", &vc_font_map,
-                                "FONT_UNIMAP", &vc_font_unimap,
-                                NULL)) < 0) {
+                if (vc_unicode) {
+                        int rc_unicode;
+
+                        if ((rc_unicode = parse_boolean(vc_unicode)) < 0)
+                                log_error("Unknown value for /etc/rc.conf unicode=%s", vc_unicode);
+                        else {
+                                if (rc_unicode && !utf8)
+                                        log_warning("/etc/rc.conf wants unicode, but current locale is not UTF-8 capable!");
+                                else if (!rc_unicode && utf8) {
+                                        log_debug("/etc/rc.conf does not want unicode, leave it on in kernel but does not apply to vconsole.");
+                                        utf8 = false;
+                                }
+                        }
+                }
 
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/vconsole: %s", strerror(-r));
-        }
+                /* /etc/conf.d/consolefont comments and gentoo
+                 * documentation mention uppercase, but the actual
+                 * contents are lowercase.  the existing
+                 * /etc/init.d/consolefont tries both
+                 */
+                if ((r = parse_env_file("/etc/conf.d/consolefont", NEWLINE,
+                                        "CONSOLEFONT", &vc_font,
+                                        "consolefont", &vc_font,
+                                        "consoletranslation", &vc_font_map,
+                                        "CONSOLETRANSLATION", &vc_font_map,
+                                        "unicodemap", &vc_font_unimap,
+                                        "UNICODEMAP", &vc_font_unimap,
+                                        NULL)) < 0) {
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/conf.d/consolefont: %s", strerror(-r));
+                }
 
-        if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
-#ifdef TARGET_FEDORA
-                                "SYSFONT", &vc_font,
-                                "KEYTABLE", &vc_keymap,
+                if ((r = parse_env_file("/etc/conf.d/keymaps", NEWLINE,
+                                        "keymap", &vc_keymap,
+                                        "KEYMAP", &vc_keymap,
+                                        NULL)) < 0) {
+                        if (r != -ENOENT)
+                                log_warning("Failed to read /etc/conf.d/keymaps: %s", strerror(-r));
+                }
 #endif
-                                "vconsole.keymap", &vc_keymap,
-                                "vconsole.font", &vc_font,
-                                "vconsole.font.map", &vc_font_map,
-                                "vconsole.font.unimap", &vc_font_unimap,
-                                NULL)) < 0) {
-
-                if (r != -ENOENT)
-                        log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
         }
 
         if (!vc_keymap)
@@ -296,6 +303,9 @@ int main(int argc, char **argv) {
                 goto finish;
         }
 
+        if (!utf8)
+                disable_utf8(fd);
+
         if (load_keymap(vc, vc_keymap, utf8, &keymap_pid) >= 0 &&
             load_font(vc, vc_font, vc_font_map, vc_font_unimap, &font_pid) >= 0)
                 r = EXIT_SUCCESS;
commit ce8a6aa1a0934d7377b8c7af185149e4627512b6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Sep 21 01:51:23 2010 +0200

    locale: make sure we don't merge configuration settings from different sources

diff --git a/src/locale-setup.c b/src/locale-setup.c
index 8ead9fd..cf0d3e5 100644
--- a/src/locale-setup.c
+++ b/src/locale-setup.c
@@ -69,8 +69,56 @@ int locale_setup(void) {
 
         zero(variables);
 
+        if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
+#ifdef TARGET_FEDORA
+                                "LANG",                     &variables[VARIABLE_LANG],
+#endif
+                                "locale.LANG",              &variables[VARIABLE_LANG],
+                                "locale.LC_CTYPE",          &variables[VARIABLE_LC_CTYPE],
+                                "locale.LC_NUMERIC",        &variables[VARIABLE_LC_NUMERIC],
+                                "locale.LC_TIME",           &variables[VARIABLE_LC_TIME],
+                                "locale.LC_COLLATE",        &variables[VARIABLE_LC_COLLATE],
+                                "locale.LC_MONETARY",       &variables[VARIABLE_LC_MONETARY],
+                                "locale.LC_MESSAGES",       &variables[VARIABLE_LC_MESSAGES],
+                                "locale.LC_PAPER",          &variables[VARIABLE_LC_PAPER],
+                                "locale.LC_NAME",           &variables[VARIABLE_LC_NAME],
+                                "locale.LC_ADDRESS",        &variables[VARIABLE_LC_ADDRESS],
+                                "locale.LC_TELEPHONE",      &variables[VARIABLE_LC_TELEPHONE],
+                                "locale.LC_MEASUREMENT",    &variables[VARIABLE_LC_MEASUREMENT],
+                                "locale.LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
+                                NULL)) < 0) {
+
+                if (r != -ENOENT)
+                        log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
+        }
+
+        /* Hmm, nothing set on the kernel cmd line? Then let's
+         * try /etc/locale */
+
+        if (r <= 0 &&
+            (r = parse_env_file("/etc/locale", NEWLINE,
+                               "LANG",              &variables[VARIABLE_LANG],
+                               "LC_CTYPE",          &variables[VARIABLE_LC_CTYPE],
+                               "LC_NUMERIC",        &variables[VARIABLE_LC_NUMERIC],
+                               "LC_TIME",           &variables[VARIABLE_LC_TIME],
+                               "LC_COLLATE",        &variables[VARIABLE_LC_COLLATE],
+                               "LC_MONETARY",       &variables[VARIABLE_LC_MONETARY],
+                               "LC_MESSAGES",       &variables[VARIABLE_LC_MESSAGES],
+                               "LC_PAPER",          &variables[VARIABLE_LC_PAPER],
+                               "LC_NAME",           &variables[VARIABLE_LC_NAME],
+                               "LC_ADDRESS",        &variables[VARIABLE_LC_ADDRESS],
+                               "LC_TELEPHONE",      &variables[VARIABLE_LC_TELEPHONE],
+                               "LC_MEASUREMENT",    &variables[VARIABLE_LC_MEASUREMENT],
+                               "LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
+                                NULL)) < 0) {
+
+                if (r != -ENOENT)
+                        log_warning("Failed to read /etc/locale: %s", strerror(-r));
+        }
+
 #ifdef TARGET_FEDORA
-        if ((r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
+        if (r <= 0 &&
+            (r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
                                 "LANG", &variables[VARIABLE_LANG],
                                 NULL)) < 0) {
 
@@ -78,7 +126,8 @@ int locale_setup(void) {
                         log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
         }
 #elif defined(TARGET_ARCH)
-        if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
+        if (r <= 0 &&
+            (r = parse_env_file("/etc/rc.conf", NEWLINE,
                                 "LOCALE", &variables[VARIABLE_LANG],
                                 NULL)) < 0) {
 
@@ -91,7 +140,8 @@ int locale_setup(void) {
          * export commands at /etc/profile.env, with variables being
          * exported by openrc's runscript (so /etc/init.d/)
          */
-        if ((r = parse_env_file("/etc/profile.env", NEWLINE,
+        if (r <= 0 &&
+            (r = parse_env_file("/etc/profile.env", NEWLINE,
                                 "export LANG",              &variables[VARIABLE_LANG],
                                 "export LC_CTYPE",          &variables[VARIABLE_LC_CTYPE],
                                 "export LC_NUMERIC",        &variables[VARIABLE_LC_NUMERIC],
@@ -112,51 +162,6 @@ int locale_setup(void) {
         }
 #endif
 
-        /* Override distribution-specific options with the
-         * distribution-independent configuration */
-        if ((r = parse_env_file("/etc/locale", NEWLINE,
-                                "LANG",              &variables[VARIABLE_LANG],
-                                "LC_CTYPE",          &variables[VARIABLE_LC_CTYPE],
-                                "LC_NUMERIC",        &variables[VARIABLE_LC_NUMERIC],
-                                "LC_TIME",           &variables[VARIABLE_LC_TIME],
-                                "LC_COLLATE",        &variables[VARIABLE_LC_COLLATE],
-                                "LC_MONETARY",       &variables[VARIABLE_LC_MONETARY],
-                                "LC_MESSAGES",       &variables[VARIABLE_LC_MESSAGES],
-                                "LC_PAPER",          &variables[VARIABLE_LC_PAPER],
-                                "LC_NAME",           &variables[VARIABLE_LC_NAME],
-                                "LC_ADDRESS",        &variables[VARIABLE_LC_ADDRESS],
-                                "LC_TELEPHONE",      &variables[VARIABLE_LC_TELEPHONE],
-                                "LC_MEASUREMENT",    &variables[VARIABLE_LC_MEASUREMENT],
-                                "LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
-                                NULL)) < 0) {
-
-                if (r != -ENOENT)
-                        log_warning("Failed to read /etc/locale: %s", strerror(-r));
-        }
-
-        if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
-#ifdef TARGET_FEDORA
-                                "LANG",                     &variables[VARIABLE_LANG],
-#endif
-                                "locale.LANG",              &variables[VARIABLE_LANG],
-                                "locale.LC_CTYPE",          &variables[VARIABLE_LC_CTYPE],
-                                "locale.LC_NUMERIC",        &variables[VARIABLE_LC_NUMERIC],
-                                "locale.LC_TIME",           &variables[VARIABLE_LC_TIME],
-                                "locale.LC_COLLATE",        &variables[VARIABLE_LC_COLLATE],
-                                "locale.LC_MONETARY",       &variables[VARIABLE_LC_MONETARY],
-                                "locale.LC_MESSAGES",       &variables[VARIABLE_LC_MESSAGES],
-                                "locale.LC_PAPER",          &variables[VARIABLE_LC_PAPER],
-                                "locale.LC_NAME",           &variables[VARIABLE_LC_NAME],
-                                "locale.LC_ADDRESS",        &variables[VARIABLE_LC_ADDRESS],
-                                "locale.LC_TELEPHONE",      &variables[VARIABLE_LC_TELEPHONE],
-                                "locale.LC_MEASUREMENT",    &variables[VARIABLE_LC_MEASUREMENT],
-                                "locale.LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
-                                NULL)) < 0) {
-
-                if (r != -ENOENT)
-                        log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
-        }
-
         if (!variables[VARIABLE_LANG]) {
                 if (!(variables[VARIABLE_LANG] = strdup("C"))) {
                         r = -ENOMEM;
diff --git a/src/util.c b/src/util.c
index bdc194e..0939ea9 100644
--- a/src/util.c
+++ b/src/util.c
@@ -602,7 +602,7 @@ int parse_env_file(
                 const char *fname,
                 const char *seperator, ...) {
 
-        int r;
+        int r = 0;
         char *contents, *p;
 
         assert(fname);
@@ -657,6 +657,8 @@ int parse_env_file(
                                 *value = v;
 
                                 p += n;
+
+                                r ++;
                                 break;
                         }
                         va_end(ap);
@@ -666,8 +668,6 @@ int parse_env_file(
                         p += strcspn(p, seperator);
         }
 
-        r = 0;
-
 fail:
         free(contents);
         return r;


More information about the systemd-commits mailing list