diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2019-09-13 20:57:00 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2019-09-27 17:08:05 +0300 |
commit | 3fa1b103014bab51f8f257e1e12f27f7e498f42e (patch) | |
tree | 4958c20dead025ffa0305dd0c99041382bda16a8 /libbutl | |
parent | c4292d57e2e67dfcdac9004f8edb229976f6669a (diff) |
Add support for builtin escaping to command running API
Diffstat (limited to 'libbutl')
-rw-r--r-- | libbutl/command.cxx | 12 | ||||
-rw-r--r-- | libbutl/command.mxx | 5 |
2 files changed, 16 insertions, 1 deletions
diff --git a/libbutl/command.cxx b/libbutl/command.cxx index a344790..1126bb0 100644 --- a/libbutl/command.cxx +++ b/libbutl/command.cxx @@ -272,11 +272,21 @@ namespace butl } else // Execute the program. { + // Strip the potential leading `^`, indicating that this is an external + // program rather than a builtin. Consider only simple paths and don't + // end up with an empty path. + // + const char* p (prog.size () > 1 && + prog[0] == '^' && + path::traits_type::find_separator (prog) == string::npos + ? prog.c_str () + 1 + : prog.c_str ()); + // Prepare the process environment. // // Note: cwd passed to process_env() may not be a temporary object. // - process_env pe (prog, cwd, env ? env->vars : nullptr); + process_env pe (p, cwd, env ? env->vars : nullptr); // Finally, run the process. // diff --git a/libbutl/command.mxx b/libbutl/command.mxx index 0e6617b..8423f59 100644 --- a/libbutl/command.mxx +++ b/libbutl/command.mxx @@ -37,6 +37,11 @@ LIBBUTL_MODEXPORT namespace butl // error, ios::failure on the underlying OS error, process_error on the // process running error and std::system_error on the builtin running error. // + // To run a system utility rather than a builtin prefix its name with `^`, + // for example: + // + // ^cat --squeeze-blank file + // // The process environment path is unused and must point to the empty // process path. // |