Build environment for services
This commit is contained in:
parent
e0dab12078
commit
96e962a08c
31
daemon.c
31
daemon.c
@ -134,8 +134,8 @@ int main(int argc, char *argv[]) {
|
|||||||
const char *configPath = ETCDIR "/spawntab";
|
const char *configPath = ETCDIR "/spawntab";
|
||||||
const char *fifoPath = RUNDIR "/spawnd.pipe";
|
const char *fifoPath = RUNDIR "/spawnd.pipe";
|
||||||
|
|
||||||
const char *user = NULL;
|
const char *userName = NULL;
|
||||||
const char *group = NULL;
|
const char *groupName = NULL;
|
||||||
|
|
||||||
for (int opt; 0 < (opt = getopt(argc, argv, "C:c:df:g:p:s:t:u:"));) {
|
for (int opt; 0 < (opt = getopt(argc, argv, "C:c:df:g:p:s:t:u:"));) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
@ -143,29 +143,42 @@ int main(int argc, char *argv[]) {
|
|||||||
break; case 'c': fifoPath = optarg;
|
break; case 'c': fifoPath = optarg;
|
||||||
break; case 'd': daemonize = false;
|
break; case 'd': daemonize = false;
|
||||||
break; case 'f': configPath = optarg;
|
break; case 'f': configPath = optarg;
|
||||||
break; case 'g': group = optarg;
|
break; case 'g': groupName = optarg;
|
||||||
break; case 'p': pidPath = optarg;
|
break; case 'p': pidPath = optarg;
|
||||||
break; case 's': parseExits(optarg);
|
break; case 's': parseExits(optarg);
|
||||||
break; case 't': restartInterval = strtoul(optarg, NULL, 10);
|
break; case 't': restartInterval = strtoul(optarg, NULL, 10);
|
||||||
break; case 'u': user = optarg;
|
break; case 'u': userName = optarg;
|
||||||
break; default: return EX_USAGE;
|
break; default: return EX_USAGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
parseConfig(true, configPath);
|
parseConfig(true, configPath);
|
||||||
|
|
||||||
int error = access(serviceDir, X_OK);
|
int error = access(serviceDir, X_OK);
|
||||||
if (error) err(EX_NOINPUT, "%s", serviceDir);
|
if (error) err(EX_NOINPUT, "%s", serviceDir);
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
serviceUser = (user ? getpwnam(user) : getpwuid(getuid()));
|
struct passwd *user = (userName ? getpwnam(userName) : getpwuid(getuid()));
|
||||||
if (errno) err(EX_OSFILE, "getpwnam");
|
if (errno) err(EX_OSFILE, "getpwnam");
|
||||||
if (!serviceUser) errx(EX_USAGE, "no such user %s", user);
|
if (!user) errx(EX_USAGE, "no such user %s", userName);
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
serviceGroup = (group ? getgrnam(group) : getgrgid(serviceUser->pw_gid));
|
struct group *group = (
|
||||||
|
groupName ? getgrnam(groupName) : getgrgid(user->pw_gid)
|
||||||
|
);
|
||||||
if (errno) err(EX_OSFILE, "getgrnam");
|
if (errno) err(EX_OSFILE, "getgrnam");
|
||||||
if (!serviceGroup) errx(EX_USAGE, "no such group %s", group);
|
if (!group) errx(EX_USAGE, "no such group %s", groupName);
|
||||||
|
|
||||||
|
serviceUID = user->pw_uid;
|
||||||
|
serviceGID = group->gr_gid;
|
||||||
|
|
||||||
|
int len = asprintf(&serviceEnviron[LOGNAME], "LOGNAME=%s", user->pw_name);
|
||||||
|
if (len < 0) err(EX_OSERR, "asprintf");
|
||||||
|
|
||||||
|
len = asprintf(&serviceEnviron[USER], "USER=%s", user->pw_name);
|
||||||
|
if (len < 0) err(EX_OSERR, "asprintf");
|
||||||
|
|
||||||
|
len = asprintf(&serviceEnviron[HOME], "HOME=%s", user->pw_dir);
|
||||||
|
if (len < 0) err(EX_OSERR, "asprintf");
|
||||||
|
|
||||||
int pidFile = -1;
|
int pidFile = -1;
|
||||||
if (pidPath) {
|
if (pidPath) {
|
||||||
|
16
daemon.h
16
daemon.h
@ -19,6 +19,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
|
|
||||||
@ -47,9 +48,20 @@ static inline int prependAdd(const char *command) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SHELL,
|
||||||
|
PATH,
|
||||||
|
LOGNAME,
|
||||||
|
USER,
|
||||||
|
HOME,
|
||||||
|
EnvironNull,
|
||||||
|
EnvironLen,
|
||||||
|
};
|
||||||
|
|
||||||
extern const char *serviceDir;
|
extern const char *serviceDir;
|
||||||
extern struct passwd *serviceUser;
|
extern uid_t serviceUID;
|
||||||
extern struct group *serviceGroup;
|
extern gid_t serviceGID;
|
||||||
|
extern char *serviceEnviron[EnvironLen];
|
||||||
|
|
||||||
struct Service {
|
struct Service {
|
||||||
char *name;
|
char *name;
|
||||||
|
12
service.c
12
service.c
@ -14,17 +14,21 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grp.h>
|
#include <paths.h>
|
||||||
#include <pwd.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "daemon.h"
|
#include "daemon.h"
|
||||||
|
|
||||||
const char *serviceDir = "/";
|
const char *serviceDir = "/";
|
||||||
struct passwd *serviceUser;
|
uid_t serviceUID;
|
||||||
struct group *serviceGroup;
|
gid_t serviceGID;
|
||||||
|
char *serviceEnviron[EnvironLen] = {
|
||||||
|
[SHELL] = "SHELL=" _PATH_BSHELL,
|
||||||
|
[PATH] = "PATH=" _PATH_DEFPATH,
|
||||||
|
};
|
||||||
|
|
||||||
struct Prepend prepend;
|
struct Prepend prepend;
|
||||||
struct Services services;
|
struct Services services;
|
||||||
|
Loading…
Reference in New Issue
Block a user