From e68a29c15e5f1050a19b399f86ff5caf5d1d77f0 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 14 Aug 2020 18:11:14 -0400 Subject: Implement serviceSignal, serviceStop, serviceRestart --- daemon.h | 4 ++++ service.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/daemon.h b/daemon.h index 32827aa..5975034 100644 --- a/daemon.h +++ b/daemon.h @@ -67,6 +67,7 @@ extern char *serviceEnviron[EnvironLen]; enum State { Stop, Start, + Restart, }; enum { LineCap = 512 }; @@ -96,6 +97,9 @@ extern struct Services { int serviceAdd(const char *name, const char *command); void serviceStart(struct Service *service); +void serviceStop(struct Service *service); +void serviceRestart(struct Service *service); +void serviceSignal(struct Service *service, int signal); extern char configError[]; int configParse(const char *path); diff --git a/service.c b/service.c index ef4834a..290372d 100644 --- a/service.c +++ b/service.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include #include @@ -108,7 +110,7 @@ err: } void serviceStart(struct Service *service) { - if (service->state == Start) return; + if (service->state != Stop) return; if (service->intent == Start) { struct timespec backoff = service->restartInterval; @@ -164,3 +166,28 @@ void serviceStart(struct Service *service) { ); err(StopExit, "%s", _PATH_BSHELL); } + +void serviceSignal(struct Service *service, int signal) { + if (service->state != Start) return; + int error = kill(service->pid, signal); + if (error) { + syslog( + LOG_ERR, "signal %s %s[%ju]: %m", + sys_signame[signal], service->name, (uintmax_t)service->pid + ); + } +} + +void serviceStop(struct Service *service) { + service->intent = Stop; + serviceSignal(service, SIGTERM); +} + +void serviceRestart(struct Service *service) { + if (service->state == Start) { + service->intent = Restart; + serviceSignal(service, SIGTERM); + } else { + serviceStart(service); + } +} -- cgit 1.4.1