/Users/eugenesiegel/btc/bitcoin/src/common/run_command.cpp
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2022 The Bitcoin Core developers | 
| 2 |  | // Distributed under the MIT software license, see the accompanying | 
| 3 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 4 |  |  | 
| 5 |  | #include <bitcoin-build-config.h> // IWYU pragma: keep | 
| 6 |  |  | 
| 7 |  | #include <common/run_command.h> | 
| 8 |  |  | 
| 9 |  | #include <tinyformat.h> | 
| 10 |  | #include <univalue.h> | 
| 11 |  |  | 
| 12 |  | #ifdef ENABLE_EXTERNAL_SIGNER | 
| 13 |  | #include <util/subprocess.h> | 
| 14 |  | #endif // ENABLE_EXTERNAL_SIGNER | 
| 15 |  |  | 
| 16 |  | UniValue RunCommandParseJSON(const std::string& str_command, const std::string& str_std_in) | 
| 17 | 0 | { | 
| 18 |  | #ifdef ENABLE_EXTERNAL_SIGNER | 
| 19 |  |     namespace sp = subprocess; | 
| 20 |  |  | 
| 21 |  |     UniValue result_json; | 
| 22 |  |     std::istringstream stdout_stream; | 
| 23 |  |     std::istringstream stderr_stream; | 
| 24 |  |  | 
| 25 |  |     if (str_command.empty()) return UniValue::VNULL; | 
| 26 |  |  | 
| 27 |  |     auto c = sp::Popen(str_command, sp::input{sp::PIPE}, sp::output{sp::PIPE}, sp::error{sp::PIPE}); | 
| 28 |  |     if (!str_std_in.empty()) { | 
| 29 |  |         c.send(str_std_in); | 
| 30 |  |     } | 
| 31 |  |     auto [out_res, err_res] = c.communicate(); | 
| 32 |  |     stdout_stream.str(std::string{out_res.buf.begin(), out_res.buf.end()}); | 
| 33 |  |     stderr_stream.str(std::string{err_res.buf.begin(), err_res.buf.end()}); | 
| 34 |  |  | 
| 35 |  |     std::string result; | 
| 36 |  |     std::string error; | 
| 37 |  |     std::getline(stdout_stream, result); | 
| 38 |  |     std::getline(stderr_stream, error); | 
| 39 |  |  | 
| 40 |  |     const int n_error = c.retcode(); | 
| 41 |  |     if (n_error) throw std::runtime_error(strprintf("RunCommandParseJSON error: process(%s) returned %d: %s\n", str_command, n_error, error)); | 
| 42 |  |     if (!result_json.read(result)) throw std::runtime_error("Unable to parse JSON: " + result); | 
| 43 |  |  | 
| 44 |  |     return result_json; | 
| 45 |  | #else | 
| 46 | 0 |     throw std::runtime_error("Compiled without external signing support (required for external signing)."); | 
| 47 | 0 | #endif // ENABLE_EXTERNAL_SIGNER | 
| 48 | 0 | } |