bcli: refactor wait_and_check_bitcoind and run_bitcoin_cli to use shared execution

Extract `execute_bitcoin_cli` as shared function used by both `run_bitcoin_cli` and `wait_and_check_bitcoind`.
This commit is contained in:
dovgopoly
2026-01-17 20:54:33 +02:00
committed by Sangbida
parent d727946b14
commit 4126f3b1fe

View File

@@ -148,23 +148,18 @@ static char *args_string(const tal_t *ctx, const char **args, const char **stdin
return ret;
}
/* Synchronous execution of bitcoin-cli.
/* Execute bitcoin-cli with pre-built command and optional stdin args.
* Returns result with output and exit status. */
static struct bcli_result *
run_bitcoin_cliv(const tal_t *ctx,
struct plugin *plugin,
const char *method,
va_list ap)
execute_bitcoin_cli(const tal_t *ctx,
struct plugin *plugin,
const char **cmd,
const char **stdinargs)
{
int in, from, status;
pid_t child;
const char **stdinargs;
const char **cmd;
struct bcli_result *res;
stdinargs = tal_arr(ctx, const char *, 0);
cmd = gather_argsv(ctx, &stdinargs, method, ap);
child = pipecmdarr(&in, &from, &from, cast_const2(char **, cmd));
if (child < 0)
plugin_err(plugin, "%s exec failed: %s", cmd[0], strerror(errno));
@@ -175,9 +170,11 @@ run_bitcoin_cliv(const tal_t *ctx,
write_all(in, "\n", 1);
}
/* Send any additional stdin args */
for (size_t i = 0; i < tal_count(stdinargs); i++) {
write_all(in, stdinargs[i], strlen(stdinargs[i]));
write_all(in, "\n", 1);
if (stdinargs) {
for (size_t i = 0; i < tal_count(stdinargs); i++) {
write_all(in, stdinargs[i], strlen(stdinargs[i]));
write_all(in, "\n", 1);
}
}
close(in);
@@ -205,6 +202,23 @@ run_bitcoin_cliv(const tal_t *ctx,
return res;
}
/* Synchronous execution of bitcoin-cli.
* Returns result with output and exit status. */
static struct bcli_result *
run_bitcoin_cliv(const tal_t *ctx,
struct plugin *plugin,
const char *method,
va_list ap)
{
const char **stdinargs;
const char **cmd;
stdinargs = tal_arr(ctx, const char *, 0);
cmd = gather_argsv(ctx, &stdinargs, method, ap);
return execute_bitcoin_cli(ctx, plugin, cmd, stdinargs);
}
static LAST_ARG_NULL struct bcli_result *
run_bitcoin_cli(const tal_t *ctx,
struct plugin *plugin,
@@ -757,51 +771,28 @@ static void parse_getnetworkinfo_result(struct plugin *p, const char *buf)
static void wait_and_check_bitcoind(struct plugin *p)
{
int in, from, status;
pid_t child;
const char **cmd = gather_args(
bitcoind, NULL, "-rpcwait", "-rpcwaittimeout=30", "getnetworkinfo", NULL);
char *output = NULL;
struct bcli_result *res;
const char **cmd;
child = pipecmdarr(&in, &from, &from, cast_const2(char **, cmd));
/* Special case: -rpcwait flags go on command line, not stdin */
cmd = gather_args(bitcoind, NULL, "-rpcwait", "-rpcwaittimeout=30",
"getnetworkinfo", NULL);
res = execute_bitcoin_cli(bitcoind, p, cmd, NULL);
if (bitcoind->rpcpass)
write_all(in, bitcoind->rpcpass, strlen(bitcoind->rpcpass));
close(in);
if (child < 0) {
if (errno == ENOENT)
bitcoind_failure(
p,
"bitcoin-cli not found. Is bitcoin-cli "
"(part of Bitcoin Core) available in your PATH?");
plugin_err(p, "%s exec failed: %s", cmd[0], strerror(errno));
}
output = grab_fd_str(cmd, from);
close(from);
waitpid(child, &status, 0);
if (!WIFEXITED(status))
bitcoind_failure(p, tal_fmt(bitcoind, "Death of %s: signal %i",
cmd[0], WTERMSIG(status)));
if (WEXITSTATUS(status) != 0) {
if (WEXITSTATUS(status) == 1)
bitcoind_failure(p,
"RPC connection timed out. Could "
"not connect to bitcoind using "
"bitcoin-cli. Is bitcoind running?");
if (res->exitstatus == 1)
bitcoind_failure(p,
"RPC connection timed out. Could "
"not connect to bitcoind using "
"bitcoin-cli. Is bitcoind running?");
if (res->exitstatus != 0)
bitcoind_failure(p,
tal_fmt(bitcoind, "%s exited with code %i: %s",
cmd[0], WEXITSTATUS(status), output));
}
res->args, res->exitstatus, res->output));
parse_getnetworkinfo_result(p, output);
parse_getnetworkinfo_result(p, res->output);
tal_free(cmd);
tal_free(res);
}
static void memleak_mark_bitcoind(struct plugin *p, struct htable *memtable)