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.
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);
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);
}