summary refs log tree commit diff
path: root/service.c
diff options
context:
space:
mode:
Diffstat (limited to 'service.c')
-rw-r--r--service.c24
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;