diff options
Diffstat (limited to 'service.c')
-rw-r--r-- | service.c | 24 |
1 files changed, 23 insertions, 1 deletions
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 <http://www.gnu.org/licenses/>. */ +#include <fcntl.h> #include <paths.h> #include <stdio.h> #include <stdlib.h> @@ -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; |