From 3b38cfdbfef86966095f19d98f937e41ecc3cc83 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 14 Aug 2020 12:52:51 -0400 Subject: Implement user and group lookup --- daemon.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'daemon.c') diff --git a/daemon.c b/daemon.c index 36d5986..0b07bb9 100644 --- a/daemon.c +++ b/daemon.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -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) { -- cgit 1.4.1