X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fconf-parser.h;h=69d32711b7fbfcd94a1df1462571388b44458901;hb=3f132692e305ec9adf1779551cb89088de0188e8;hp=ea7b710dece722b5cecb1ed90c809a579029fa86;hpb=36f822c4bd077f9121757e24b6516e5c7ada63b5;p=elogind.git diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index ea7b710de..69d32711b 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -92,6 +92,14 @@ int config_parse(const char *unit, bool warn, void *userdata); +int config_parse_many(const char *conf_file, /* possibly NULL */ + const char *conf_file_dirs, /* nulstr */ + const char *sections, /* nulstr */ + ConfigItemLookup lookup, + const void *table, + bool relaxed, + void *userdata); + /* Generic parsers */ int config_parse_int(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_unsigned(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); @@ -169,8 +177,9 @@ int log_syntax_internal(const char *unit, int level, void *data, \ void *userdata) { \ \ - type **enums = data, *xs, x, *ys; \ - char *w, *state; \ + type **enums = data, x, *ys; \ + _cleanup_free_ type *xs = NULL; \ + const char *word, *state; \ size_t l, i = 0; \ \ assert(filename); \ @@ -179,12 +188,16 @@ int log_syntax_internal(const char *unit, int level, assert(data); \ \ xs = new0(type, 1); \ + if(!xs) \ + return -ENOMEM; \ + \ *xs = invalid; \ \ - FOREACH_WORD(w, l, rvalue, state) { \ + FOREACH_WORD(word, l, rvalue, state) { \ _cleanup_free_ char *en = NULL; \ + type *new_xs; \ \ - en = strndup(w, l); \ + en = strndup(word, l); \ if (!en) \ return -ENOMEM; \ \ @@ -208,13 +221,18 @@ int log_syntax_internal(const char *unit, int level, continue; \ \ *(xs + i) = x; \ - xs = realloc(xs, (++i + 1) * sizeof(type)); \ - if (!xs) \ + new_xs = realloc(xs, (++i + 1) * sizeof(type)); \ + if (new_xs) \ + xs = new_xs; \ + else \ return -ENOMEM; \ + \ *(xs + i) = invalid; \ } \ \ free(*enums); \ *enums = xs; \ + xs = NULL; \ + \ return 0; \ }