lightningd: have json_stream_success start the "result" object.

"result" should always be an object (so that we can add new fields),
so make that implicit in json_stream_success.

This makes our primitives well-formed: we previously used NULL as our
fieldname when calling the first json_object_start, which is a hack
since we're actually in an object and the fieldname is 'result' (which
was already written by json_object_start).

There were only two cases which didn't do this:
1. dev-memdump returned an array.  No API guarantees on this.
2. shutdown returned a string.

I temporarily made shutdown return an empty object, which shouldn't
break anything, but I want to fix that later anyway.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2019-06-12 10:08:54 +09:30
parent 0e336ac252
commit bb7bbd03c5
17 changed files with 31 additions and 124 deletions

View File

@@ -143,7 +143,7 @@ static void broadcast_remainder(struct bitcoind *bitcoind,
if (txs->cursor == tal_count(txs->txs)) { if (txs->cursor == tal_count(txs->txs)) {
if (txs->cmd) if (txs->cmd)
was_pending(command_success(txs->cmd, was_pending(command_success(txs->cmd,
null_response(txs->cmd))); json_stream_success(txs->cmd)));
tal_free(txs); tal_free(txs);
return; return;
} }
@@ -491,7 +491,6 @@ static struct command_result *json_feerates(struct command *cmd,
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_object_start(response, json_feerate_style_name(*style)); json_object_start(response, json_feerate_style_name(*style));
for (size_t i = 0; i < ARRAY_SIZE(feerates); i++) { for (size_t i = 0; i < ARRAY_SIZE(feerates); i++) {
if (!feerates[i]) if (!feerates[i])
@@ -522,8 +521,6 @@ static struct command_result *json_feerates(struct command *cmd,
json_object_end(response); json_object_end(response);
} }
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -70,9 +70,7 @@ static struct command_result *connect_cmd_succeed(struct command *cmd,
const struct node_id *id) const struct node_id *id)
{ {
struct json_stream *response = json_stream_success(cmd); struct json_stream *response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_node_id(response, "id", id); json_add_node_id(response, "id", id);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -198,7 +198,6 @@ static void json_getnodes_reply(struct subd *gossip UNUSED, const u8 *reply,
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "nodes"); json_array_start(response, "nodes");
for (i = 0; i < tal_count(nodes); i++) { for (i = 0; i < tal_count(nodes); i++) {
@@ -229,7 +228,6 @@ static void json_getnodes_reply(struct subd *gossip UNUSED, const u8 *reply,
json_object_end(response); json_object_end(response);
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
} }
@@ -274,9 +272,7 @@ static void json_getroute_reply(struct subd *gossip UNUSED, const u8 *reply, con
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_route(response, "route", hops, tal_count(hops)); json_add_route(response, "route", hops, tal_count(hops));
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
} }
@@ -436,7 +432,6 @@ static void json_listchannels_reply(struct subd *gossip UNUSED, const u8 *reply,
req, -1, 0, json_listchannels_reply, linfo); req, -1, 0, json_listchannels_reply, linfo);
} else { } else {
json_array_end(linfo->response); json_array_end(linfo->response);
json_object_end(linfo->response);
was_pending(command_success(linfo->cmd, linfo->response)); was_pending(command_success(linfo->cmd, linfo->response));
} }
} }
@@ -462,7 +457,6 @@ static struct command_result *json_listchannels(struct command *cmd,
/* Start JSON response, then we stream. */ /* Start JSON response, then we stream. */
linfo->response = json_stream_success(cmd); linfo->response = json_stream_success(cmd);
json_object_start(linfo->response, NULL);
json_array_start(linfo->response, "channels"); json_array_start(linfo->response, "channels");
req = towire_gossip_getchannels_request(cmd, linfo->id, linfo->source, req = towire_gossip_getchannels_request(cmd, linfo->id, linfo->source,
@@ -501,9 +495,7 @@ static void json_scids_reply(struct subd *gossip UNUSED, const u8 *reply,
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_bool(response, "complete", complete); json_add_bool(response, "complete", complete);
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
} }
@@ -573,7 +565,7 @@ json_dev_send_timestamp_filter(struct command *cmd,
msg = towire_gossip_send_timestamp_filter(NULL, id, *first, *range); msg = towire_gossip_send_timestamp_filter(NULL, id, *first, *range);
subd_send_msg(cmd->ld->gossip, take(msg)); subd_send_msg(cmd->ld->gossip, take(msg));
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command dev_send_timestamp_filter = { static const struct json_command dev_send_timestamp_filter = {
@@ -609,7 +601,6 @@ static void json_channel_range_reply(struct subd *gossip UNUSED, const u8 *reply
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
/* As this is a dev interface, we don't bother saving and /* As this is a dev interface, we don't bother saving and
* returning all the replies, just the final one. */ * returning all the replies, just the final one. */
json_add_num(response, "final_first_block", final_first_block); json_add_num(response, "final_first_block", final_first_block);
@@ -619,7 +610,6 @@ static void json_channel_range_reply(struct subd *gossip UNUSED, const u8 *reply
for (size_t i = 0; i < tal_count(scids); i++) for (size_t i = 0; i < tal_count(scids); i++)
json_add_short_channel_id(response, NULL, &scids[i]); json_add_short_channel_id(response, NULL, &scids[i]);
json_array_end(response); json_array_end(response);
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
} }
@@ -671,7 +661,7 @@ json_dev_set_max_scids_encode_size(struct command *cmd,
msg = towire_gossip_dev_set_max_scids_encode_size(NULL, *max); msg = towire_gossip_dev_set_max_scids_encode_size(NULL, *max);
subd_send_msg(cmd->ld->gossip, take(msg)); subd_send_msg(cmd->ld->gossip, take(msg));
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command dev_set_max_scids_encode_size = { static const struct json_command dev_set_max_scids_encode_size = {
@@ -692,7 +682,7 @@ static struct command_result *json_dev_suppress_gossip(struct command *cmd,
subd_send_msg(cmd->ld->gossip, take(towire_gossip_dev_suppress(NULL))); subd_send_msg(cmd->ld->gossip, take(towire_gossip_dev_suppress(NULL)));
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command dev_suppress_gossip = { static const struct json_command dev_suppress_gossip = {
@@ -720,7 +710,7 @@ static void dev_compact_gossip_store_reply(struct subd *gossip UNUSED,
was_pending(command_fail(cmd, LIGHTNINGD, was_pending(command_fail(cmd, LIGHTNINGD,
"gossip_compact_store failed")); "gossip_compact_store failed"));
else else
was_pending(command_success(cmd, null_response(cmd))); was_pending(command_success(cmd, json_stream_success(cmd)));
} }
static struct command_result *json_dev_compact_gossip_store(struct command *cmd, static struct command_result *json_dev_compact_gossip_store(struct command *cmd,

View File

@@ -46,7 +46,6 @@ static const char *invoice_status_str(const struct invoice_details *inv)
static void json_add_invoice(struct json_stream *response, static void json_add_invoice(struct json_stream *response,
const struct invoice_details *inv) const struct invoice_details *inv)
{ {
json_object_start(response, NULL);
json_add_escaped_string(response, "label", inv->label); json_add_escaped_string(response, "label", inv->label);
json_add_string(response, "bolt11", inv->bolt11); json_add_string(response, "bolt11", inv->bolt11);
json_add_hex(response, "payment_hash", &inv->rhash, sizeof(inv->rhash)); json_add_hex(response, "payment_hash", &inv->rhash, sizeof(inv->rhash));
@@ -66,8 +65,6 @@ static void json_add_invoice(struct json_stream *response,
json_add_string(response, "description", inv->description); json_add_string(response, "description", inv->description);
json_add_u64(response, "expires_at", inv->expiry_time); json_add_u64(response, "expires_at", inv->expiry_time);
json_object_end(response);
} }
static struct command_result *tell_waiter(struct command *cmd, static struct command_result *tell_waiter(struct command *cmd,
@@ -86,6 +83,7 @@ static struct command_result *tell_waiter(struct command *cmd,
response = json_stream_fail(cmd, -2, response = json_stream_fail(cmd, -2,
"invoice expired during wait"); "invoice expired during wait");
json_add_invoice(response, details); json_add_invoice(response, details);
json_object_end(response);
return command_failed(cmd, response); return command_failed(cmd, response);
} }
} }
@@ -512,7 +510,6 @@ static void gossipd_incoming_channels_reply(struct subd *gossipd,
details = wallet_invoice_details(info, wallet, invoice); details = wallet_invoice_details(info, wallet, invoice);
response = json_stream_success(info->cmd); response = json_stream_success(info->cmd);
json_object_start(response, NULL);
json_add_hex(response, "payment_hash", details->rhash.u.u8, json_add_hex(response, "payment_hash", details->rhash.u.u8,
sizeof(details->rhash)); sizeof(details->rhash));
json_add_u64(response, "expires_at", details->expiry_time); json_add_u64(response, "expires_at", details->expiry_time);
@@ -538,7 +535,6 @@ static void gossipd_incoming_channels_reply(struct subd *gossipd,
"No channels have sufficient" "No channels have sufficient"
" incoming capacity"); " incoming capacity");
} }
json_object_end(response);
was_pending(command_success(info->cmd, response)); was_pending(command_success(info->cmd, response));
} }
@@ -809,7 +805,9 @@ static void json_add_invoices(struct json_stream *response,
struct invoice invoice; struct invoice invoice;
if (wallet_invoice_find_by_label(wallet, &invoice, label)) { if (wallet_invoice_find_by_label(wallet, &invoice, label)) {
details = wallet_invoice_details(response, wallet, invoice); details = wallet_invoice_details(response, wallet, invoice);
json_object_start(response, NULL);
json_add_invoice(response, details); json_add_invoice(response, details);
json_object_end(response);
} }
return; return;
} }
@@ -817,7 +815,9 @@ static void json_add_invoices(struct json_stream *response,
memset(&it, 0, sizeof(it)); memset(&it, 0, sizeof(it));
while (wallet_invoice_iterate(wallet, &it)) { while (wallet_invoice_iterate(wallet, &it)) {
details = wallet_invoice_iterator_deref(response, wallet, &it); details = wallet_invoice_iterator_deref(response, wallet, &it);
json_object_start(response, NULL);
json_add_invoice(response, details); json_add_invoice(response, details);
json_object_end(response);
} }
} }
@@ -834,11 +834,9 @@ static struct command_result *json_listinvoices(struct command *cmd,
NULL)) NULL))
return command_param_failed(); return command_param_failed();
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "invoices"); json_array_start(response, "invoices");
json_add_invoices(response, wallet, label); json_add_invoices(response, wallet, label);
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -918,7 +916,7 @@ static struct command_result *json_delexpiredinvoice(struct command *cmd,
wallet_invoice_delete_expired(cmd->ld->wallet, *maxexpirytime); wallet_invoice_delete_expired(cmd->ld->wallet, *maxexpirytime);
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command delexpiredinvoice_command = { static const struct json_command delexpiredinvoice_command = {
"delexpiredinvoice", "delexpiredinvoice",
@@ -1069,8 +1067,6 @@ static struct command_result *json_decodepay(struct command *cmd,
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_string(response, "currency", b11->chain->bip173_name); json_add_string(response, "currency", b11->chain->bip173_name);
json_add_u64(response, "created_at", b11->timestamp); json_add_u64(response, "created_at", b11->timestamp);
json_add_u64(response, "expiry", b11->expiry); json_add_u64(response, "expiry", b11->expiry);
@@ -1151,7 +1147,6 @@ static struct command_result *json_decodepay(struct command *cmd,
json_add_string(response, "signature", json_add_string(response, "signature",
type_to_string(cmd, secp256k1_ecdsa_signature, type_to_string(cmd, secp256k1_ecdsa_signature,
&b11->sig)); &b11->sig));
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -182,16 +182,12 @@ static struct command_result *json_stop(struct command *cmd,
const jsmntok_t *obj UNNEEDED, const jsmntok_t *obj UNNEEDED,
const jsmntok_t *params) const jsmntok_t *params)
{ {
struct json_stream *response;
if (!param(cmd, buffer, params, NULL)) if (!param(cmd, buffer, params, NULL))
return command_param_failed(); return command_param_failed();
/* This can't have closed yet! */ /* This can't have closed yet! */
cmd->jcon->stop = true; cmd->jcon->stop = true;
response = json_stream_success(cmd); return command_success(cmd, json_stream_success(cmd));
json_add_string(response, NULL, "Shutting down");
return command_success(cmd, response);
} }
static const struct json_command stop_command = { static const struct json_command stop_command = {
@@ -219,9 +215,7 @@ static struct command_result *json_rhash(struct command *cmd,
/* Hash in place. */ /* Hash in place. */
sha256(secret, secret, sizeof(*secret)); sha256(secret, secret, sizeof(*secret));
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_hex(response, "rhash", secret, sizeof(*secret)); json_add_hex(response, "rhash", secret, sizeof(*secret));
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -241,9 +235,7 @@ struct slowcmd {
static void slowcmd_finish(struct slowcmd *sc) static void slowcmd_finish(struct slowcmd *sc)
{ {
json_object_start(sc->js, NULL);
json_add_num(sc->js, "msec", *sc->msec); json_add_num(sc->js, "msec", *sc->msec);
json_object_end(sc->js);
was_pending(command_success(sc->cmd, sc->js)); was_pending(command_success(sc->cmd, sc->js));
} }
@@ -388,14 +380,12 @@ static struct command_result *json_help(struct command *cmd,
asort(commands, tal_count(commands), compare_commands_name, NULL); asort(commands, tal_count(commands), compare_commands_name, NULL);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "help"); json_array_start(response, "help");
for (size_t i = 0; i < tal_count(commands); i++) { for (size_t i = 0; i < tal_count(commands); i++) {
if (!one_cmd || one_cmd == commands[i]) if (!one_cmd || one_cmd == commands[i])
json_add_help_command(cmd, response, commands[i]); json_add_help_command(cmd, response, commands[i]);
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -412,16 +402,6 @@ static const struct json_command *find_cmd(const struct jsonrpc *rpc,
return NULL; return NULL;
} }
struct json_stream *null_response(struct command *cmd)
{
struct json_stream *response;
response = json_stream_success(cmd);
json_object_start(response, NULL);
json_object_end(response);
return response;
}
/* This can be called directly on shutdown, even with unfinished cmd */ /* This can be called directly on shutdown, even with unfinished cmd */
static void destroy_command(struct command *cmd) static void destroy_command(struct command *cmd)
{ {
@@ -451,7 +431,7 @@ struct command_result *command_success(struct command *cmd,
{ {
assert(cmd); assert(cmd);
assert(cmd->have_json_stream); assert(cmd->have_json_stream);
json_stream_append(result, " }\n\n"); json_stream_append(result, " } }\n\n");
return command_raw_complete(cmd, result); return command_raw_complete(cmd, result);
} }
@@ -543,6 +523,7 @@ struct json_stream *json_stream_success(struct command *cmd)
{ {
struct json_stream *r = json_start(cmd); struct json_stream *r = json_start(cmd);
json_stream_append(r, "\"result\" : "); json_stream_append(r, "\"result\" : ");
json_object_start(r, NULL);
return r; return r;
} }
@@ -568,6 +549,7 @@ struct json_stream *json_stream_fail(struct command *cmd,
struct json_stream *r = json_stream_fail_nodata(cmd, code, errmsg); struct json_stream *r = json_stream_fail_nodata(cmd, code, errmsg);
json_stream_append(r, ", \"data\" : "); json_stream_append(r, ", \"data\" : ");
json_object_start(r, NULL);
return r; return r;
} }
@@ -1169,9 +1151,7 @@ static struct command_result *json_check(struct command *cmd,
return res; return res;
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_string(response, "command_to_check", cmd->json_cmd->name); json_add_string(response, "command_to_check", cmd->json_cmd->name);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -77,7 +77,7 @@ struct jsonrpc_request {
}; };
/** /**
* json_stream_success - start streaming a successful json result. * json_stream_success - start streaming a successful json result object.
* @cmd: the command we're running. * @cmd: the command we're running.
* *
* The returned value should go to command_success() when done. * The returned value should go to command_success() when done.
@@ -86,13 +86,14 @@ struct jsonrpc_request {
struct json_stream *json_stream_success(struct command *cmd); struct json_stream *json_stream_success(struct command *cmd);
/** /**
* json_stream_fail - start streaming a failed json result. * json_stream_fail - start streaming a failed json result, with data object.
* @cmd: the command we're running. * @cmd: the command we're running.
* @code: the error code from common/jsonrpc_errors.h * @code: the error code from common/jsonrpc_errors.h
* @errmsg: the error string. * @errmsg: the error string.
* *
* The returned value should go to command_failed() when done; * The returned value should go to command_failed() when done;
* json_add_* will be placed into the 'data' field of the 'error' JSON reply. * json_add_* will be placed into the 'data' field of the 'error' JSON reply.
* You need to json_object_end() once you're done!
*/ */
struct json_stream *json_stream_fail(struct command *cmd, struct json_stream *json_stream_fail(struct command *cmd,
int code, int code,
@@ -110,12 +111,11 @@ struct json_stream *json_stream_fail_nodata(struct command *cmd,
int code, int code,
const char *errmsg); const char *errmsg);
struct json_stream *null_response(struct command *cmd);
/* These returned values are never NULL. */ /* These returned values are never NULL. */
struct command_result *command_success(struct command *cmd, struct command_result *command_success(struct command *cmd,
struct json_stream *response) struct json_stream *response)
WARN_UNUSED_RESULT; WARN_UNUSED_RESULT;
struct command_result *command_failed(struct command *cmd, struct command_result *command_failed(struct command *cmd,
struct json_stream *result) struct json_stream *result)
WARN_UNUSED_RESULT; WARN_UNUSED_RESULT;

View File

@@ -732,12 +732,10 @@ static struct command_result *json_getlog(struct command *cmd,
response = json_stream_success(cmd); response = json_stream_success(cmd);
/* Suppress logging for this stream, to not bloat io logs */ /* Suppress logging for this stream, to not bloat io logs */
json_stream_log_suppress_for_cmd(response, cmd); json_stream_log_suppress_for_cmd(response, cmd);
json_object_start(response, NULL);
json_add_time(response, "created_at", log_init_time(lr)->ts); json_add_time(response, "created_at", log_init_time(lr)->ts);
json_add_num(response, "bytes_used", (unsigned int) log_used(lr)); json_add_num(response, "bytes_used", (unsigned int) log_used(lr));
json_add_num(response, "bytes_max", (unsigned int) log_max_mem(lr)); json_add_num(response, "bytes_max", (unsigned int) log_max_mem(lr));
json_add_log(response, lr, *minlevel); json_add_log(response, lr, *minlevel);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -74,7 +74,7 @@ static struct command_result *json_memdump(struct command *cmd,
return command_param_failed(); return command_param_failed();
response = json_stream_success(cmd); response = json_stream_success(cmd);
add_memdump(response, NULL, NULL, cmd); add_memdump(response, "memdump", NULL, cmd);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -196,9 +196,7 @@ static void report_leak_info2(struct leak_info *leak_info)
{ {
struct json_stream *response = json_stream_success(leak_info->cmd); struct json_stream *response = json_stream_success(leak_info->cmd);
json_object_start(response, NULL);
scan_mem(leak_info->cmd, response, leak_info->cmd->ld, leak_info->leaker); scan_mem(leak_info->cmd, response, leak_info->cmd->ld, leak_info->leaker);
json_object_end(response);
was_pending(command_success(leak_info->cmd, response)); was_pending(command_success(leak_info->cmd, response));
} }

View File

@@ -261,12 +261,10 @@ static void funding_broadcast_success(struct channel *channel)
struct command *cmd = fc->cmd; struct command *cmd = fc->cmd;
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_string(response, "tx", fc->hextx); json_add_string(response, "tx", fc->hextx);
json_add_txid(response, "txid", &channel->funding_txid); json_add_txid(response, "txid", &channel->funding_txid);
json_add_string(response, "channel_id", json_add_string(response, "channel_id",
type_to_string(tmpctx, struct channel_id, &fc->cid)); type_to_string(tmpctx, struct channel_id, &fc->cid));
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
/* Frees fc too */ /* Frees fc too */

View File

@@ -1066,7 +1066,6 @@ static struct command_result *json_listconfigs(struct command *cmd,
if (!configtok) { if (!configtok) {
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_string(response, "# version", version()); json_add_string(response, "# version", version());
} }
@@ -1091,10 +1090,8 @@ static struct command_result *json_listconfigs(struct command *cmd,
name + 1, len - 1)) name + 1, len - 1))
continue; continue;
if (!response) { if (!response)
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
}
add_config(cmd->ld, response, &opt_table[i], add_config(cmd->ld, response, &opt_table[i],
name+1, len-1); name+1, len-1);
} }
@@ -1106,7 +1103,6 @@ static struct command_result *json_listconfigs(struct command *cmd,
json_tok_full_len(configtok), json_tok_full_len(configtok),
json_tok_full(buffer, configtok)); json_tok_full(buffer, configtok));
} }
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -116,9 +116,7 @@ static struct command_result *sendpay_success(struct command *cmd,
assert(payment->status == PAYMENT_COMPLETE); assert(payment->status == PAYMENT_COMPLETE);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_payment_fields(response, payment); json_add_payment_fields(response, payment);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -132,7 +130,6 @@ json_add_routefail_info(struct json_stream *js,
{ {
const char *failcodename = onion_type_name(failcode); const char *failcodename = onion_type_name(failcode);
json_object_start(js, NULL);
json_add_num(js, "erring_index", erring_index); json_add_num(js, "erring_index", erring_index);
json_add_num(js, "failcode", failcode); json_add_num(js, "failcode", failcode);
/* FIXME: Better way to detect this? */ /* FIXME: Better way to detect this? */
@@ -141,7 +138,6 @@ json_add_routefail_info(struct json_stream *js,
json_add_node_id(js, "erring_node", erring_node); json_add_node_id(js, "erring_node", erring_node);
json_add_short_channel_id(js, "erring_channel", erring_channel); json_add_short_channel_id(js, "erring_channel", erring_channel);
json_add_num(js, "erring_direction", channel_dir); json_add_num(js, "erring_direction", channel_dir);
json_object_end(js);
} }
/* onionreply used if pay_errcode == PAY_UNPARSEABLE_ONION */ /* onionreply used if pay_errcode == PAY_UNPARSEABLE_ONION */
@@ -157,7 +153,6 @@ sendpay_fail(struct command *cmd,
if (pay_errcode == PAY_UNPARSEABLE_ONION) { if (pay_errcode == PAY_UNPARSEABLE_ONION) {
data = json_stream_fail(cmd, PAY_UNPARSEABLE_ONION, data = json_stream_fail(cmd, PAY_UNPARSEABLE_ONION,
"Malformed error reply"); "Malformed error reply");
json_object_start(data, NULL);
json_add_hex_talarr(data, "onionreply", onionreply); json_add_hex_talarr(data, "onionreply", onionreply);
json_object_end(data); json_object_end(data);
return command_failed(cmd, data); return command_failed(cmd, data);
@@ -174,6 +169,7 @@ sendpay_fail(struct command *cmd,
&fail->erring_node, &fail->erring_node,
&fail->erring_channel, &fail->erring_channel,
fail->channel_dir); fail->channel_dir);
json_object_end(data);
return command_failed(cmd, data); return command_failed(cmd, data);
} }
@@ -183,11 +179,9 @@ json_sendpay_in_progress(struct command *cmd,
const struct wallet_payment *payment) const struct wallet_payment *payment)
{ {
struct json_stream *response = json_stream_success(cmd); struct json_stream *response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_string(response, "message", json_add_string(response, "message",
"Monitor status with listpayments or waitsendpay"); "Monitor status with listpayments or waitsendpay");
json_add_payment_fields(response, payment); json_add_payment_fields(response, payment);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -678,6 +672,7 @@ send_payment(struct lightningd *ld,
json_add_routefail_info(data, 0, WIRE_UNKNOWN_NEXT_PEER, json_add_routefail_info(data, 0, WIRE_UNKNOWN_NEXT_PEER,
&ld->id, &route[0].channel_id, &ld->id, &route[0].channel_id,
node_id_idx(&ld->id, &route[0].nodeid)); node_id_idx(&ld->id, &route[0].nodeid));
json_object_end(data);
return command_failed(cmd, data); return command_failed(cmd, data);
} }
@@ -977,7 +972,6 @@ static struct command_result *json_listsendpays(struct command *cmd,
payments = wallet_payment_list(cmd, cmd->ld->wallet, rhash); payments = wallet_payment_list(cmd, cmd->ld->wallet, rhash);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "payments"); json_array_start(response, "payments");
for (size_t i = 0; i < tal_count(payments); i++) { for (size_t i = 0; i < tal_count(payments); i++) {
@@ -987,7 +981,6 @@ static struct command_result *json_listsendpays(struct command *cmd,
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -242,14 +242,12 @@ resolve_one_close_command(struct close_command *cc, bool cooperative)
bitcoin_txid(cc->channel->last_tx, &txid); bitcoin_txid(cc->channel->last_tx, &txid);
json_object_start(result, NULL);
json_add_tx(result, "tx", cc->channel->last_tx); json_add_tx(result, "tx", cc->channel->last_tx);
json_add_txid(result, "txid", &txid); json_add_txid(result, "txid", &txid);
if (cooperative) if (cooperative)
json_add_string(result, "type", "mutual"); json_add_string(result, "type", "mutual");
else else
json_add_string(result, "type", "unilateral"); json_add_string(result, "type", "unilateral");
json_object_end(result);
was_pending(command_success(cc->cmd, result)); was_pending(command_success(cc->cmd, result));
} }
@@ -1085,7 +1083,6 @@ static struct command_result *json_listpeers(struct command *cmd,
return command_param_failed(); return command_param_failed();
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "peers"); json_array_start(response, "peers");
if (specific_id) { if (specific_id) {
peer = peer_by_id(cmd->ld, specific_id); peer = peer_by_id(cmd->ld, specific_id);
@@ -1096,7 +1093,7 @@ static struct command_result *json_listpeers(struct command *cmd,
json_add_peer(cmd->ld, response, peer, ll); json_add_peer(cmd->ld, response, peer, ll);
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -1192,7 +1189,7 @@ static struct command_result *json_close(struct command *cmd,
/* Easy case: peer can simply be forgotten. */ /* Easy case: peer can simply be forgotten. */
kill_uncommitted_channel(uc, "close command called"); kill_uncommitted_channel(uc, "close command called");
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
return command_fail(cmd, LIGHTNINGD, return command_fail(cmd, LIGHTNINGD,
"Peer has no active channel"); "Peer has no active channel");
@@ -1326,7 +1323,7 @@ static struct command_result *json_disconnect(struct command *cmd,
if (*force) { if (*force) {
channel_fail_transient(channel, channel_fail_transient(channel,
"disconnect command force=true"); "disconnect command force=true");
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
return command_fail(cmd, LIGHTNINGD, "Peer is in state %s", return command_fail(cmd, LIGHTNINGD, "Peer is in state %s",
channel_state_name(channel)); channel_state_name(channel));
@@ -1336,7 +1333,7 @@ static struct command_result *json_disconnect(struct command *cmd,
} }
kill_uncommitted_channel(peer->uncommitted_channel, kill_uncommitted_channel(peer->uncommitted_channel,
"disconnect command"); "disconnect command");
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command disconnect_command = { static const struct json_command disconnect_command = {
@@ -1362,7 +1359,6 @@ static struct command_result *json_getinfo(struct command *cmd,
return command_param_failed(); return command_param_failed();
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_node_id(response, "id", &cmd->ld->id); json_add_node_id(response, "id", &cmd->ld->id);
json_add_string(response, "alias", (const char *)cmd->ld->alias); json_add_string(response, "alias", (const char *)cmd->ld->alias);
json_add_hex_talarr(response, "color", cmd->ld->rgb); json_add_hex_talarr(response, "color", cmd->ld->rgb);
@@ -1408,7 +1404,6 @@ static struct command_result *json_getinfo(struct command *cmd,
wallet_total_forward_fees(cmd->ld->wallet), wallet_total_forward_fees(cmd->ld->wallet),
"msatoshi_fees_collected", "msatoshi_fees_collected",
"fees_collected_msat"); "fees_collected_msat");
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -1535,7 +1530,6 @@ static struct command_result *json_setchannelfee(struct command *cmd,
/* Open JSON response object for later iteration */ /* Open JSON response object for later iteration */
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_num(response, "base", *base); json_add_num(response, "base", *base);
json_add_num(response, "ppm", *ppm); json_add_num(response, "ppm", *ppm);
json_array_start(response, "channels"); json_array_start(response, "channels");
@@ -1565,7 +1559,6 @@ static struct command_result *json_setchannelfee(struct command *cmd,
/* Close and return response */ /* Close and return response */
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -1615,9 +1608,7 @@ static struct command_result *json_sign_last_tx(struct command *cmd,
channel->last_tx->wtx->num_outputs); channel->last_tx->wtx->num_outputs);
sign_last_tx(channel); sign_last_tx(channel);
json_object_start(response, NULL);
json_add_tx(response, "tx", channel->last_tx); json_add_tx(response, "tx", channel->last_tx);
json_object_end(response);
remove_sig(channel->last_tx); remove_sig(channel->last_tx);
return command_success(cmd, response); return command_success(cmd, response);
@@ -1658,7 +1649,7 @@ static struct command_result *json_dev_fail(struct command *cmd,
} }
channel_internal_error(channel, "Failing due to dev-fail command"); channel_internal_error(channel, "Failing due to dev-fail command");
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command dev_fail_command = { static const struct json_command dev_fail_command = {
@@ -1674,7 +1665,7 @@ static void dev_reenable_commit_finished(struct subd *channeld UNUSED,
const int *fds UNUSED, const int *fds UNUSED,
struct command *cmd) struct command *cmd)
{ {
was_pending(command_success(cmd, null_response(cmd))); was_pending(command_success(cmd, json_stream_success(cmd)));
} }
static struct command_result *json_dev_reenable_commit(struct command *cmd, static struct command_result *json_dev_reenable_commit(struct command *cmd,
@@ -1752,11 +1743,9 @@ static void process_dev_forget_channel(struct bitcoind *bitcoind UNUSED,
return; return;
} }
response = json_stream_success(forget->cmd); response = json_stream_success(forget->cmd);
json_object_start(response, NULL);
json_add_bool(response, "forced", forget->force); json_add_bool(response, "forced", forget->force);
json_add_bool(response, "funding_unspent", txout != NULL); json_add_bool(response, "funding_unspent", txout != NULL);
json_add_txid(response, "funding_txid", &forget->channel->funding_txid); json_add_txid(response, "funding_txid", &forget->channel->funding_txid);
json_object_end(response);
/* Set error so we don't try to reconnect. */ /* Set error so we don't try to reconnect. */
forget->channel->error = towire_errorfmt(forget->channel, NULL, forget->channel->error = towire_errorfmt(forget->channel, NULL,

View File

@@ -2075,7 +2075,7 @@ static struct command_result *json_dev_ignore_htlcs(struct command *cmd,
} }
peer->ignore_htlcs = *ignore; peer->ignore_htlcs = *ignore;
return command_success(cmd, null_response(cmd)); return command_success(cmd, json_stream_success(cmd));
} }
static const struct json_command dev_ignore_htlcs = { static const struct json_command dev_ignore_htlcs = {
@@ -2148,9 +2148,7 @@ static struct command_result *json_listforwards(struct command *cmd,
return command_param_failed(); return command_param_failed();
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
listforwardings_add_forwardings(response, cmd->ld->wallet); listforwardings_add_forwardings(response, cmd->ld->wallet);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }

View File

@@ -73,9 +73,7 @@ void ping_reply(struct subd *subd, const u8 *msg)
else { else {
struct json_stream *response = json_stream_success(pc->cmd); struct json_stream *response = json_stream_success(pc->cmd);
json_object_start(response, NULL);
json_add_num(response, "totlen", totlen); json_add_num(response, "totlen", totlen);
json_object_end(response);
was_pending(command_success(pc->cmd, response)); was_pending(command_success(pc->cmd, response));
} }
} }

View File

@@ -291,9 +291,6 @@ void notify_connect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEE
/* Generated stub for notify_disconnect */ /* Generated stub for notify_disconnect */
void notify_disconnect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEEDED) void notify_disconnect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEEDED)
{ fprintf(stderr, "notify_disconnect called!\n"); abort(); } { fprintf(stderr, "notify_disconnect called!\n"); abort(); }
/* Generated stub for null_response */
struct json_stream *null_response(struct command *cmd UNNEEDED)
{ fprintf(stderr, "null_response called!\n"); abort(); }
/* Generated stub for onchaind_funding_spent */ /* Generated stub for onchaind_funding_spent */
enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED, enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED,
const struct bitcoin_tx *tx UNNEEDED, const struct bitcoin_tx *tx UNNEEDED,

View File

@@ -371,9 +371,6 @@ void notify_connect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEE
/* Generated stub for notify_disconnect */ /* Generated stub for notify_disconnect */
void notify_disconnect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEEDED) void notify_disconnect(struct lightningd *ld UNNEEDED, struct node_id *nodeid UNNEEDED)
{ fprintf(stderr, "notify_disconnect called!\n"); abort(); } { fprintf(stderr, "notify_disconnect called!\n"); abort(); }
/* Generated stub for null_response */
struct json_stream *null_response(struct command *cmd UNNEEDED)
{ fprintf(stderr, "null_response called!\n"); abort(); }
/* Generated stub for onchaind_funding_spent */ /* Generated stub for onchaind_funding_spent */
enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED, enum watch_result onchaind_funding_spent(struct channel *channel UNNEEDED,
const struct bitcoin_tx *tx UNNEEDED, const struct bitcoin_tx *tx UNNEEDED,

View File

@@ -68,10 +68,8 @@ static void wallet_withdrawal_broadcast(struct bitcoind *bitcoind UNUSED,
assert(amount_sat_greater_eq(change, utx->wtx->change)); assert(amount_sat_greater_eq(change, utx->wtx->change));
struct json_stream *response = json_stream_success(cmd); struct json_stream *response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_tx(response, "tx", utx->tx); json_add_tx(response, "tx", utx->tx);
json_add_string(response, "txid", output); json_add_string(response, "txid", output);
json_object_end(response);
was_pending(command_success(cmd, response)); was_pending(command_success(cmd, response));
} else { } else {
was_pending(command_fail(cmd, LIGHTNINGD, was_pending(command_fail(cmd, LIGHTNINGD,
@@ -228,10 +226,8 @@ static struct command_result *json_txprepare(struct command *cmd,
add_unreleased_tx(cmd->ld->wallet, utx); add_unreleased_tx(cmd->ld->wallet, utx);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_tx(response, "unsigned_tx", utx->tx); json_add_tx(response, "unsigned_tx", utx->tx);
json_add_txid(response, "txid", &utx->txid); json_add_txid(response, "txid", &utx->txid);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
static const struct json_command txprepare_command = { static const struct json_command txprepare_command = {
@@ -314,10 +310,8 @@ static struct command_result *json_txdiscard(struct command *cmd,
tal_steal(cmd, utx); tal_steal(cmd, utx);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_add_tx(response, "unsigned_tx", utx->tx); json_add_tx(response, "unsigned_tx", utx->tx);
json_add_txid(response, "txid", &utx->txid); json_add_txid(response, "txid", &utx->txid);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -512,7 +506,6 @@ static struct command_result *json_newaddr(struct command *cmd,
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
if (deprecated_apis && *addrtype != ADDR_ALL) if (deprecated_apis && *addrtype != ADDR_ALL)
json_add_string(response, "address", json_add_string(response, "address",
*addrtype & ADDR_BECH32 ? bech32 : p2sh); *addrtype & ADDR_BECH32 ? bech32 : p2sh);
@@ -520,7 +513,6 @@ static struct command_result *json_newaddr(struct command *cmd,
json_add_string(response, "bech32", bech32); json_add_string(response, "bech32", bech32);
if (*addrtype & ADDR_P2SH_SEGWIT) if (*addrtype & ADDR_P2SH_SEGWIT)
json_add_string(response, "p2sh-segwit", p2sh); json_add_string(response, "p2sh-segwit", p2sh);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -553,7 +545,6 @@ static struct command_result *json_listaddrs(struct command *cmd,
"bip32_max_index", 0); "bip32_max_index", 0);
} }
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "addresses"); json_array_start(response, "addresses");
for (s64 keyidx = 0; keyidx <= *bip32_max_index; keyidx++) { for (s64 keyidx = 0; keyidx <= *bip32_max_index; keyidx++) {
@@ -595,7 +586,6 @@ static struct command_result *json_listaddrs(struct command *cmd,
json_object_end(response); json_object_end(response);
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -625,7 +615,6 @@ static struct command_result *json_listfunds(struct command *cmd,
utxos = wallet_get_utxos(cmd, cmd->ld->wallet, output_state_available); utxos = wallet_get_utxos(cmd, cmd->ld->wallet, output_state_available);
response = json_stream_success(cmd); response = json_stream_success(cmd);
json_object_start(response, NULL);
json_array_start(response, "outputs"); json_array_start(response, "outputs");
for (size_t i = 0; i < tal_count(utxos); i++) { for (size_t i = 0; i < tal_count(utxos); i++) {
json_object_start(response, NULL); json_object_start(response, NULL);
@@ -690,7 +679,6 @@ static struct command_result *json_listfunds(struct command *cmd,
} }
} }
json_array_end(response); json_array_end(response);
json_object_end(response);
return command_success(cmd, response); return command_success(cmd, response);
} }
@@ -737,7 +725,6 @@ static void process_utxo_result(struct bitcoind *bitcoind,
if (tal_count(rescan->utxos) == 0) { if (tal_count(rescan->utxos) == 0) {
/* Complete the response */ /* Complete the response */
json_array_end(rescan->response); json_array_end(rescan->response);
json_object_end(rescan->response);
was_pending(command_success(rescan->cmd, rescan->response)); was_pending(command_success(rescan->cmd, rescan->response));
} else { } else {
bitcoind_gettxout( bitcoind_gettxout(
@@ -759,13 +746,11 @@ static struct command_result *json_dev_rescan_outputs(struct command *cmd,
rescan->response = json_stream_success(cmd); rescan->response = json_stream_success(cmd);
rescan->cmd = cmd; rescan->cmd = cmd;
/* Open the result structure so we can incrementally add results */ /* Open the outputs structure so we can incrementally add results */
json_object_start(rescan->response, NULL);
json_array_start(rescan->response, "outputs"); json_array_start(rescan->response, "outputs");
rescan->utxos = wallet_get_utxos(rescan, cmd->ld->wallet, output_state_any); rescan->utxos = wallet_get_utxos(rescan, cmd->ld->wallet, output_state_any);
if (tal_count(rescan->utxos) == 0) { if (tal_count(rescan->utxos) == 0) {
json_array_end(rescan->response); json_array_end(rescan->response);
json_object_end(rescan->response);
return command_success(cmd, rescan->response); return command_success(cmd, rescan->response);
} }
bitcoind_gettxout(cmd->ld->topology->bitcoind, &rescan->utxos[0]->txid, bitcoind_gettxout(cmd->ld->topology->bitcoind, &rescan->utxos[0]->txid,