diff options
author | C. McEnroe | 2020-02-13 22:22:11 -0500 |
---|---|---|
committer | C. McEnroe | 2020-02-13 22:22:11 -0500 |
commit | 46f61dfcdc4f2cc3f20d7e53c6ca4d339aa54666 (patch) | |
tree | 50fee0c8b85f2db30fe1c94503da0dac885666b5 /command.c | |
parent | 4405b89f6c67937507b3bdc2faa48c75f308bf74 (diff) |
Add /exec
Diffstat (limited to 'command.c')
-rw-r--r-- | command.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/command.c b/command.c index ffbea9f..e0a2e2b 100644 --- a/command.c +++ b/command.c @@ -195,6 +195,24 @@ static void commandCopy(size_t id, char *params) { urlCopyMatch(id, params); } +static void commandExec(size_t id, char *params) { + execID = id; + + pid_t pid = fork(); + if (pid < 0) err(EX_OSERR, "fork"); + if (pid) return; + + const char *shell = getenv("SHELL"); + if (!shell) shell = "/bin/sh"; + + close(STDIN_FILENO); + dup2(execPipe[1], STDOUT_FILENO); + dup2(utilPipe[1], STDERR_FILENO); + execlp(shell, shell, "-c", params, NULL); + warn("%s", shell); + _exit(EX_UNAVAILABLE); +} + static void commandHelp(size_t id, char *params) { (void)id; uiHide(); @@ -220,6 +238,7 @@ static const struct Handler { { "/close", .fn = commandClose }, { "/copy", .fn = commandCopy, .restricted = true }, { "/debug", .fn = commandDebug, .restricted = true }, + { "/exec", .fn = commandExec, .restricted = true }, { "/help", .fn = commandHelp }, { "/join", .fn = commandJoin, .restricted = true }, { "/list", .fn = commandList }, |