From 6817d92533b7d9d98fb494792fa5dc71b420dc67 Mon Sep 17 00:00:00 2001 From: arunmu Date: Thu, 17 Mar 2016 11:38:40 +0530 Subject: [PATCH] Added check_output API --- main | Bin 107308 -> 128996 bytes main.cc | 7 +++++ subprocess.hpp | 81 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/main b/main index 7cd76b9ce5bc5e23a030820aca50d10f65cd8524..7eb0e19de4e9fd1407bb7159bcfef741f81220af 100755 GIT binary patch delta 43487 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 delta 23936 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 diff --git a/main.cc b/main.cc index e80c13d..a94c260 100755 --- a/main.cc +++ b/main.cc @@ -5,5 +5,12 @@ using namespace subprocess; int main() { auto p = Popen({"./script.sh"}, output{"out.txt"}); + + auto buf = check_output({"echo", "\"It works!\""}); + std::cout << buf.buf.data() << " :: " << buf.length << std::endl; + + auto buf2 = check_output("cat subprocess.hpp"); + std::cout << buf2.buf.data() << " :: " << buf2.length << std::endl; + return 0; } diff --git a/subprocess.hpp b/subprocess.hpp index 51e2138..297834e 100755 --- a/subprocess.hpp +++ b/subprocess.hpp @@ -50,6 +50,7 @@ public: namespace util { + static std::vector split(const std::string& str, const std::string& delims=" \t") { @@ -291,6 +292,31 @@ class Popen; namespace detail { +// Type trait for searching a type within +// a variadic parameter pack + +template struct param_pack{}; + +template struct has_type; + +template +struct has_type> { + static constexpr bool value = false; +}; + +template +struct has_type> { + static constexpr bool value = true; +}; + +template +struct has_type> { + static constexpr bool value = + std::is_same::type>::value ? true : has_type>::value; +}; + +//---- + struct ArgumentDeducer { ArgumentDeducer(Popen* p): popen_(p) {} @@ -478,7 +504,7 @@ public: int retcode() const noexcept { return retcode_; } - bool wait() throw(OSError); + int wait() throw(OSError); int poll() throw(OSError); @@ -567,17 +593,19 @@ void Popen::start_process() throw (CalledProcessError, OSError) execute_process(); } -bool Popen::wait() throw (OSError) +int Popen::wait() throw (OSError) { int ret, status; std::tie(ret, status) = util::wait_for_child_exit(pid()); if (ret == -1) { if (errno != ECHILD) throw OSError("waitpid failed", errno); - return true; + return 0; } - if (!WIFEXITED(status)) return false; + if (WIFEXITED(status)) return WEXITSTATUS(status); + if (WIFSIGNALED(status)) return WTERMSIG(status); + else return 255; - return true; + return 0; } int Popen::poll() throw (OSError) @@ -606,10 +634,10 @@ int Popen::poll() throw (OSError) // status. if (errno == ECHILD) retcode_ = 0; else throw OSError("waitpid failed", errno); + } else { + retcode_ = ret; } - retcode_ = ret; - return retcode_; } @@ -879,8 +907,11 @@ namespace detail { if (rbytes == -1) { throw OSError("read to obuf failed", errno); } + + obuf.length = rbytes; // Close the output stream stream_->output_.reset(); + } else if (stream_->error()) { // Same screwness applies here as well ebuf.add_cap(err_buf_cap_); @@ -893,6 +924,8 @@ namespace detail { if (rbytes == -1) { throw OSError("read to ebuf failed", errno); } + + ebuf.length = rbytes; // Close the error stream stream_->error_.reset(); } @@ -961,6 +994,40 @@ namespace detail { // Convenience Functions // +// +namespace detail +{ + template + OutBuffer check_output_impl(F& farg, Args&&... args) + { + static_assert(!detail::has_type>::value, "output not allowed in args"); + auto p = Popen(farg, std::forward(args)..., output{PIPE}); + auto res = p.communicate(nullptr, 0); + auto retcode = p.poll(); + if (retcode) { + throw CalledProcessError("Command failed"); + } + return (res.first); + } +} + +template +int call(Args&&... args) +{ + return Popen(std::forward(args)...).wait(); +} + +template +OutBuffer check_output(std::initializer_list plist, Args&&... args) +{ + return detail::check_output_impl(plist, std::forward(args)...); +} + +template +OutBuffer check_output(const std::string& arg, Args&&... args) +{ + return detail::check_output_impl(arg, std::forward(args)...); +} };