]>
git.ipfire.org Git - people/ms/systemd.git/blob - conf-parser.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
9 #include "conf-parser.h"
15 #define COMMENTS "#;\n"
16 #define NEWLINES "\n\r"
19 /* Run the user supplied parser for an assignment */
20 static int next_assignment(
34 for (; t
->parse
; t
++) {
36 if (t
->lvalue
&& !streq(lvalue
, t
->lvalue
))
39 if (t
->section
&& !section
)
42 if (t
->section
&& !streq(section
, t
->section
))
45 return t
->parse(filename
, line
, section
, lvalue
, rvalue
, t
->data
, userdata
);
48 log_info("[%s:%u] Unknown lvalue '%s' in section '%s'. Ignoring.", filename
, line
, lvalue
, strna(section
));
52 /* Parse a variable assignment line */
53 static int parse_line(const char *filename
, unsigned line
, char **section
, const char* const * sections
, const ConfigItem
*t
, char *l
, void *userdata
) {
61 if (strchr(COMMENTS
, *l
))
64 if (startswith(l
, ".include ")) {
68 if (!(fn
= file_in_same_dir(filename
, strstrip(l
+9))))
71 r
= config_parse(fn
, NULL
, sections
, t
, userdata
);
85 log_error("[%s:%u] Invalid section header.", filename
, line
);
89 if (!(n
= strndup(l
+1, k
-2)))
92 if (sections
&& !strv_contains((char**) sections
, n
)) {
103 if (!(e
= strchr(l
, '='))) {
104 log_error("[%s:%u] Missing '='.", filename
, line
);
111 return next_assignment(filename
, line
, *section
, t
, strstrip(l
), strstrip(e
), userdata
);
114 /* Go through the file and parse each line */
115 int config_parse(const char *filename
, FILE *f
, const char* const * sections
, const ConfigItem
*t
, void *userdata
) {
117 char *section
= NULL
;
124 if (!(f
= fopen(filename
, "re"))) {
126 log_error("Failed to open configuration file '%s': %s", filename
, strerror(-r
));
134 if (!fgets(l
, sizeof(l
), f
)) {
139 log_error("Failed to read configuration file '%s': %s", filename
, strerror(-r
));
143 if ((r
= parse_line(filename
, ++line
, §ion
, sections
, t
, l
, userdata
)) < 0)
158 int config_parse_int(
159 const char *filename
,
175 if ((r
= safe_atoi(rvalue
, i
)) < 0) {
176 log_error("[%s:%u] Failed to parse numeric value: %s", filename
, line
, rvalue
);
183 int config_parse_unsigned(
184 const char *filename
,
200 if ((r
= safe_atou(rvalue
, u
)) < 0) {
201 log_error("[%s:%u] Failed to parse numeric value: %s", filename
, line
, rvalue
);
208 int config_parse_size(
209 const char *filename
,
226 if ((r
= safe_atou(rvalue
, &u
)) < 0) {
227 log_error("[%s:%u] Failed to parse numeric value: %s", filename
, line
, rvalue
);
235 int config_parse_bool(
236 const char *filename
,
252 if ((k
= parse_boolean(rvalue
)) < 0) {
253 log_error("[%s:%u] Failed to parse boolean value: %s", filename
, line
, rvalue
);
261 int config_parse_string(
262 const char *filename
,
279 if (!(n
= strdup(rvalue
)))
290 int config_parse_path(
291 const char *filename
,
307 if (*rvalue
!= '/') {
308 log_error("[%s:%u] Not an absolute path: %s", filename
, line
, rvalue
);
312 if (!(n
= strdup(rvalue
)))
321 int config_parse_strv(
322 const char *filename
,
342 k
= strv_length(*sv
);
343 FOREACH_WORD_QUOTED(w
, l
, rvalue
, state
)
346 if (!(n
= new(char*, k
+1)))
349 for (k
= 0; (*sv
)[k
]; k
++)
351 FOREACH_WORD_QUOTED(w
, l
, rvalue
, state
)
352 if (!(n
[k
++] = strndup(w
, l
)))