Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
common
run_command.cpp
Go to the documentation of this file.
1
// Copyright (c) 2022-present 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
#include <
util/string.h
>
12
13
#ifdef ENABLE_EXTERNAL_SIGNER
14
#include <
util/subprocess.h
>
15
#endif
// ENABLE_EXTERNAL_SIGNER
16
17
UniValue
RunCommandParseJSON
(
const
std::vector<std::string>& cmd_args,
const
std::string& str_std_in)
18
{
19
#ifdef ENABLE_EXTERNAL_SIGNER
20
namespace
sp =
subprocess
;
21
22
UniValue
result_json;
23
std::istringstream stdout_stream;
24
std::istringstream stderr_stream;
25
26
if
(cmd_args.empty())
return
UniValue::VNULL
;
27
28
auto
c = sp::Popen(cmd_args, sp::input{sp::PIPE}, sp::output{sp::PIPE}, sp::error{sp::PIPE});
29
if
(!str_std_in.empty()) {
30
c.send(str_std_in);
31
}
32
auto
[out_res, err_res] = c.communicate();
33
stdout_stream.str(std::string{out_res.buf.begin(), out_res.buf.end()});
34
stderr_stream.str(std::string{err_res.buf.begin(), err_res.buf.end()});
35
36
std::string result;
37
std::string error;
38
std::getline(stdout_stream, result);
39
std::getline(stderr_stream, error);
40
41
const
int
n_error = c.retcode();
42
if
(n_error)
throw
std::runtime_error(
strprintf
(
"RunCommandParseJSON error: process(%s) returned %d: %s\n"
,
util::Join
(cmd_args,
" "
), n_error, error));
43
if
(!result_json.
read
(result))
throw
std::runtime_error(
"Unable to parse JSON: "
+ result);
44
45
return
result_json;
46
#else
47
throw
std::runtime_error(
"Compiled without external signing support (required for external signing)."
);
48
#endif
// ENABLE_EXTERNAL_SIGNER
49
}
UniValue
Definition
univalue.h:22
UniValue::VNULL
@ VNULL
Definition
univalue.h:24
UniValue::read
bool read(std::string_view raw)
Definition
univalue_read.cpp:262
subprocess
Definition
subprocess.h:115
util::Join
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition
string.h:205
RunCommandParseJSON
UniValue RunCommandParseJSON(const std::vector< std::string > &cmd_args, const std::string &str_std_in)
Execute a command which returns JSON, and parse the result.
Definition
run_command.cpp:17
run_command.h
string.h
subprocess.h
tinyformat.h
strprintf
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition
tinyformat.h:1172
univalue.h
Generated on
for Bitcoin Core by
1.17.0