mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 21:35:11 +01:00
plugin: Remove added JSON-RPC methods if a plugin gets killed
Removes the method from the dispatch table, leaving a NULL entry currently. Signed-off-by: Christian Decker <@cdecker>
This commit is contained in:
parent
7de4c40b77
commit
a71208b2a0
@ -347,11 +347,12 @@ static const struct json_command *find_cmd(const struct jsonrpc *rpc,
|
|||||||
{
|
{
|
||||||
struct json_command **commands = rpc->commands;
|
struct json_command **commands = rpc->commands;
|
||||||
|
|
||||||
/* commands[i]->name can be NULL in test code. */
|
/* commands[i] can be NULL if the plugin that registered it
|
||||||
for (size_t i=0; i<tal_count(commands); i++)
|
* was killed, commands[i]->name can be NULL in test code. */
|
||||||
if (commands[i]->name &&
|
for (size_t i = 0; i < tal_count(commands); i++)
|
||||||
json_tok_streq(buffer, tok, commands[i]->name))
|
if (commands[i] && commands[i]->name &&
|
||||||
return commands[i];
|
json_tok_streq(buffer, tok, commands[i]->name))
|
||||||
|
return commands[i];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -738,6 +739,18 @@ bool jsonrpc_command_add(struct jsonrpc *rpc, struct json_command *command)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void jsonrpc_command_remove(struct jsonrpc *rpc, const char *method)
|
||||||
|
{
|
||||||
|
// FIXME: Currently leaves NULL entries in the table, if we
|
||||||
|
// restart plugins we should shift them out.
|
||||||
|
for (size_t i=0; i<tal_count(rpc->commands); i++) {
|
||||||
|
struct json_command *cmd = rpc->commands[i];
|
||||||
|
if (cmd && streq(cmd->name, method)) {
|
||||||
|
rpc->commands[i] = tal_free(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct jsonrpc *jsonrpc_new(const tal_t *ctx, struct lightningd *ld)
|
struct jsonrpc *jsonrpc_new(const tal_t *ctx, struct lightningd *ld)
|
||||||
{
|
{
|
||||||
struct jsonrpc *jsonrpc = tal(ctx, struct jsonrpc);
|
struct jsonrpc *jsonrpc = tal(ctx, struct jsonrpc);
|
||||||
|
@ -117,5 +117,13 @@ void jsonrpc_listen(struct jsonrpc *rpc, struct lightningd *ld);
|
|||||||
*/
|
*/
|
||||||
bool jsonrpc_command_add(struct jsonrpc *rpc, struct json_command *command);
|
bool jsonrpc_command_add(struct jsonrpc *rpc, struct json_command *command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a command/method from the JSON-RPC.
|
||||||
|
*
|
||||||
|
* Used to dynamically remove a `struct json_command` from the
|
||||||
|
* JSON-RPC dispatch table by its name.
|
||||||
|
*/
|
||||||
|
void jsonrpc_command_remove(struct jsonrpc *rpc, const char *method);
|
||||||
|
|
||||||
AUTODATA_TYPE(json_command, struct json_command);
|
AUTODATA_TYPE(json_command, struct json_command);
|
||||||
#endif /* LIGHTNING_LIGHTNINGD_JSONRPC_H */
|
#endif /* LIGHTNING_LIGHTNINGD_JSONRPC_H */
|
||||||
|
@ -781,6 +781,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
shutdown_subdaemons(ld);
|
shutdown_subdaemons(ld);
|
||||||
|
|
||||||
|
tal_free(ld->plugins);
|
||||||
|
|
||||||
/* Clean up the JSON-RPC. This needs to happen in a DB transaction since
|
/* Clean up the JSON-RPC. This needs to happen in a DB transaction since
|
||||||
* it might actually be touching the DB in some destructors, e.g.,
|
* it might actually be touching the DB in some destructors, e.g.,
|
||||||
* unreserving UTXOs (see #1737) */
|
* unreserving UTXOs (see #1737) */
|
||||||
@ -788,7 +790,6 @@ int main(int argc, char *argv[])
|
|||||||
tal_free(ld->jsonrpc);
|
tal_free(ld->jsonrpc);
|
||||||
db_commit_transaction(ld->wallet->db);
|
db_commit_transaction(ld->wallet->db);
|
||||||
|
|
||||||
tal_free(ld->plugins);
|
|
||||||
remove(ld->pidfile);
|
remove(ld->pidfile);
|
||||||
|
|
||||||
/* FIXME: pay can have children off tmpctx which unlink from
|
/* FIXME: pay can have children off tmpctx which unlink from
|
||||||
|
@ -118,6 +118,8 @@ static void plugin_kill(struct plugin *plugin, char *msg)
|
|||||||
plugin->stop = true;
|
plugin->stop = true;
|
||||||
io_wake(plugin);
|
io_wake(plugin);
|
||||||
kill(plugin->pid, SIGKILL);
|
kill(plugin->pid, SIGKILL);
|
||||||
|
list_del(&plugin->list);
|
||||||
|
tal_free(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -384,8 +386,10 @@ static bool plugin_opts_add(const struct plugin_request *req)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plugin_rpcmethod_destroy(struct json_command *cmd)
|
static void plugin_rpcmethod_destroy(struct json_command *cmd,
|
||||||
|
struct jsonrpc *rpc)
|
||||||
{
|
{
|
||||||
|
jsonrpc_command_remove(rpc, cmd->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plugin_rpcmethod_dispatch(struct command *cmd, const char *buffer,
|
static void plugin_rpcmethod_dispatch(struct command *cmd, const char *buffer,
|
||||||
@ -448,7 +452,7 @@ static bool plugin_rpcmethod_add(struct plugin *plugin, const char *buffer,
|
|||||||
|
|
||||||
cmd->deprecated = false;
|
cmd->deprecated = false;
|
||||||
cmd->dispatch = plugin_rpcmethod_dispatch;
|
cmd->dispatch = plugin_rpcmethod_dispatch;
|
||||||
tal_add_destructor(cmd, plugin_rpcmethod_destroy);
|
tal_add_destructor2(cmd, plugin_rpcmethod_destroy, plugin->plugins->rpc);
|
||||||
if (!jsonrpc_command_add(plugin->plugins->rpc, cmd)) {
|
if (!jsonrpc_command_add(plugin->plugins->rpc, cmd)) {
|
||||||
log_broken(plugin->log,
|
log_broken(plugin->log,
|
||||||
"Could not register method \"%s\", a method with "
|
"Could not register method \"%s\", a method with "
|
||||||
|
Loading…
Reference in New Issue
Block a user