X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fstrv.c;h=00857e40a7a3b500865c9516a2bc69fd25a8432e;hb=592fd144ae313855f48d0ca52a103013b41e5d59;hp=0ac66b927c167d166a4918c7c85fbca5f2cc7780;hpb=a2a5291b3f5ab6ed4c92f51d0fd10a03047380d8;p=elogind.git diff --git a/src/shared/strv.c b/src/shared/strv.c index 0ac66b927..00857e40a 100644 --- a/src/shared/strv.c +++ b/src/shared/strv.c @@ -52,6 +52,23 @@ char *strv_find_prefix(char **l, const char *name) { return NULL; } +char *strv_find_startswith(char **l, const char *name) { + char **i, *e; + + assert(name); + + /* Like strv_find_prefix, but actually returns only the + * suffix, not the whole item */ + + STRV_FOREACH(i, l) { + e = startswith(*i, name); + if (e) + return e; + } + + return NULL; +} + void strv_free(char **l) { char **k; @@ -231,7 +248,7 @@ char **strv_split(const char *s, const char *separator) { return r; } -char **strv_split_quoted(const char *s) { +int strv_split_quoted(char ***t, const char *s) { const char *word, *state; size_t l; unsigned n, i; @@ -242,26 +259,27 @@ char **strv_split_quoted(const char *s) { n = 0; FOREACH_WORD_QUOTED(word, l, s, state) n++; - if (*state) + if (!isempty(state)) /* bad syntax */ - return NULL; + return -EINVAL; r = new(char*, n+1); if (!r) - return NULL; + return -ENOMEM; i = 0; FOREACH_WORD_QUOTED(word, l, s, state) { r[i] = cunescape_length(word, l); if (!r[i]) { strv_free(r); - return NULL; + return -ENOMEM; } i++; } r[i] = NULL; - return r; + *t = r; + return 0; } char **strv_split_newlines(const char *s) { @@ -362,13 +380,19 @@ char *strv_join_quoted(char **l) { int strv_push(char ***l, char *value) { char **c; - unsigned n; + unsigned n, m; if (!value) return 0; n = strv_length(*l); - c = realloc(*l, sizeof(char*) * (n + 2)); + + /* increase and check for overflow */ + m = n + 2; + if (m < n) + return -ENOMEM; + + c = realloc_multiply(*l, sizeof(char*), m); if (!c) return -ENOMEM; @@ -381,13 +405,19 @@ int strv_push(char ***l, char *value) { int strv_push_prepend(char ***l, char *value) { char **c; - unsigned n, i; + unsigned n, m, i; if (!value) return 0; n = strv_length(*l); - c = new(char*, n + 2); + + /* increase and check for overflow */ + m = n + 2; + if (m < n) + return -ENOMEM; + + c = new(char*, m); if (!c) return -ENOMEM;