diff --git a/src/exec.c b/src/exec.c index fe712135..be9c3250 100644 --- a/src/exec.c +++ b/src/exec.c @@ -213,6 +213,27 @@ int run_interactive(char *cmd, char *fmt, ...) return status; } +int exec_runtask(char *cmd, char *args[]) +{ + size_t i; + char buf[1024] = ""; + char *argv[4] = { + "sh", + "-c", + buf, + NULL + }; + + for (i = 0; args[i]; i++) { + strlcat(buf, args[i], sizeof(buf)); + if (args[i + 1]) + strlcat(buf, " ", sizeof(buf)); + } + logit(LOG_DEBUG, "Calling %s %s", _PATH_BSHELL, buf); + + return execve(_PATH_BSHELL, argv, __environ); +} + static void prepare_tty(char *tty, char *procname, int console) { /* Reset signal handlers that were set by the parent process */ diff --git a/src/helpers.h b/src/helpers.h index c59c1ed5..b63294eb 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -63,6 +63,7 @@ void set_hostname (char **hostname); int complete (char *cmd, int pid); int run (char *cmd); int run_interactive (char *cmd, char *fmt, ...); +int exec_runtask (char *cmd, char *args[]); pid_t run_getty (char *tty, char *speed, char *term, int noclear, int nowait, int console); pid_t run_getty2 (char *tty, char *cmd, char *args[], int noclear, int nowait, int console); int run_parts (char *dir, char *cmd); diff --git a/src/service.c b/src/service.c index fa546e01..673eb9ed 100644 --- a/src/service.c +++ b/src/service.c @@ -270,8 +270,10 @@ static int service_start(svc_t *svc) if (svc->inetd.cmd) status = svc->inetd.cmd(svc->inetd.type); + else if (svc->type & SVC_TYPE_RUNTASK) + status = exec_runtask(svc->cmd, args); else - status = execv(svc->cmd, args); /* XXX: Maybe use execve() to be able to launch scripts? */ + status = execv(svc->cmd, args); #ifdef INETD_ENABLED if (svc_is_inetd_conn(svc)) { diff --git a/src/svc.h b/src/svc.h index cd78ccad..ec620350 100644 --- a/src/svc.h +++ b/src/svc.h @@ -45,6 +45,7 @@ typedef enum { } svc_type_t; #define SVC_TYPE_ANY (-1) +#define SVC_TYPE_RUNTASK (6) typedef enum { SVC_HALTED_STATE = 0, /* Not allowed in runlevel, or not enabled. */