chiark / gitweb /
util: unify SO_PEERCRED/SO_PEERSEC invocations
[elogind.git] / src / shared / env-util.c
index 9a833d22e4d176208088e73ff9aeba2d10e4c18e..7976881ef697acd0217314412cf0a344c8a75d76 100644 (file)
 #include "utf8.h"
 #include "util.h"
 #include "env-util.h"
+#include "def.h"
 
 #define VALID_CHARS_ENV_NAME                    \
-        "0123456789"                            \
-        "abcdefghijklmnopqrstuvwxyz"            \
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"            \
+        DIGITS LETTERS                          \
         "_"
 
 #ifndef ARG_MAX
@@ -108,7 +107,7 @@ bool env_assignment_is_valid(const char *e) {
 
         /* POSIX says the overall size of the environment block cannot
          * be > ARG_MAX, hence the individual variable assignments
-         * cannot be either, but let's room for one trailing NUL
+         * cannot be either, but let's leave room for one trailing NUL
          * byte. */
         if (strlen(e) > ARG_MAX - 1)
                 return false;
@@ -128,7 +127,7 @@ bool strv_env_is_valid(char **e) {
                 /* Check if there are duplicate assginments */
                 k = strcspn(*p, "=");
                 STRV_FOREACH(q, p + 1)
-                        if (strncmp(*p, *q, k) == 0 && (*q)[k] == '=')
+                        if (strneq(*p, *q, k) && (*q)[k] == '=')
                                 return false;
         }
 
@@ -171,7 +170,7 @@ static int env_append(char **r, char ***k, char **a) {
                         n++;
 
                 for (j = r; j < *k; j++)
-                        if (strncmp(*j, *a, n) == 0)
+                        if (strneq(*j, *a, n))
                                 break;
 
                 if (j >= *k)
@@ -227,7 +226,7 @@ fail:
         return NULL;
 }
 
-static bool env_match(const char *t, const char *pattern) {
+_pure_ static bool env_match(const char *t, const char *pattern) {
         assert(t);
         assert(pattern);
 
@@ -247,7 +246,7 @@ static bool env_match(const char *t, const char *pattern) {
         if (!strchr(pattern, '=')) {
                 size_t l = strlen(pattern);
 
-                return strncmp(t, pattern, l) == 0 && t[l] == '=';
+                return strneq(t, pattern, l) && t[l] == '=';
         }
 
         return false;
@@ -363,7 +362,7 @@ char *strv_env_get_n(char **l, const char *name, size_t k) {
                 return NULL;
 
         STRV_FOREACH(i, l)
-                if (strncmp(*i, name, k) == 0 &&
+                if (strneq(*i, name, k) &&
                     (*i)[k] == '=')
                         return *i + k + 1;
 
@@ -376,7 +375,7 @@ char *strv_env_get(char **l, const char *name) {
         return strv_env_get_n(l, name, strlen(name));
 }
 
-char **strv_env_clean(char **e) {
+char **strv_env_clean_log(char **e, const char *message) {
         char **p, **q;
         int k = 0;
 
@@ -385,13 +384,15 @@ char **strv_env_clean(char **e) {
                 bool duplicate = false;
 
                 if (!env_assignment_is_valid(*p)) {
+                        if (message)
+                                log_error("Ignoring invalid environment '%s': %s", *p, message);
                         free(*p);
                         continue;
                 }
 
                 n = strcspn(*p, "=");
                 STRV_FOREACH(q, p + 1)
-                        if (strncmp(*p, *q, n) == 0 && (*q)[n] == '=') {
+                        if (strneq(*p, *q, n) && (*q)[n] == '=') {
                                 duplicate = true;
                                 break;
                         }
@@ -404,6 +405,12 @@ char **strv_env_clean(char **e) {
                 e[k++] = *p;
         }
 
-        e[k] = NULL;
+        if (e)
+                e[k] = NULL;
+
         return e;
 }
+
+char **strv_env_clean(char **e) {
+        return strv_env_clean_log(e, NULL);
+}