diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-09-09 17:10:53 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-09-09 17:10:53 +0200 |
| commit | ae76b7dddc2973b809109329aabf15fdd676b7d6 (patch) | |
| tree | 0ad185f833f8efaa8a0c72b75248a9e8882b9863 /src/shell_manager.cc | |
| parent | 46565723b1f146af461f93dd45a9c25d43ac553d (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.cc | 14 |
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); } |
