summary refs log tree commit diff
path: root/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon.c')
-rw-r--r--daemon.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/daemon.c b/daemon.c
index 36d5986..0b07bb9 100644
--- a/daemon.c
+++ b/daemon.c
@@ -17,6 +17,8 @@
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <grp.h>
+#include <pwd.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -35,9 +37,6 @@
 #define ETCDIR "/usr/local/etc"
 #endif
 
-int restartInterval = 1000;
-struct Set256 stopExits;
-
 static void parseExits(char *list) {
 	setClear(&stopExits);
 	while (*list) {
@@ -52,15 +51,6 @@ static void parseExits(char *list) {
 
 int main(int argc, char *argv[]) {
 	bool daemonize = true;
-
-	const char *pidPath = NULL;
-	const char *configPath = ETCDIR "/spawntab";
-	const char *fifoPath = RUNDIR "/spawnd.pipe";
-
-	const char *chdirPath = "/";
-	const char *user = NULL;
-	const char *group = NULL;
-
 	setAdd(&stopExits, 127);
 	setAdd(&stopExits, EX_USAGE);
 	setAdd(&stopExits, EX_DATAERR);
@@ -69,9 +59,16 @@ int main(int argc, char *argv[]) {
 	setAdd(&stopExits, EX_CANTCREAT);
 	setAdd(&stopExits, EX_CONFIG);
 
+	const char *pidPath = NULL;
+	const char *configPath = ETCDIR "/spawntab";
+	const char *fifoPath = RUNDIR "/spawnd.pipe";
+
+	const char *user = NULL;
+	const char *group = NULL;
+
 	for (int opt; 0 < (opt = getopt(argc, argv, "C:c:df:g:p:s:t:u:"));) {
 		switch (opt) {
-			break; case 'C': chdirPath = optarg;
+			break; case 'C': serviceDir = optarg;
 			break; case 'c': fifoPath = optarg;
 			break; case 'd': daemonize = false;
 			break; case 'f': configPath = optarg;
@@ -84,6 +81,21 @@ int main(int argc, char *argv[]) {
 		}
 	}
 
+	// TODO: Read config file.
+	
+	int error = access(serviceDir, X_OK);
+	if (error) err(EX_NOINPUT, "%s", serviceDir);
+
+	errno = 0;
+	serviceUser = (user ? getpwnam(user) : getpwuid(getuid()));
+	if (errno) err(EX_OSFILE, "getpwnam");
+	if (!serviceUser) errx(EX_USAGE, "no such user %s", user);
+
+	errno = 0;
+	serviceGroup = (group ? getgrnam(group) : getgrgid(serviceUser->pw_gid));
+	if (errno) err(EX_OSFILE, "getgrnam");
+	if (!serviceGroup) errx(EX_USAGE, "no such group %s", group);
+
 	int pidFile = -1;
 	if (pidPath) {
 		pidFile = open(
@@ -92,13 +104,6 @@ int main(int argc, char *argv[]) {
 		if (pidFile < 0) err(EX_CANTCREAT, "%s", pidPath);
 	}
 
-	// TODO: Read config file.
-	
-	int error = access(chdirPath, X_OK);
-	if (error) err(EX_NOINPUT, "%s", chdirPath);
-
-	// TODO: Do user, group lookup.
-
 	// We can't lock a named pipe, so just warn if it already exists.
 	error = mkfifo(fifoPath, 0600);
 	if (error) {