From 684314db0f9f5d17a3f212b01383b6be7fca89b7 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Mon, 4 Sep 2017 15:56:25 +0200 Subject: [PATCH] Allow pipe + redirect in task/run stanzas, exec() in /bin/sh This patch extends the capabilities of task and run .conf stanzas by enabling pipes and redirects. Example: task [s] echo "foo" | cat >/tmp/bar run [s] echo "$HOME" >/tmp/secret Signed-off-by: Joachim Nilsson --- src/exec.c | 21 +++++++++++++++++++++ src/helpers.h | 1 + src/service.c | 4 +++- src/svc.h | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) 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. */