diff --git a/plugins/libplugin.c b/plugins/libplugin.c index 7653a40cd..201768195 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,9 @@ struct plugin { /* Timers */ struct timers timers; size_t in_timer; + + /* Feature set for lightningd */ + struct feature_set *fset; }; @@ -148,6 +152,11 @@ jsonrpc_request_start_(struct plugin *plugin, struct command *cmd, return out; } +const struct feature_set *plugin_feature_set(const struct plugin *p) +{ + return p->fset; +} + static void jsonrpc_finish_and_send(struct plugin *p, struct json_stream *js) { json_object_compat_end(js); @@ -710,11 +719,37 @@ static struct io_plan *rpc_conn_init(struct io_conn *conn, rpc_conn_write_request(conn, plugin)); } +static struct feature_set *json_to_feature_set(struct plugin *plugin, + const char *buf, + const jsmntok_t *features) +{ + struct feature_set *fset = talz(plugin, struct feature_set); + const jsmntok_t *t; + size_t i; + + json_for_each_obj(i, t, features) { + enum feature_place p; + if (json_tok_streq(buf, t, "init")) + p = INIT_FEATURE; + else if (json_tok_streq(buf, t, "node")) + p = NODE_ANNOUNCE_FEATURE; + else if (json_tok_streq(buf, t, "channel")) + p = CHANNEL_FEATURE; + else if (json_tok_streq(buf, t, "invoice")) + p = BOLT11_FEATURE; + else + continue; + fset->bits[p] = json_tok_bin_from_hex(fset, buf, t + 1); + } + return fset; +} + static struct command_result *handle_init(struct command *cmd, const char *buf, const jsmntok_t *params) { - const jsmntok_t *configtok, *rpctok, *dirtok, *opttok, *nettok, *t; + const jsmntok_t *configtok, *rpctok, *dirtok, *opttok, *nettok, *fsettok, + *t; struct sockaddr_un addr; size_t i; char *dir, *network; @@ -734,6 +769,9 @@ static struct command_result *handle_init(struct command *cmd, network = json_strdup(tmpctx, buf, nettok); chainparams = chainparams_for_network(network); + fsettok = json_delve(buf, configtok, ".feature_set"); + p->fset = json_to_feature_set(p, buf, fsettok); + rpctok = json_delve(buf, configtok, ".rpc-file"); p->rpc_conn->fd = socket(AF_UNIX, SOCK_STREAM, 0); if (rpctok->end - rpctok->start + 1 > sizeof(addr.sun_path)) diff --git a/plugins/libplugin.h b/plugins/libplugin.h index 18da74066..37deff2db 100644 --- a/plugins/libplugin.h +++ b/plugins/libplugin.h @@ -90,6 +90,9 @@ struct plugin_hook { const jsmntok_t *params); }; +/* Return the feature set of the current lightning node */ +const struct feature_set *plugin_feature_set(const struct plugin *p); + /* Helper to create a JSONRPC2 request stream. Send it with `send_outreq`. */ struct out_req * jsonrpc_request_start_(struct plugin *plugin, struct command *cmd,