1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
14 #include "locale-setup.h"
15 #include "locale-util.h"
16 #include "string-util.h"
21 int locale_setup(char ***environment
) {
23 char *variables
[_VARIABLE_LC_MAX
] = {};
26 if (detect_container() <= 0) {
27 r
= parse_env_file(NULL
, "/proc/cmdline", WHITESPACE
,
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
],
44 if (r
< 0 && r
!= -ENOENT
)
45 log_warning_errno(r
, "Failed to read /proc/cmdline: %m");
48 /* Hmm, nothing set on the kernel cmd line? Then let's
49 * try /etc/locale.conf */
51 r
= parse_env_file(NULL
, "/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
],
68 if (r
< 0 && r
!= -ENOENT
)
69 log_warning_errno(r
, "Failed to read /etc/locale.conf: %m");
73 for (i
= 0; i
< _VARIABLE_LC_MAX
; i
++) {
79 s
= strjoin(locale_variable_to_string(i
), "=", variables
[i
]);
85 if (strv_consume(&add
, s
) < 0) {
91 if (!strv_isempty(add
)) {
94 e
= strv_env_merge(2, *environment
, add
);
100 strv_free_and_replace(*environment
, e
);
108 for (i
= 0; i
< _VARIABLE_LC_MAX
; i
++)