lightningd/plugin: unregister a plugin's options when stopping it

This also remove the now duplicate plugin_hook_unregister_all(), added
in the tal destructor of the struct plugin.
This commit is contained in:
darosior 2020-02-03 12:25:06 +01:00 committed by Rusty Russell
parent 2b57cfcc59
commit 972b4def57
3 changed files with 16 additions and 4 deletions

View File

@ -487,7 +487,7 @@ static bool plugin_opt_add(struct plugin *plugin, const char *buffer,
popt = tal(plugin, struct plugin_opt);
popt->value = talz(popt, struct plugin_opt_value);
popt->name = tal_fmt(plugin, "--%.*s", nametok->end - nametok->start,
popt->name = tal_fmt(popt, "--%.*s", nametok->end - nametok->start,
buffer + nametok->start);
if (json_tok_streq(buffer, typetok, "string")) {
popt->type = "string";

View File

@ -1,3 +1,4 @@
#include <ccan/opt/opt.h>
#include <lightningd/options.h>
#include <lightningd/plugin_control.h>
#include <lightningd/plugin_hook.h>
@ -196,6 +197,18 @@ plugin_dynamic_startdir(struct command *cmd, const char *dir_path)
return command_still_pending(cmd);
}
static void clear_plugin(struct plugin *p, const char *name)
{
struct plugin_opt *opt;
list_for_each(&p->plugin_opts, opt, list)
if (!opt_unregister(opt->name))
fatal("Could not unregister %s from plugin %s",
opt->name, name);
plugin_kill(p, "%s stopped by lightningd via RPC", name);
tal_free(p);
}
static struct command_result *
plugin_dynamic_stop(struct command *cmd, const char *plugin_name)
{
@ -209,9 +222,7 @@ plugin_dynamic_stop(struct command *cmd, const char *plugin_name)
"%s cannot be managed when "
"lightningd is up",
plugin_name);
plugin_hook_unregister_all(p);
plugin_kill(p, "%s stopped by lightningd via RPC", plugin_name);
tal_free(p);
clear_plugin(p, plugin_name);
response = json_stream_success(cmd);
if (deprecated_apis)
json_add_string(response, "",

View File

@ -791,6 +791,7 @@ def test_rpc_command_hook(node_factory):
l1.rpc.plugin_stop('rpc_command.py')
@flaky
def test_libplugin(node_factory):
"""Sanity checks for plugins made with libplugin"""
plugin = os.path.join(os.getcwd(), "tests/plugins/test_libplugin")