diff options
author | Mike Yuan <me@yhndnzj.com> | 2024-01-28 17:15:00 +0100 |
---|---|---|
committer | Mike Yuan <me@yhndnzj.com> | 2024-01-29 20:27:35 +0100 |
commit | 7e26863e9cb2c8c52aa9e5ff6684da26b2b85530 (patch) | |
tree | 96a732d43224bc8894e0e02fb531d7322b1136f0 | |
parent | notify: minor modernizations (diff) | |
download | systemd-7e26863e9cb2c8c52aa9e5ff6684da26b2b85530.tar.xz systemd-7e26863e9cb2c8c52aa9e5ff6684da26b2b85530.zip |
notify: deduplicate ppid handling
-rw-r--r-- | src/notify/notify.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/src/notify/notify.c b/src/notify/notify.c index ea65d04385..620f64a3ef 100644 --- a/src/notify/notify.c +++ b/src/notify/notify.c @@ -99,6 +99,18 @@ static pid_t manager_pid(void) { return pid; } +static pid_t pid_parent_if_possible(void) { + pid_t parent_pid = getppid(); + + /* Don't send from PID 1 or the service manager's PID (which might be distinct from 1, if we are a + * --user service). That'd just be confusing for the service manager. */ + if (parent_pid <= 1 || + parent_pid == manager_pid()) + return getpid_cached(); + + return parent_pid; +} + static int parse_argv(int argc, char *argv[]) { enum { @@ -163,16 +175,9 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_PID: - if (isempty(optarg) || streq(optarg, "auto")) { - arg_pid = getppid(); - - if (arg_pid <= 1 || - arg_pid == manager_pid()) /* Don't send from PID 1 or the service - * manager's PID (which might be distinct from - * 1, if we are a --user instance), that'd just - * be confusing for the service manager */ - arg_pid = getpid_cached(); - } else if (streq(optarg, "parent")) + if (isempty(optarg) || streq(optarg, "auto")) + arg_pid = pid_parent_if_possible(); + else if (streq(optarg, "parent")) arg_pid = getppid(); else if (streq(optarg, "self")) arg_pid = getpid_cached(); @@ -322,7 +327,6 @@ static int run(int argc, char* argv[]) { _cleanup_strv_free_ char **final_env = NULL; const char *our_env[9]; size_t i = 0; - pid_t source_pid; int r; log_setup(); @@ -408,20 +412,13 @@ static int run(int argc, char* argv[]) { setreuid(arg_uid, UID_INVALID) < 0) return log_error_errno(errno, "Failed to change UID: %m"); - if (arg_pid > 0) - source_pid = arg_pid; - else { - /* Pretend the message originates from our parent, given that we are typically called from a - * shell script, i.e. we are not the main process of a service but only a child of it. */ - source_pid = getppid(); - if (source_pid <= 1 || - source_pid == manager_pid()) /* safety check: don't claim we'd send anything from PID 1 - * or the service manager itself */ - source_pid = 0; - } + /* If --pid= is explicitly specified, use it as source pid. Otherwise, pretend the message originates + * from our parent, i.e. --pid=auto */ + if (arg_pid <= 0) + arg_pid = pid_parent_if_possible(); if (fdset_isempty(arg_fds)) - r = sd_pid_notify(source_pid, /* unset_environment= */ false, msg); + r = sd_pid_notify(arg_pid, /* unset_environment= */ false, msg); else { _cleanup_free_ int *a = NULL; int k; @@ -430,7 +427,7 @@ static int run(int argc, char* argv[]) { if (k < 0) return log_error_errno(k, "Failed to convert file descriptor set to array: %m"); - r = sd_pid_notify_with_fds(source_pid, /* unset_environment= */ false, msg, a, k); + r = sd_pid_notify_with_fds(arg_pid, /* unset_environment= */ false, msg, a, k); } if (r < 0) @@ -442,7 +439,7 @@ static int run(int argc, char* argv[]) { arg_fds = fdset_free(arg_fds); /* Close before we execute anything */ if (!arg_no_block) { - r = sd_pid_notify_barrier(source_pid, /* unset_environment= */ false, 5 * USEC_PER_SEC); + r = sd_pid_notify_barrier(arg_pid, /* unset_environment= */ false, 5 * USEC_PER_SEC); if (r < 0) return log_error_errno(r, "Failed to invoke barrier: %m"); if (r == 0) |