]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/locale-setup.c
tree-wide: drop license boilerplate
[thirdparty/systemd.git] / src / core / locale-setup.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
72bca11b
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
72bca11b
LP
6***/
7
72bca11b 8#include <errno.h>
07630cea 9#include <stdlib.h>
dccca82b 10#include <string.h>
72bca11b 11
bcd8e6d1 12#include "env-util.h"
07630cea 13#include "fileio.h"
cf0fbc49 14#include "locale-setup.h"
a3428668 15#include "locale-util.h"
07630cea
LP
16#include "string-util.h"
17#include "strv.h"
18#include "util.h"
19#include "virt.h"
72bca11b 20
e21fea24 21int locale_setup(char ***environment) {
bcd8e6d1 22 char **add;
a3428668 23 char *variables[_VARIABLE_LC_MAX] = {};
d885ac66 24 int r = 0, i;
72bca11b 25
75f86906 26 if (detect_container() <= 0) {
39d99a07 27 r = parse_env_file("/proc/cmdline", WHITESPACE,
39d99a07
LP
28 "locale.LANG", &variables[VARIABLE_LANG],
29 "locale.LANGUAGE", &variables[VARIABLE_LANGUAGE],
30 "locale.LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
31 "locale.LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
32 "locale.LC_TIME", &variables[VARIABLE_LC_TIME],
33 "locale.LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
34 "locale.LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
35 "locale.LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
36 "locale.LC_PAPER", &variables[VARIABLE_LC_PAPER],
37 "locale.LC_NAME", &variables[VARIABLE_LC_NAME],
38 "locale.LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
39 "locale.LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
40 "locale.LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
41 "locale.LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
42 NULL);
43
44 if (r < 0 && r != -ENOENT)
da927ba9 45 log_warning_errno(r, "Failed to read /proc/cmdline: %m");
39d99a07 46 }
ce8a6aa1
LP
47
48 /* Hmm, nothing set on the kernel cmd line? Then let's
fd5bf055 49 * try /etc/locale.conf */
39d99a07
LP
50 if (r <= 0) {
51 r = parse_env_file("/etc/locale.conf", NEWLINE,
52 "LANG", &variables[VARIABLE_LANG],
53 "LANGUAGE", &variables[VARIABLE_LANGUAGE],
54 "LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
55 "LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
56 "LC_TIME", &variables[VARIABLE_LC_TIME],
57 "LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
58 "LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
59 "LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
60 "LC_PAPER", &variables[VARIABLE_LC_PAPER],
61 "LC_NAME", &variables[VARIABLE_LC_NAME],
62 "LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
63 "LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
64 "LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
65 "LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
66 NULL);
67
68 if (r < 0 && r != -ENOENT)
da927ba9 69 log_warning_errno(r, "Failed to read /etc/locale.conf: %m");
ce8a6aa1
LP
70 }
71
bcd8e6d1 72 add = NULL;
a3428668 73 for (i = 0; i < _VARIABLE_LC_MAX; i++) {
bcd8e6d1
LP
74 char *s;
75
e21fea24
KS
76 if (!variables[i])
77 continue;
78
605405c6 79 s = strjoin(locale_variable_to_string(i), "=", variables[i]);
bcd8e6d1
LP
80 if (!s) {
81 r = -ENOMEM;
82 goto finish;
83 }
84
6e18964d 85 if (strv_consume(&add, s) < 0) {
bcd8e6d1
LP
86 r = -ENOMEM;
87 goto finish;
88 }
89 }
90
91 if (!strv_isempty(add)) {
92 char **e;
93
94 e = strv_env_merge(2, *environment, add);
95 if (!e) {
e21fea24
KS
96 r = -ENOMEM;
97 goto finish;
98 }
99
bcd8e6d1
LP
100 strv_free(*environment);
101 *environment = e;
72bca11b 102 }
8780d48d 103
72bca11b
LP
104 r = 0;
105
106finish:
bcd8e6d1
LP
107 strv_free(add);
108
a3428668 109 for (i = 0; i < _VARIABLE_LC_MAX; i++)
72bca11b
LP
110 free(variables[i]);
111
112 return r;
113}