From e8099f1bfa34baef8367f40898ff9542a77ce84d Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 22 Mar 2022 07:22:15 +0100 Subject: [PATCH] The kill(2) syscall returns ENOENT, not ESRCH on missing PIDs Turns out the kill(2) syscall returns ENOENT, not ESRCH, in our test suite. Don't know why, the man page never mentions ENOENT, only the ESRCH code. Let's check for both, either way ithe PID is not there. Signed-off-by: Joachim Wiberg --- src/service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service.c b/src/service.c index a6e9f340..69c748a8 100644 --- a/src/service.c +++ b/src/service.c @@ -758,7 +758,7 @@ static int service_stop(svc_t *svc) rc = kill(-svc->pid, svc->sighalt); _d("kill(-%d, %d) => rc %d, errno %d", svc->pid, svc->sighalt, rc, errno); /* PID lost or forking process never really started */ - if (rc == -1 && errno == ESRCH) { + if (rc == -1 && (errno == ESRCH || errno == ENOENT)) { service_cleanup(svc); svc_set_state(svc, SVC_HALTED_STATE); } else @@ -836,7 +836,7 @@ static int service_restart(svc_t *svc) logit(LOG_CONSOLE | LOG_NOTICE, "Restarting %s[%d], sending SIGHUP ...", svc_ident(svc, NULL, 0), svc->pid); rc = kill(svc->pid, SIGHUP); - if (rc == -1 && errno == ESRCH) { + if (rc == -1 && (errno == ESRCH || errno == ENOENT)) { /* nobody home, reset internal state machine */ lost = svc->pid; } else {