From ecc818534cb9da095ee9dc46eb801233f33b996e Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 14 Aug 2020 16:51:32 -0400 Subject: Flesh out Service struct --- daemon.h | 22 +++++++++++++++++++++- service.c | 24 +++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/daemon.h b/daemon.h index 2c77537..a62f78f 100644 --- a/daemon.h +++ b/daemon.h @@ -19,6 +19,7 @@ #include #include #include +#include #include typedef unsigned char byte; @@ -63,10 +64,29 @@ extern uid_t serviceUID; extern gid_t serviceGID; extern char *serviceEnviron[EnvironLen]; +enum State { + Stop, + Start, +}; + +enum { LineCap = 512 }; +struct Line { + size_t len; + char buf[LineCap]; +}; + struct Service { char *name; char *command; - // TODO: And many other things... + enum State intent; + enum State state; + pid_t pid; + int outPipe[2]; + int errPipe[2]; + struct Line outLine; + struct Line errLine; + int restartInterval; + struct timeval restartTime; }; extern struct Services { diff --git a/service.c b/service.c index 7087e38..f5038da 100644 --- a/service.c +++ b/service.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -36,6 +37,14 @@ struct Services services; static void serviceFree(struct Service *service) { free(service->name); free(service->command); + if (service->outPipe[0] >= 0) { + close(service->outPipe[0]); + close(service->outPipe[1]); + } + if (service->errPipe[0] >= 0) { + close(service->errPipe[0]); + close(service->errPipe[1]); + } } int serviceAdd(const char *name, const char *command) { @@ -63,7 +72,11 @@ int serviceAdd(const char *name, const char *command) { services.ptr = ptr; } service = &services.ptr[services.len]; - memset(service, 0, sizeof(*service)); + *service = (struct Service) { + .outPipe = { -1, -1 }, + .errPipe = { -1, -1 }, + .restartInterval = restartInterval, + }; service->name = strdup(name); if (!service->name) goto err; @@ -71,6 +84,15 @@ int serviceAdd(const char *name, const char *command) { service->command = strdup(command); if (!service->command) goto err; + int error = pipe2(service->outPipe, O_CLOEXEC); + if (error) goto err; + + error = pipe2(service->errPipe, O_CLOEXEC); + if (error) goto err; + + fcntl(service->outPipe[0], F_SETFL, O_NONBLOCK); + fcntl(service->errPipe[0], F_SETFL, O_NONBLOCK); + services.len++; return 0; -- cgit 1.4.1