X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fconf-parser.c;h=b09e90ae8bd40c672c338b1073f09fa34d6f6819;hb=9f26c90cb50c45d4549c4dd569917b4ac143b94d;hp=595bb51a27151c8a7e5380a6260c1a5ddc4426d5;hpb=96342de68d0d6de71a062d984dafd2a0905ed9fe;p=elogind.git diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 595bb51a2..b09e90ae8 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -377,7 +377,8 @@ int config_parse_int( assert(rvalue); assert(data); - if ((r = safe_atoi(rvalue, i)) < 0) { + r = safe_atoi(rvalue, i); + if (r < 0) { log_error("[%s:%u] Failed to parse numeric value, ingoring: %s", filename, line, rvalue); return 0; } @@ -403,7 +404,8 @@ int config_parse_long( assert(rvalue); assert(data); - if ((r = safe_atoli(rvalue, i)) < 0) { + r = safe_atoli(rvalue, i); + if (r < 0) { log_error("[%s:%u] Failed to parse numeric value, ignoring: %s", filename, line, rvalue); return 0; } @@ -429,7 +431,8 @@ int config_parse_uint64( assert(rvalue); assert(data); - if ((r = safe_atou64(rvalue, u)) < 0) { + r = safe_atou64(rvalue, u); + if (r < 0) { log_error("[%s:%u] Failed to parse numeric value, ignoring: %s", filename, line, rvalue); return 0; } @@ -455,7 +458,35 @@ int config_parse_unsigned( assert(rvalue); assert(data); - if ((r = safe_atou(rvalue, u)) < 0) { + r = safe_atou(rvalue, u); + if (r < 0) { + log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue); + return r; + } + + return 0; +} + +int config_parse_double( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + double *d = data; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + r = safe_atod(rvalue, d); + if (r < 0) { log_error("[%s:%u] Failed to parse numeric value: %s", filename, line, rvalue); return r; } @@ -593,9 +624,9 @@ int config_parse_string( assert(rvalue); assert(data); - n = cunescape(rvalue); + n = strdup(rvalue); if (!n) - return -ENOMEM; + return log_oom(); if (!utf8_is_valid(n)) { log_error("[%s:%u] String is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue); @@ -644,7 +675,7 @@ int config_parse_path( n = strdup(rvalue); if (!n) - return -ENOMEM; + return log_oom(); path_kill_slashes(n); @@ -664,12 +695,8 @@ int config_parse_strv( void *data, void *userdata) { - char*** sv = data; - char **n; - char *w; - unsigned k; + char *** sv = data, *w, *state; size_t l; - char *state; int r; assert(filename); @@ -677,48 +704,31 @@ int config_parse_strv( assert(rvalue); assert(data); - k = strv_length(*sv); - FOREACH_WORD_QUOTED(w, l, rvalue, state) - k++; - - n = new(char*, k+1); - if (!n) - return -ENOMEM; - - if (*sv) - for (k = 0; (*sv)[k]; k++) - n[k] = (*sv)[k]; - else - k = 0; + if (isempty(rvalue)) { + /* Empty assignment resets the list */ + strv_free(*sv); + *sv = NULL; + return 0; + } FOREACH_WORD_QUOTED(w, l, rvalue, state) { - n[k] = cunescape_length(w, l); - if (!n[k]) { - r = -ENOMEM; - goto fail; - } + _cleanup_free_ char *n; - if (!utf8_is_valid(n[k])) { - log_error("[%s:%u] String is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue); - free(n[k]); + n = cunescape_length(w, l); + if (!n) + return log_oom(); + + if (!utf8_is_valid(n)) { + log_error("[%s:%u] String is not UTF-8 clean, ignoring: %s", filename, line, rvalue); continue; } - k++; + r = strv_extend(sv, n); + if (r < 0) + return log_oom(); } - n[k] = NULL; - free(*sv); - *sv = n; - return 0; - -fail: - for (; k > 0; k--) - free(n[k-1]); - free(n); - - return r; } int config_parse_path_strv( @@ -731,12 +741,8 @@ int config_parse_path_strv( void *data, void *userdata) { - char*** sv = data; - char **n; - char *w; - unsigned k; + char*** sv = data, *w, *state; size_t l; - char *state; int r; assert(filename); @@ -744,54 +750,37 @@ int config_parse_path_strv( assert(rvalue); assert(data); - k = strv_length(*sv); - FOREACH_WORD_QUOTED(w, l, rvalue, state) - k++; - - n = new(char*, k+1); - if (!n) - return -ENOMEM; - - k = 0; - if (*sv) - for (; (*sv)[k]; k++) - n[k] = (*sv)[k]; + if (isempty(rvalue)) { + /* Empty assignment resets the list */ + strv_free(*sv); + *sv = NULL; + return 0; + } FOREACH_WORD_QUOTED(w, l, rvalue, state) { - n[k] = strndup(w, l); - if (!n[k]) { - r = -ENOMEM; - goto fail; - } + _cleanup_free_ char *n; - if (!utf8_is_valid(n[k])) { + n = strndup(w, l); + if (!n) + return log_oom(); + + if (!utf8_is_valid(n)) { log_error("[%s:%u] Path is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue); - free(n[k]); continue; } - if (!path_is_absolute(n[k])) { + if (!path_is_absolute(n)) { log_error("[%s:%u] Not an absolute path, ignoring: %s", filename, line, rvalue); - free(n[k]); continue; } - path_kill_slashes(n[k]); - k++; + path_kill_slashes(n); + r = strv_extend(sv, n); + if (r < 0) + return log_oom(); } - n[k] = NULL; - free(*sv); - *sv = n; - return 0; - -fail: - for (; k > 0; k--) - free(n[k-1]); - free(n); - - return r; } int config_parse_usec( @@ -865,7 +854,7 @@ int config_parse_mode( errno = 0; l = strtol(rvalue, &x, 8); - if (!x || *x || errno) { + if (!x || x == rvalue || *x || errno) { log_error("[%s:%u] Failed to parse mode value, ignoring: %s", filename, line, rvalue); return 0; } @@ -957,9 +946,21 @@ int config_parse_set_status( assert(rvalue); assert(data); + if (isempty(rvalue)) { + /* Empty assignment resets the list */ + + set_free(status_set->signal); + set_free(status_set->code); + + status_set->signal = status_set->code = NULL; + return 0; + } + FOREACH_WORD(w, l, rvalue, state) { int val; - char *temp = strndup(w, l); + char *temp; + + temp = strndup(w, l); if (!temp) return log_oom(); @@ -967,31 +968,31 @@ int config_parse_set_status( if (r < 0) { val = signal_from_string_try_harder(temp); free(temp); + if (val > 0) { - if (!status_set->signal) { - status_set->signal = set_new(trivial_hash_func, trivial_compare_func); - if (!status_set->signal) - return log_oom(); - } + r = set_ensure_allocated(&status_set->signal, trivial_hash_func, trivial_compare_func); + if (r < 0) + return log_oom(); + r = set_put(status_set->signal, INT_TO_PTR(val)); if (r < 0) { log_error("[%s:%u] Unable to store: %s", filename, line, w); return r; } } else { - log_error("[%s:%u] Failed to parse value: %s", filename, line, w); - return r; + log_error("[%s:%u] Failed to parse value, ignoring: %s", filename, line, w); + return 0; } } else { free(temp); - if(val < 0 || val > 255) + + if (val < 0 || val > 255) log_warning("[%s:%u] Value %d is outside range 0-255, ignoring", filename, line, val); else { - if (!status_set->code) { - status_set->code = set_new(trivial_hash_func, trivial_compare_func); - if (!status_set->code) - return log_oom(); - } + r = set_ensure_allocated(&status_set->code, trivial_hash_func, trivial_compare_func); + if (r < 0) + return log_oom(); + r = set_put(status_set->code, INT_TO_PTR(val)); if (r < 0) { log_error("[%s:%u] Unable to store: %s", filename, line, w); @@ -999,7 +1000,7 @@ int config_parse_set_status( } } } - } + return 0; }