summaryrefslogtreecommitdiff
path: root/src/shell_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-09-09 17:10:53 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-09-09 17:10:53 +0200
commitae76b7dddc2973b809109329aabf15fdd676b7d6 (patch)
tree0ad185f833f8efaa8a0c72b75248a9e8882b9863 /src/shell_manager.cc
parent46565723b1f146af461f93dd45a9c25d43ac553d (diff)
Add support for shell script parameters
Now %sh{ ... } can access positional parameters through standard shell construct, allowing simple handling of variable parameters. def command accepts -shell-params flag to use this facility.
Diffstat (limited to 'src/shell_manager.cc')
-rw-r--r--src/shell_manager.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/shell_manager.cc b/src/shell_manager.cc
index cb6e94c7..f35b3ddc 100644
--- a/src/shell_manager.cc
+++ b/src/shell_manager.cc
@@ -16,13 +16,15 @@ ShellManager::ShellManager()
}
String ShellManager::eval(const String& cmdline, const Context& context,
+ const memoryview<String>& params,
const EnvVarMap& env_vars)
{
- return pipe("", cmdline, context, env_vars);
+ return pipe("", cmdline, context, params, env_vars);
}
String ShellManager::pipe(const String& input,
const String& cmdline, const Context& context,
+ const memoryview<String>& params,
const EnvVarMap& env_vars)
{
int write_pipe[2]; // child stdin
@@ -114,8 +116,14 @@ String ShellManager::pipe(const String& input,
++it;
}
-
- execlp("sh", "sh", "-c", cmdline.c_str(), NULL);
+ std::vector<const char*> execparams = { "sh", "-c", cmdline.c_str() };
+ if (not params.empty())
+ execparams.push_back("sh");
+ for (auto& param : params)
+ execparams.push_back(param.c_str());
+ execparams.push_back(NULL);
+
+ execvp("sh", (char* const*)execparams.data());
exit(-1);
}
catch (...) { exit(-1); }