Implement serviceSignal, serviceStop, serviceRestart

This commit is contained in:
C. McEnroe 2020-08-14 18:11:14 -04:00
parent 0ca3c5c103
commit e68a29c15e
2 changed files with 32 additions and 1 deletions

View File

@ -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);

View File

@ -19,6 +19,8 @@
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -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);
}
}