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