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