chiark / gitweb /
ask-password: supported plymouth cached passwords
[elogind.git] / src / strv.c
index d9aef982246c0dc158b4a190ce8832a340cfc088..b1643b357fbddf9f69eb09d4ae2c8cde67b7dd5d 100644 (file)
@@ -380,7 +380,7 @@ static int env_append(char **r, char ***k, char **a) {
 
         /* Add the entries of a to *k unless they already exist in *r
          * in which case they are overriden instead. This assumes
-         * there is enough space in the r */
+         * there is enough space in the r array. */
 
         for (; *a; a++) {
                 char **j;
@@ -556,3 +556,66 @@ char *strv_env_get_with_length(char **l, const char *name, size_t k) {
 char *strv_env_get(char **l, const char *name) {
         return strv_env_get_with_length(l, name, strlen(name));
 }
+
+char **strv_env_clean(char **l) {
+        char **r, **ret;
+
+        for (r = ret = l; *l; l++) {
+                const char *equal;
+
+                equal = strchr(*l, '=');
+
+                if (equal && equal[1] == 0) {
+                        free(*l);
+                        continue;
+                }
+
+                *(r++) = *l;
+        }
+
+        *r = NULL;
+
+        return ret;
+}
+
+char **strv_parse_nulstr(const char *s, size_t l) {
+        const char *p;
+        unsigned c = 0, i = 0;
+        char **v;
+
+        assert(s || l <= 0);
+
+        if (l <= 0)
+                return strv_new(NULL, NULL);
+
+        for (p = s; p < s + l; p++)
+                if (*p == 0)
+                        c++;
+
+        if (s[l-1] != 0)
+                c++;
+
+        if (!(v = new0(char*, c+1)))
+                return NULL;
+
+        p = s;
+        while (p < s + l) {
+                const char *e;
+
+                e = memchr(p, 0, s + l - p);
+
+                if (!(v[i++] = strndup(p, e ? e - p : s + l - p))) {
+                        strv_free(v);
+                        return NULL;
+                }
+
+                if (!e)
+                        break;
+
+                p = e + 1;
+        }
+
+        assert(i == c);
+
+        return v;
+}