chiark / gitweb /
tree-wide: remove Lennart's copyright lines
[elogind.git] / src / basic / env-util.c
index 1ddb5888f2934840937d97efcc3af30ce0efddde..adb88c2c52c47b44ea3cb0775920f405ba846fe9 100644 (file)
@@ -1,21 +1,4 @@
-/***
-  This file is part of systemd.
-
-  Copyright 2012 Lennart Poettering
-
-  systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU Lesser General Public License as published by
-  the Free Software Foundation; either version 2.1 of the License, or
-  (at your option) any later version.
-
-  systemd is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
+/* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include <errno.h>
 #include <limits.h>
@@ -83,9 +66,9 @@ bool env_value_is_valid(const char *e) {
         if (!utf8_is_valid(e))
                 return false;
 
-        /* bash allows tabs in environment variables, and so should
-         * we */
-        if (string_has_cc(e, "\t"))
+        /* bash allows tabs and newlines in environment variables, and so
+         * should we */
+        if (string_has_cc(e, "\t\n"))
                 return false;
 
         /* POSIX says the overall size of the environment block cannot
@@ -209,11 +192,11 @@ static int env_append(char **r, char ***k, char **a) {
         return 0;
 }
 
-char **strv_env_merge(unsigned n_lists, ...) {
+char **strv_env_merge(size_t n_lists, ...) {
         size_t n = 0;
         char **l, **k, **r;
         va_list ap;
-        unsigned i;
+        size_t i;
 
         /* Merges an arbitrary number of environment sets */
 
@@ -288,7 +271,7 @@ static bool env_entry_has_name(const char *entry, const char *name) {
         return *t == '=';
 }
 
-char **strv_env_delete(char **x, unsigned n_lists, ...) {
+char **strv_env_delete(char **x, size_t n_lists, ...) {
         size_t n, i = 0;
         char **k, **r;
         va_list ap;
@@ -303,7 +286,7 @@ char **strv_env_delete(char **x, unsigned n_lists, ...) {
                 return NULL;
 
         STRV_FOREACH(k, x) {
-                unsigned v;
+                size_t v;
 
                 va_start(ap, n_lists);
                 for (v = 0; v < n_lists; v++) {
@@ -430,7 +413,8 @@ int strv_env_replace(char ***l, char *p) {
 
 char **strv_env_set(char **x, const char *p) {
 
-        char **k, **r;
+        char **k;
+        _cleanup_strv_free_ char **r = NULL;
         char* m[2] = { (char*) p, NULL };
 
         /* Overrides the env var setting of p, returns a new copy */
@@ -441,18 +425,14 @@ char **strv_env_set(char **x, const char *p) {
 
         k = r;
         if (env_append(r, &k, x) < 0)
-                goto fail;
+                return NULL;
 
         if (env_append(r, &k, m) < 0)
-                goto fail;
+                return NULL;
 
         *k = NULL;
 
-        return r;
-
-fail:
-        strv_free(r);
-        return NULL;
+        return TAKE_PTR(r);
 }
 
 char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) {
@@ -539,8 +519,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
 
         assert(format);
 
-        for (e = format, i = 0; *e && i < n; e ++, i ++) {
-
+        for (e = format, i = 0; *e && i < n; e ++, i ++)
                 switch (state) {
 
                 case WORD:
@@ -554,8 +533,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e-1;
                                 state = VARIABLE;
@@ -565,8 +543,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e+1;
                                 state = WORD;
@@ -576,8 +553,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e-1;
                                 state = VARIABLE_RAW;
@@ -596,8 +572,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e+1;
                                 state = WORD;
@@ -653,8 +628,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e+1;
                                 state = WORD;
@@ -673,8 +647,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                                 if (!k)
                                         return NULL;
 
-                                free(r);
-                                r = k;
+                                free_and_replace(r, k);
 
                                 word = e--;
                                 i--;
@@ -682,7 +655,6 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
                         }
                         break;
                 }
-        }
 
         if (state == VARIABLE_RAW) {
                 const char *t;
@@ -697,7 +669,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
 
 char **replace_env_argv(char **argv, char **env) {
         char **ret, **i;
-        unsigned k = 0, l = 0;
+        size_t k = 0, l = 0;
 
         l = strv_length(argv);
 
@@ -708,10 +680,10 @@ char **replace_env_argv(char **argv, char **env) {
         STRV_FOREACH(i, argv) {
 
                 /* If $FOO appears as single word, replace it by the split up variable */
-                if ((*i)[0] == '$' && (*i)[1] != '{' && (*i)[1] != '$') {
+                if ((*i)[0] == '$' && !IN_SET((*i)[1], '{', '$')) {
                         char *e;
                         char **w, **m = NULL;
-                        unsigned q;
+                        size_t q;
 
                         e = strv_env_get(env, *i+1);
                         if (e) {
@@ -729,7 +701,7 @@ char **replace_env_argv(char **argv, char **env) {
                         q = strv_length(m);
                         l = l + q - 1;
 
-                        w = realloc(ret, sizeof(char*) * (l+1));
+                        w = reallocarray(ret, l + 1, sizeof(char *));
                         if (!w) {
                                 ret[k] = NULL;
                                 strv_free(ret);
@@ -759,6 +731,7 @@ char **replace_env_argv(char **argv, char **env) {
         ret[k] = NULL;
         return ret;
 }
+#endif // 0
 
 int getenv_bool(const char *p) {
         const char *e;
@@ -770,6 +743,7 @@ int getenv_bool(const char *p) {
         return parse_boolean(e);
 }
 
+#if 0 /// UNNEEDED by elogind
 int getenv_bool_secure(const char *p) {
         const char *e;
 
@@ -806,15 +780,10 @@ int deserialize_environment(char ***environment, const char *line) {
         assert(environment);
 
         assert(startswith(line, "env="));
-        r = cunescape(line + 4, UNESCAPE_RELAX, &uce);
+        r = cunescape(line + 4, 0, &uce);
         if (r < 0)
                 return r;
 
-        if (!env_assignment_is_valid(uce)) {
-                free(uce);
-                return -EINVAL;
-        }
-
         return strv_env_replace(environment, uce);
 }
 #endif // 0