]>
Commit | Line | Data |
---|---|---|
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 | 21 | int 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 | ||
106 | finish: | |
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 | } |