return 0;
}
+int putenv_dup(const char *assignment, bool override) {
+ const char *e, *n;
+
+ e = strchr(assignment, '=');
+ if (!e)
+ return -EINVAL;
+
+ n = strndupa(assignment, e - assignment);
+
+ /* This is like putenv(), but uses setenv() so that our memory doesn't become part of environ[]. */
+ if (setenv(n, e + 1, override) < 0)
+ return -errno;
+ return 0;
+}
+
int setenv_systemd_exec_pid(bool update_only) {
char str[DECIMAL_STR_MAX(pid_t)];
const char *e;
/* Like setenv, but calls unsetenv if value == NULL. */
int set_unset_env(const char *name, const char *value, bool overwrite);
+/* Like putenv, but duplicates the memory like setenv. */
+int putenv_dup(const char *assignment, bool override);
+
int setenv_systemd_exec_pid(bool update_only);
/* Parses and does sanity checks on an environment variable containing
assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;<mock-chroot>\x07<mock-chroot>\""));
}
+static void test_putenv_dup(void) {
+ log_info("/* %s */", __func__);
+
+ assert_se(putenv_dup("A=a1", true) == 0);
+ assert_se(streq(getenv("A"), "a1"));
+ assert_se(putenv_dup("A=a1", true) == 0);
+ assert_se(streq(getenv("A"), "a1"));
+ assert_se(putenv_dup("A=a2", false) == 0);
+ assert_se(streq(getenv("A"), "a1"));
+ assert_se(putenv_dup("A=a2", true) == 0);
+ assert_se(streq(getenv("A"), "a2"));
+}
+
static void test_setenv_systemd_exec_pid(void) {
_cleanup_free_ char *saved = NULL;
const char *e;
test_env_name_is_valid();
test_env_value_is_valid();
test_env_assignment_is_valid();
+ test_putenv_dup();
test_setenv_systemd_exec_pid();
return 0;