pidref: add pidref_equal() helper

This compares two PidRef structures via the pid_t field. Ideally we'd do
a stricter comparison here, that is safe towards PID reuse, but so far
the pidfd API lacks suitable mechanisms for that, hence do the best we
can do.
This commit is contained in:
Lennart Poettering
2023-09-20 13:02:21 +08:00
committed by Mike Yuan
parent 648cb0248d
commit 3b74b4958b
2 changed files with 14 additions and 2 deletions
+12
View File
@@ -15,6 +15,18 @@ static inline bool pidref_is_set(const PidRef *pidref) {
return pidref && pidref->pid > 0;
}
static inline bool pidref_equal(const PidRef *a, const PidRef *b) {
if (pidref_is_set(a)) {
if (!pidref_is_set(b))
return false;
return a->pid == b->pid;
}
return !pidref_is_set(b);
}
int pidref_set_pid(PidRef *pidref, pid_t pid);
int pidref_set_pidstr(PidRef *pidref, const char *pid);
int pidref_set_pidfd(PidRef *pidref, int fd);
+2 -2
View File
@@ -193,12 +193,12 @@ static int service_set_main_pidref(Service *s, PidRef *pidref) {
if (pidref->pid == getpid_cached())
return -EINVAL;
if (s->main_pid.pid == pidref->pid && s->main_pid_known) {
if (pidref_equal(&s->main_pid, pidref) && s->main_pid_known) {
pidref_done(pidref);
return 0;
}
if (s->main_pid.pid != pidref->pid) {
if (!pidref_equal(&s->main_pid, pidref)) {
service_unwatch_main_pid(s);
exec_status_start(&s->main_exec_status, pidref->pid);
}