From ecaf258eb4fc997205159e588072668024a049ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 31 Jul 2020 12:07:49 +0200 Subject: [PATCH] Use extract_first_word() in generated conf parsers --- src/shared/conf-parser.h | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index 7c9f5531b0..57787ea033 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -239,10 +239,10 @@ typedef enum Disabled { #define DEFINE_CONFIG_PARSE_ENUMV(function, name, type, invalid, msg) \ CONFIG_PARSER_PROTOTYPE(function) { \ - type **enums = data, x, *ys; \ + type **enums = data; \ _cleanup_free_ type *xs = NULL; \ - const char *word, *state; \ - size_t l, i = 0; \ + size_t i = 0; \ + int r; \ \ assert(filename); \ assert(lvalue); \ @@ -255,29 +255,32 @@ typedef enum Disabled { \ *xs = invalid; \ \ - FOREACH_WORD(word, l, rvalue, state) { \ + for (const char *p = rvalue;;) { \ _cleanup_free_ char *en = NULL; \ - type *new_xs; \ + type x, *new_xs; \ \ - en = strndup(word, l); \ - if (!en) \ + r = extract_first_word(&p, &en, NULL, 0); \ + if (r == -ENOMEM) \ return log_oom(); \ + if (r < 0) \ + return log_syntax(unit, LOG_ERR, filename, line, 0, \ + msg ": %s", en); \ + if (r == 0) \ + break; \ \ if ((x = name##_from_string(en)) < 0) { \ - log_syntax(unit, LOG_WARNING, filename, line, 0, \ + log_syntax(unit, LOG_WARNING, filename, line, 0, \ msg ", ignoring: %s", en); \ continue; \ } \ \ - for (ys = xs; x != invalid && *ys != invalid; ys++) { \ - if (*ys == x) { \ - log_syntax(unit, LOG_NOTICE, filename, \ - line, 0, \ - "Duplicate entry, ignoring: %s", \ + for (type *ys = xs; x != invalid && *ys != invalid; ys++) \ + if (*ys == x) { \ + log_syntax(unit, LOG_NOTICE, filename, line, 0, \ + "Duplicate entry, ignoring: %s", \ en); \ x = invalid; \ } \ - } \ \ if (x == invalid) \ continue; \ @@ -292,6 +295,5 @@ typedef enum Disabled { *(xs + i) = invalid; \ } \ \ - free_and_replace(*enums, xs); \ - return 0; \ + return free_and_replace(*enums, xs); \ }