summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--daemon.h22
-rw-r--r--service.c24
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 <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/time.h>
 #include <unistd.h>
 
 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 <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;