]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
locale-setup: split locale_context_load() into small pieces
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 13 Dec 2022 08:59:35 +0000 (17:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 14 Dec 2022 11:18:58 +0000 (20:18 +0900)
No functional change, just refactoring and preparation for later
commits.

src/shared/locale-setup.c

index b8c6647e7c5a351d1a607874ccdedcb24626749d..4b0d46995bac35507d87511532ded0a2aab9e6b6 100644 (file)
@@ -19,94 +19,131 @@ void locale_context_clear(LocaleContext *c) {
                 c->locale[i] = mfree(c->locale[i]);
 }
 
-int locale_context_load(LocaleContext *c, LocaleLoadFlag flag) {
+static int locale_context_load_proc(LocaleContext *c, LocaleLoadFlag flag) {
         int r;
 
         assert(c);
 
-        if (FLAGS_SET(flag, LOCALE_LOAD_PROC_CMDLINE)) {
-                locale_context_clear(c);
+        if (!FLAGS_SET(flag, LOCALE_LOAD_PROC_CMDLINE))
+                return 0;
+
+        locale_context_clear(c);
+
+        r = proc_cmdline_get_key_many(PROC_CMDLINE_STRIP_RD_PREFIX,
+                                      "locale.LANG",              &c->locale[VARIABLE_LANG],
+                                      "locale.LANGUAGE",          &c->locale[VARIABLE_LANGUAGE],
+                                      "locale.LC_CTYPE",          &c->locale[VARIABLE_LC_CTYPE],
+                                      "locale.LC_NUMERIC",        &c->locale[VARIABLE_LC_NUMERIC],
+                                      "locale.LC_TIME",           &c->locale[VARIABLE_LC_TIME],
+                                      "locale.LC_COLLATE",        &c->locale[VARIABLE_LC_COLLATE],
+                                      "locale.LC_MONETARY",       &c->locale[VARIABLE_LC_MONETARY],
+                                      "locale.LC_MESSAGES",       &c->locale[VARIABLE_LC_MESSAGES],
+                                      "locale.LC_PAPER",          &c->locale[VARIABLE_LC_PAPER],
+                                      "locale.LC_NAME",           &c->locale[VARIABLE_LC_NAME],
+                                      "locale.LC_ADDRESS",        &c->locale[VARIABLE_LC_ADDRESS],
+                                      "locale.LC_TELEPHONE",      &c->locale[VARIABLE_LC_TELEPHONE],
+                                      "locale.LC_MEASUREMENT",    &c->locale[VARIABLE_LC_MEASUREMENT],
+                                      "locale.LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION]);
+        if (r == -ENOENT)
+                return 0;
+        if (r < 0)
+                return log_debug_errno(r, "Failed to read /proc/cmdline: %m");
+        return r;
+}
+
+static int locale_context_load_conf(LocaleContext *c, LocaleLoadFlag flag) {
+        struct stat st;
+        usec_t t;
+        int r;
+
+        assert(c);
 
-                r = proc_cmdline_get_key_many(PROC_CMDLINE_STRIP_RD_PREFIX,
-                                              "locale.LANG",              &c->locale[VARIABLE_LANG],
-                                              "locale.LANGUAGE",          &c->locale[VARIABLE_LANGUAGE],
-                                              "locale.LC_CTYPE",          &c->locale[VARIABLE_LC_CTYPE],
-                                              "locale.LC_NUMERIC",        &c->locale[VARIABLE_LC_NUMERIC],
-                                              "locale.LC_TIME",           &c->locale[VARIABLE_LC_TIME],
-                                              "locale.LC_COLLATE",        &c->locale[VARIABLE_LC_COLLATE],
-                                              "locale.LC_MONETARY",       &c->locale[VARIABLE_LC_MONETARY],
-                                              "locale.LC_MESSAGES",       &c->locale[VARIABLE_LC_MESSAGES],
-                                              "locale.LC_PAPER",          &c->locale[VARIABLE_LC_PAPER],
-                                              "locale.LC_NAME",           &c->locale[VARIABLE_LC_NAME],
-                                              "locale.LC_ADDRESS",        &c->locale[VARIABLE_LC_ADDRESS],
-                                              "locale.LC_TELEPHONE",      &c->locale[VARIABLE_LC_TELEPHONE],
-                                              "locale.LC_MEASUREMENT",    &c->locale[VARIABLE_LC_MEASUREMENT],
-                                              "locale.LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION]);
-                if (r < 0 && r != -ENOENT)
-                        log_debug_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
-                if (r > 0)
-                        goto finalize;
+        if (!FLAGS_SET(flag, LOCALE_LOAD_LOCALE_CONF))
+                return 0;
+
+        r = stat("/etc/locale.conf", &st);
+        if (r < 0) {
+                if (errno == ENOENT)
+                        return 0;
+                return log_debug_errno(errno, "Failed to stat /etc/locale.conf: %m");
         }
 
-        if (FLAGS_SET(flag, LOCALE_LOAD_LOCALE_CONF)) {
-                struct stat st;
-                usec_t t;
-
-                r = stat("/etc/locale.conf", &st);
-                if (r < 0 && errno != ENOENT)
-                        return log_debug_errno(errno, "Failed to stat /etc/locale.conf: %m");
-
-                if (r >= 0) {
-                        /* If mtime is not changed, then we do not need to re-read the file. */
-                        t = timespec_load(&st.st_mtim);
-                        if (c->mtime != USEC_INFINITY && t == c->mtime)
-                                return 0;
-
-                        locale_context_clear(c);
-                        c->mtime = t;
-
-                        r = parse_env_file(NULL, "/etc/locale.conf",
-                                           "LANG",              &c->locale[VARIABLE_LANG],
-                                           "LANGUAGE",          &c->locale[VARIABLE_LANGUAGE],
-                                           "LC_CTYPE",          &c->locale[VARIABLE_LC_CTYPE],
-                                           "LC_NUMERIC",        &c->locale[VARIABLE_LC_NUMERIC],
-                                           "LC_TIME",           &c->locale[VARIABLE_LC_TIME],
-                                           "LC_COLLATE",        &c->locale[VARIABLE_LC_COLLATE],
-                                           "LC_MONETARY",       &c->locale[VARIABLE_LC_MONETARY],
-                                           "LC_MESSAGES",       &c->locale[VARIABLE_LC_MESSAGES],
-                                           "LC_PAPER",          &c->locale[VARIABLE_LC_PAPER],
-                                           "LC_NAME",           &c->locale[VARIABLE_LC_NAME],
-                                           "LC_ADDRESS",        &c->locale[VARIABLE_LC_ADDRESS],
-                                           "LC_TELEPHONE",      &c->locale[VARIABLE_LC_TELEPHONE],
-                                           "LC_MEASUREMENT",    &c->locale[VARIABLE_LC_MEASUREMENT],
-                                           "LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION]);
-                        if (r < 0)
-                                return log_debug_errno(r, "Failed to read /etc/locale.conf: %m");
-
-                        goto finalize;
-                }
+        /* If mtime is not changed, then we do not need to re-read the file. */
+        t = timespec_load(&st.st_mtim);
+        if (c->mtime != USEC_INFINITY && t == c->mtime)
+                return 0;
+
+        locale_context_clear(c);
+        c->mtime = t;
+
+        r = parse_env_file(NULL, "/etc/locale.conf",
+                           "LANG",              &c->locale[VARIABLE_LANG],
+                           "LANGUAGE",          &c->locale[VARIABLE_LANGUAGE],
+                           "LC_CTYPE",          &c->locale[VARIABLE_LC_CTYPE],
+                           "LC_NUMERIC",        &c->locale[VARIABLE_LC_NUMERIC],
+                           "LC_TIME",           &c->locale[VARIABLE_LC_TIME],
+                           "LC_COLLATE",        &c->locale[VARIABLE_LC_COLLATE],
+                           "LC_MONETARY",       &c->locale[VARIABLE_LC_MONETARY],
+                           "LC_MESSAGES",       &c->locale[VARIABLE_LC_MESSAGES],
+                           "LC_PAPER",          &c->locale[VARIABLE_LC_PAPER],
+                           "LC_NAME",           &c->locale[VARIABLE_LC_NAME],
+                           "LC_ADDRESS",        &c->locale[VARIABLE_LC_ADDRESS],
+                           "LC_TELEPHONE",      &c->locale[VARIABLE_LC_TELEPHONE],
+                           "LC_MEASUREMENT",    &c->locale[VARIABLE_LC_MEASUREMENT],
+                           "LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION]);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to read /etc/locale.conf: %m");
+
+        return 1; /* loaded */
+}
+
+static int locale_context_load_env(LocaleContext *c, LocaleLoadFlag flag) {
+        int r;
+
+        assert(c);
+
+        if (!FLAGS_SET(flag, LOCALE_LOAD_ENVIRONMENT))
+                return 0;
+
+        locale_context_clear(c);
+
+        /* Fill in what we got passed from systemd. */
+        for (LocaleVariable p = 0; p < _VARIABLE_LC_MAX; p++) {
+                const char *name = ASSERT_PTR(locale_variable_to_string(p));
+
+                r = free_and_strdup(&c->locale[p], empty_to_null(getenv(name)));
+                if (r < 0)
+                        return log_oom_debug();
         }
 
-        if (FLAGS_SET(flag, LOCALE_LOAD_ENVIRONMENT)) {
-                locale_context_clear(c);
+        return 1; /* loaded */
+}
 
-                /* Fill in what we got passed from systemd. */
-                for (LocaleVariable p = 0; p < _VARIABLE_LC_MAX; p++) {
-                        const char *name = ASSERT_PTR(locale_variable_to_string(p));
+int locale_context_load(LocaleContext *c, LocaleLoadFlag flag) {
+        int r;
 
-                        r = free_and_strdup(&c->locale[p], empty_to_null(getenv(name)));
-                        if (r < 0)
-                                return log_oom_debug();
-                }
+        assert(c);
 
+        r = locale_context_load_proc(c, flag);
+        if (r > 0)
                 goto finalize;
-        }
 
-        /* Nothing loaded. */
-        locale_context_clear(c);
-        return 0;
+        r = locale_context_load_conf(c, flag);
+        if (r != 0)
+                goto finalize;
+
+        r = locale_context_load_env(c, flag);
 
 finalize:
+        if (r < 0)
+                return r;
+
+        if (r == 0) {
+                /* Nothing loaded. */
+                locale_context_clear(c);
+                return 0;
+        }
+
         if (FLAGS_SET(flag, LOCALE_LOAD_SIMPLIFY))
                 locale_variables_simplify(c->locale);