+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <errno.h>
-#include <stdlib.h>
-
-#include "env-file.h"
-#include "env-util.h"
-#include "locale-setup.h"
-#include "locale-util.h"
-#include "proc-cmdline.h"
-#include "string-util.h"
-#include "strv.h"
-#include "util.h"
-#include "virt.h"
-
-int locale_setup(char ***environment) {
- _cleanup_(locale_variables_freep) char *variables[_VARIABLE_LC_MAX] = {};
- _cleanup_strv_free_ char **add = NULL;
- int r;
-
- r = proc_cmdline_get_key_many(PROC_CMDLINE_STRIP_RD_PREFIX,
- "locale.LANG", &variables[VARIABLE_LANG],
- "locale.LANGUAGE", &variables[VARIABLE_LANGUAGE],
- "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]);
- if (r < 0 && r != -ENOENT)
- log_warning_errno(r, "Failed to read /proc/cmdline: %m");
-
- /* Hmm, nothing set on the kernel cmd line? Then let's try /etc/locale.conf */
- if (r <= 0) {
- r = parse_env_file(NULL, "/etc/locale.conf",
- "LANG", &variables[VARIABLE_LANG],
- "LANGUAGE", &variables[VARIABLE_LANGUAGE],
- "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]);
- if (r < 0 && r != -ENOENT)
- log_warning_errno(r, "Failed to read /etc/locale.conf: %m");
- }
-
- for (LocaleVariable i = 0; i < _VARIABLE_LC_MAX; i++) {
- char *s;
-
- if (!variables[i])
- continue;
-
- s = strjoin(locale_variable_to_string(i), "=", variables[i]);
- if (!s)
- return -ENOMEM;
-
- if (strv_consume(&add, s) < 0)
- return -ENOMEM;
- }
-
- if (strv_isempty(add)) {
- /* If no locale is configured then default to compile-time default. */
-
- add = strv_new("LANG=" SYSTEMD_DEFAULT_LOCALE);
- if (!add)
- return -ENOMEM;
- }
-
- if (strv_isempty(*environment))
- strv_free_and_replace(*environment, add);
- else {
- char **merged;
-
- merged = strv_env_merge(*environment, add);
- if (!merged)
- return -ENOMEM;
-
- strv_free_and_replace(*environment, merged);
- }
-
- return 0;
-}