From: Zbigniew Jędrzejewski-Szmek Date: Fri, 15 Jul 2022 09:38:01 +0000 (+0200) Subject: basic/log: split out invoked_by_systemd() utility function X-Git-Tag: v252-rc1~627^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=494f4ee9c770e401ea3d570a9caf4b3058cf7758;p=thirdparty%2Fsystemd.git basic/log: split out invoked_by_systemd() utility function --- diff --git a/src/basic/log.c b/src/basic/log.c index 02fc2c6f92f..cac17a76f4d 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -1153,30 +1153,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat } static bool should_parse_proc_cmdline(void) { - const char *e; - pid_t p; - /* PID1 always reads the kernel command line. */ if (getpid_cached() == 1) return true; - /* If the process is directly executed by PID1 (e.g. ExecStart= or generator), systemd-importd, - * or systemd-homed, then $SYSTEMD_EXEC_PID= is set, and read the command line. */ - e = getenv("SYSTEMD_EXEC_PID"); - if (!e) - return false; - - if (streq(e, "*")) - /* For testing. */ - return true; - - if (parse_pid(e, &p) < 0) { - /* We know that systemd sets the variable correctly. Something else must have set it. */ - log_debug("Failed to parse \"$SYSTEMD_EXEC_PID=%s\". Ignoring.", e); - return false; - } - - return getpid_cached() == p; + /* Otherwise, parse the commandline if invoked directly by systemd. */ + return invoked_by_systemd(); } void log_parse_environment_variables(void) { diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 6980e0c4f69..d885d92dfb2 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -1579,6 +1579,30 @@ bool invoked_as(char *argv[], const char *token) { return strstr(last_path_component(argv[0]), token); } +bool invoked_by_systemd(void) { + int r; + + /* If the process is directly executed by PID1 (e.g. ExecStart= or generator), systemd-importd, + * or systemd-homed, then $SYSTEMD_EXEC_PID= is set, and read the command line. */ + const char *e = getenv("SYSTEMD_EXEC_PID"); + if (!e) + return false; + + if (streq(e, "*")) + /* For testing. */ + return true; + + pid_t p; + r = parse_pid(e, &p); + if (r < 0) { + /* We know that systemd sets the variable correctly. Something else must have set it. */ + log_debug_errno(r, "Failed to parse \"SYSTEMD_EXEC_PID=%s\", ignoring: %m", e); + return false; + } + + return getpid_cached() == p; +} + _noreturn_ void freeze(void) { log_close(); diff --git a/src/basic/process-util.h b/src/basic/process-util.h index c07575e5802..f8c374a3103 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -190,6 +190,8 @@ int setpriority_closest(int priority); bool invoked_as(char *argv[], const char *token); +bool invoked_by_systemd(void); + _noreturn_ void freeze(void); bool argv_looks_like_help(int argc, char **argv);