From 1f5001c581a6b4d13f2d930f228f75b9bafedb50 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Thu, 14 Nov 2019 19:22:09 +0300 Subject: HackStudio: Do not spawn an intermediary shell The Shell also puts each command into its own process group, which interferes with us trying to do the same here. We don't really need the shell here anyway, but it means we'll have to do command splitting ourselves. --- DevTools/HackStudio/TerminalWrapper.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'DevTools') diff --git a/DevTools/HackStudio/TerminalWrapper.cpp b/DevTools/HackStudio/TerminalWrapper.cpp index 52ae3665ac..001a470a2a 100644 --- a/DevTools/HackStudio/TerminalWrapper.cpp +++ b/DevTools/HackStudio/TerminalWrapper.cpp @@ -103,13 +103,17 @@ void TerminalWrapper::run_command(const String& command) perror("ioctl(TIOCSCTTY)"); exit(1); } - const char* args[4] = { "/bin/Shell", nullptr, nullptr, nullptr }; - if (!command.is_empty()) { - args[1] = "-c"; - args[2] = command.characters(); + + setenv("TERM", "xterm", true); + setenv("PATH", "/bin:/usr/bin:/usr/local/bin", true); + + auto parts = command.split(' '); + ASSERT(!parts.is_empty()); + const char** args = (const char**) calloc(parts.size() + 1, sizeof(const char*)); + for (int i = 0; i < parts.size(); i++) { + args[i] = parts[i].characters(); } - const char* envs[] = { "TERM=xterm", "PATH=/bin:/usr/bin:/usr/local/bin", nullptr }; - rc = execve("/bin/Shell", const_cast(args), const_cast(envs)); + rc = execvp(args[0], const_cast(args)); if (rc < 0) { perror("execve"); exit(1); -- cgit v1.2.3