X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fconf-parser.c;h=1e3cee5bebc4c21c97f161bda15e8201650fb4a4;hb=0371ca0dac1d70b2e5060a3c4e6fbbc2bdbd8671;hp=2303d9a50b7bb348bba6f2631f0708d40a02022b;hpb=db5c0122853a9ecf1cc92e6593461932df2fa866;p=elogind.git diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 2303d9a50..1e3cee5be 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "conf-parser.h" #include "util.h" @@ -155,6 +156,7 @@ static int next_assignment(const char *unit, ConfigItemLookup lookup, void *table, const char *section, + unsigned section_line, const char *lvalue, const char *rvalue, bool relaxed, @@ -177,8 +179,8 @@ static int next_assignment(const char *unit, if (r > 0) { if (func) - return func(unit, filename, line, section, lvalue, ltype, - rvalue, data, userdata); + return func(unit, filename, line, section, section_line, + lvalue, ltype, rvalue, data, userdata); return 0; } @@ -201,6 +203,7 @@ static int parse_line(const char* unit, bool relaxed, bool allow_include, char **section, + unsigned *section_line, char *l, void *userdata) { @@ -259,10 +262,13 @@ static int parse_line(const char* unit, "Unknown section '%s'. Ignoring.", n); free(n); + free(*section); *section = NULL; + *section_line = 0; } else { free(*section); *section = n; + *section_line = line; } return 0; @@ -292,6 +298,7 @@ static int parse_line(const char* unit, lookup, table, *section, + *section_line, strstrip(l), strstrip(e), relaxed, @@ -311,7 +318,7 @@ int config_parse(const char *unit, _cleanup_free_ char *section = NULL, *continuation = NULL; _cleanup_fclose_ FILE *ours = NULL; - unsigned line = 0; + unsigned line = 0, section_line = 0; int r; assert(filename); @@ -380,6 +387,7 @@ int config_parse(const char *unit, relaxed, allow_include, §ion, + §ion_line, p, userdata); free(c); @@ -396,6 +404,7 @@ int config_parse(const char *unit, const char *filename, \ unsigned line, \ const char *section, \ + unsigned section_line, \ const char *lvalue, \ int ltype, \ const char *rvalue, \ @@ -432,6 +441,7 @@ int config_parse_bytes_size(const char* unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -463,6 +473,7 @@ int config_parse_bytes_off(const char* unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -491,6 +502,7 @@ int config_parse_bool(const char* unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -516,41 +528,11 @@ int config_parse_bool(const char* unit, return 0; } -int config_parse_tristate(const char *unit, - const char *filename, - unsigned line, - const char *section, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - int k; - int *b = data; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(data); - - /* Tristates are like booleans, but can also take the 'default' value, i.e. "-1" */ - - k = parse_boolean(rvalue); - if (k < 0) { - log_syntax(unit, LOG_ERR, filename, line, -k, - "Failed to parse boolean value, ignoring: %s", rvalue); - return 0; - } - - *b = !!k; - return 0; -} - int config_parse_string(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -591,6 +573,7 @@ int config_parse_path(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -599,6 +582,7 @@ int config_parse_path(const char *unit, char **s = data; char *n; + int offset; assert(filename); assert(lvalue); @@ -611,7 +595,9 @@ int config_parse_path(const char *unit, return 0; } - if (!path_is_absolute(rvalue)) { + offset = rvalue[0] == '-' && (streq(lvalue, "InaccessibleDirectories") || + streq(lvalue, "ReadOnlyDirectories")); + if (!path_is_absolute(rvalue + offset)) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Not an absolute path, ignoring: %s", rvalue); return 0; @@ -633,6 +619,7 @@ int config_parse_strv(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -689,6 +676,7 @@ int config_parse_path_strv(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -713,6 +701,7 @@ int config_parse_path_strv(const char *unit, FOREACH_WORD_QUOTED(w, l, rvalue, state) { _cleanup_free_ char *n; + int offset; n = strndup(w, l); if (!n) @@ -724,7 +713,9 @@ int config_parse_path_strv(const char *unit, continue; } - if (!path_is_absolute(n)) { + offset = n[0] == '-' && (streq(lvalue, "InaccessibleDirectories") || + streq(lvalue, "ReadOnlyDirectories")); + if (!path_is_absolute(n + offset)) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Not an absolute path, ignoring: %s", rvalue); continue; @@ -743,6 +734,7 @@ int config_parse_mode(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -780,6 +772,7 @@ int config_parse_facility(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -810,6 +803,7 @@ int config_parse_level(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -839,6 +833,7 @@ int config_parse_set_status(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue,