]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-util: introduce env_update_systemd_exec_pid()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 31 Jan 2021 14:33:06 +0000 (23:33 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 31 Jan 2021 16:13:44 +0000 (01:13 +0900)
Will be used in later commits.

src/basic/env-util.c
src/basic/env-util.h
src/test/test-env-util.c

index 96c024afd77d5638c2d75e2cfe1aeb8e53d503e2..a75186015e366ba90df5288be99471f74a18897a 100644 (file)
@@ -12,6 +12,8 @@
 #include "extract-word.h"
 #include "macro.h"
 #include "parse-util.h"
+#include "process-util.h"
+#include "stdio-util.h"
 #include "string-util.h"
 #include "strv.h"
 #include "utf8.h"
@@ -749,3 +751,24 @@ int set_unset_env(const char *name, const char *value, bool overwrite) {
                 return -errno;
         return 0;
 }
+
+int setenv_systemd_exec_pid(bool update_only) {
+        char str[DECIMAL_STR_MAX(pid_t)];
+        const char *e;
+
+        /* Update $SYSTEMD_EXEC_PID=pid except when '*' is set for the variable. */
+
+        e = secure_getenv("SYSTEMD_EXEC_PID");
+        if (!e && update_only)
+                return 0;
+
+        if (streq_ptr(e, "*"))
+                return 0;
+
+        xsprintf(str, PID_FMT, getpid_cached());
+
+        if (setenv("SYSTEMD_EXEC_PID", str, 1) < 0)
+                return -errno;
+
+        return 1;
+}
index 6684b3350f09b78839444fd7b2aa964f6902ef60..5d8afec0289203d504ff1e695c53832a8059f0bf 100644 (file)
@@ -55,3 +55,5 @@ int getenv_bool_secure(const char *p);
 
 /* Like setenv, but calls unsetenv if value == NULL. */
 int set_unset_env(const char *name, const char *value, bool overwrite);
+
+int setenv_systemd_exec_pid(bool update_only);
index 755aa069de30179e0c52b9d16fd8e852a70854ae..ce215fdd36458ec254178b4b257a9314dd0403c2 100644 (file)
@@ -4,6 +4,8 @@
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
+#include "parse-util.h"
+#include "process-util.h"
 #include "serialize.h"
 #include "string-util.h"
 #include "strv.h"
@@ -335,6 +337,41 @@ static void test_env_assignment_is_valid(void) {
         assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;<mock-chroot>\x07<mock-chroot>\""));
 }
 
+static void test_setenv_systemd_exec_pid(void) {
+        _cleanup_free_ char *saved = NULL;
+        const char *e;
+        pid_t p;
+
+        log_info("/* %s */", __func__);
+
+        e = getenv("SYSTEMD_EXEC_PID");
+        if (e)
+                assert_se(saved = strdup(e));
+
+        assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0);
+        assert_se(setenv_systemd_exec_pid(true) == 0);
+        assert_se(!getenv("SYSTEMD_EXEC_PID"));
+
+        assert_se(setenv("SYSTEMD_EXEC_PID", "*", 1) >= 0);
+        assert_se(setenv_systemd_exec_pid(true) == 0);
+        assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+        assert_se(streq(e, "*"));
+
+        assert_se(setenv("SYSTEMD_EXEC_PID", "123abc", 1) >= 0);
+        assert_se(setenv_systemd_exec_pid(true) == 1);
+        assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+        assert_se(parse_pid(e, &p) >= 0);
+        assert_se(p == getpid_cached());
+
+        assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0);
+        assert_se(setenv_systemd_exec_pid(false) == 1);
+        assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+        assert_se(parse_pid(e, &p) >= 0);
+        assert_se(p == getpid_cached());
+
+        assert_se(set_unset_env("SYSTEMD_EXEC_PID", saved, 1) >= 0);
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
@@ -353,6 +390,7 @@ int main(int argc, char *argv[]) {
         test_env_name_is_valid();
         test_env_value_is_valid();
         test_env_assignment_is_valid();
+        test_setenv_systemd_exec_pid();
 
         return 0;
 }