diff options
Diffstat (limited to 'src/common/Utilities/StartProcess.cpp')
-rw-r--r-- | src/common/Utilities/StartProcess.cpp | 79 |
1 files changed, 42 insertions, 37 deletions
diff --git a/src/common/Utilities/StartProcess.cpp b/src/common/Utilities/StartProcess.cpp index 160c6743a00..4714cd37f08 100644 --- a/src/common/Utilities/StartProcess.cpp +++ b/src/common/Utilities/StartProcess.cpp @@ -22,10 +22,15 @@ #include <boost/algorithm/string/join.hpp> #include <boost/iostreams/copy.hpp> -#include <boost/process.hpp> +#include <boost/process/args.hpp> +#include <boost/process/child.hpp> +#include <boost/process/env.hpp> +#include <boost/process/exe.hpp> +#include <boost/process/io.hpp> +#include <boost/process/pipe.hpp> +#include <boost/process/search_path.hpp> using namespace boost::process; -using namespace boost::process::initializers; using namespace boost::iostreams; namespace Trinity @@ -46,7 +51,10 @@ public: std::streamsize write(char const* str, std::streamsize size) { - callback_(std::string(str, size)); + std::string consoleStr(str, size); + std::string utf8; + if (consoleToUtf8(consoleStr, utf8)) + callback_(utf8); return size; } }; @@ -60,62 +68,60 @@ auto MakeTCLogSink(T&& callback) template<typename T> static int CreateChildProcess(T waiter, std::string const& executable, - std::vector<std::string> const& args, + std::vector<std::string> const& argsVector, std::string const& logger, std::string const& input, bool secure) { - auto outPipe = create_pipe(); - auto errPipe = create_pipe(); - - Optional<file_descriptor_source> inputSource; + ipstream outStream; + ipstream errStream; if (!secure) { TC_LOG_TRACE(logger, "Starting process \"%s\" with arguments: \"%s\".", - executable.c_str(), boost::algorithm::join(args, " ").c_str()); + executable.c_str(), boost::algorithm::join(argsVector, " ").c_str()); } // Start the child process - child c = [&] + child c = [&]() { if (!input.empty()) { - inputSource = file_descriptor_source(input); - // With binding stdin - return execute(run_exe(boost::filesystem::absolute(executable)), - set_args(args), - inherit_env(), - bind_stdin(*inputSource), - bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)), - bind_stderr(file_descriptor_sink(errPipe.sink, close_handle))); + return child{ + exe = boost::filesystem::absolute(executable).string(), + args = argsVector, + env = environment(boost::this_process::environment()), + std_in = input, + std_out = outStream, + std_err = errStream + }; } else { // Without binding stdin - return execute(run_exe(boost::filesystem::absolute(executable)), - set_args(args), - inherit_env(), - bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)), - bind_stderr(file_descriptor_sink(errPipe.sink, close_handle))); + return child{ + exe = boost::filesystem::absolute(executable).string(), + args = argsVector, + env = environment(boost::this_process::environment()), + std_in = boost::process::close, + std_out = outStream, + std_err = errStream + }; } }(); - file_descriptor_source outFd(outPipe.source, close_handle); - file_descriptor_source errFd(errPipe.source, close_handle); - - auto outInfo = MakeTCLogSink([&](std::string msg) + auto outInfo = MakeTCLogSink([&](std::string const& msg) { TC_LOG_INFO(logger, "%s", msg.c_str()); }); - auto outError = MakeTCLogSink([&](std::string msg) + auto outError = MakeTCLogSink([&](std::string const& msg) { TC_LOG_ERROR(logger, "%s", msg.c_str()); }); - copy(outFd, outInfo); - copy(errFd, outError); + copy(outStream, outInfo); + copy(errStream, outError); // Call the waiter in the current scope to prevent // the streams from closing too early on leaving the scope. @@ -127,9 +133,6 @@ static int CreateChildProcess(T waiter, std::string const& executable, executable.c_str(), result); } - if (inputSource) - inputSource->close(); - return result; } @@ -140,7 +143,8 @@ int StartProcess(std::string const& executable, std::vector<std::string> const& { try { - return wait_for_exit(c); + c.wait(); + return c.exit_code(); } catch (...) { @@ -188,7 +192,8 @@ public: try { - result = wait_for_exit(c); + c.wait(); + result = c.exit_code(); } catch (...) { @@ -222,7 +227,7 @@ public: was_terminated = true; try { - terminate(my_child->get()); + my_child->get().terminate(); } catch(...) { @@ -247,7 +252,7 @@ std::string SearchExecutableInPath(std::string const& filename) { try { - return search_path(filename); + return search_path(filename).string(); } catch (...) { |