shared/conf-parser: allow sections to be silently ignored with new -Section syntax

If we ignore any uknown section, we will not be able to show any
warning if a typo in a section name is made. Let's reverse our
approach, and explicitly list sections to ignore instead.

I opted to make use the same section list for this, instead of adding a second
list, because this list is passed through to many functions and adding yet
another parameter to the long signature would be very noisy.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-11-22 11:16:17 +01:00
parent 94a404cb03
commit ddeb3f5d4b
2 changed files with 28 additions and 5 deletions

View File

@ -221,8 +221,19 @@ static int parse_line(
return -ENOMEM;
if (sections && !nulstr_contains(sections, n)) {
bool ignore = flags & CONFIG_PARSE_RELAXED;
const char *t;
if (!(flags & CONFIG_PARSE_RELAXED) && !startswith(n, "X-"))
ignore = ignore || startswith(n, "X-");
if (!ignore)
NULSTR_FOREACH(t, sections)
if (streq_ptr(n, startswith(t, "-"))) {
ignore = true;
break;
}
if (!ignore)
log_syntax(unit, LOG_WARNING, filename, line, 0, "Unknown section '%s'. Ignoring.", n);
free(n);

View File

@ -299,6 +299,15 @@ static const char* const config_file[] = {
"[Section]\n"
"setting1=" /* many continuation lines, together above the limit */
x1000(x1000("x") x10("abcde") "\\\n") "xxx",
"[Section]\n"
"setting1=2\n"
"[NoWarnSection]\n"
"setting1=3\n"
"[WarnSection]\n"
"setting1=3\n"
"[X-Section]\n"
"setting1=3\n",
};
static void test_config_parse(unsigned i, const char *s) {
@ -325,14 +334,12 @@ static void test_config_parse(unsigned i, const char *s) {
const char *sections,
ConfigItemLookup lookup,
const void *table,
bool relaxed,
bool allow_include,
bool warn,
ConfigParseFlags flags,
void *userdata)
*/
r = config_parse(NULL, name, f,
"Section\0",
"Section\0-NoWarnSection\0",
config_item_table_lookup, items,
CONFIG_PARSE_WARN, NULL);
@ -366,6 +373,11 @@ static void test_config_parse(unsigned i, const char *s) {
assert_se(r == -ENOBUFS);
assert_se(setting1 == NULL);
break;
case 17:
assert_se(r == 0);
assert_se(streq(setting1, "2"));
break;
}
}