X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fconf-parser.c;h=b09e90ae8bd40c672c338b1073f09fa34d6f6819;hb=076a24adf4bfbb9c5aa8167e102c253c7e1c651e;hp=7f286096d234c591860d30aebf83826239b11bc0;hpb=74051b9b5865586bf4d30b9075649af838fb92bd;p=elogind.git diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 7f286096d..b09e90ae8 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -467,6 +467,33 @@ int config_parse_unsigned( 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; + } + + return 0; +} + int config_parse_bytes_size( const char *filename, unsigned line, @@ -668,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); @@ -685,50 +708,27 @@ int config_parse_strv( /* Empty assignment resets the list */ strv_free(*sv); *sv = NULL; + return 0; } - k = strv_length(*sv); - FOREACH_WORD_QUOTED(w, l, rvalue, state) - k++; - - n = new(char*, k+1); - if (!n) - return log_oom(); - - if (*sv) - for (k = 0; (*sv)[k]; k++) - n[k] = (*sv)[k]; - else - k = 0; - FOREACH_WORD_QUOTED(w, l, rvalue, state) { - n[k] = cunescape_length(w, l); - if (!n[k]) { - r = log_oom(); - goto fail; - } + _cleanup_free_ char *n; + + n = cunescape_length(w, l); + if (!n) + return log_oom(); - 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]); + 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( @@ -741,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); @@ -758,56 +754,33 @@ int config_parse_path_strv( /* Empty assignment resets the list */ strv_free(*sv); *sv = NULL; + return 0; } - k = strv_length(*sv); - FOREACH_WORD_QUOTED(w, l, rvalue, state) - k++; - - n = new(char*, k+1); - if (!n) - return log_oom(); - - k = 0; - if (*sv) - for (; (*sv)[k]; k++) - n[k] = (*sv)[k]; - FOREACH_WORD_QUOTED(w, l, rvalue, state) { - n[k] = strndup(w, l); - if (!n[k]) { - r = log_oom(); - 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(