]>
Commit | Line | Data |
---|---|---|
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 | 16 | int 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 | ||
100 | finish: | |
a3428668 | 101 | for (i = 0; i < _VARIABLE_LC_MAX; i++) |
72bca11b LP |
102 | free(variables[i]); |
103 | ||
104 | return r; | |
105 | } |