diff --git a/plugins/autoclean.c b/plugins/autoclean.c index 8ef8b8ab5749..b076a8b388a0 100644 --- a/plugins/autoclean.c +++ b/plugins/autoclean.c @@ -65,7 +65,8 @@ static struct command_result *json_autocleaninvoice(struct command *cmd, expired_by, cycle_seconds)); } -static void init(struct plugin_conn *prpc) +static void init(struct plugin_conn *prpc, + const char *buf UNUSED, const jsmntok_t *config UNUSED) { rpc = prpc; @@ -90,7 +91,7 @@ static const struct plugin_command commands[] = { { int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, commands, ARRAY_SIZE(commands), + plugin_main(argv, init, PLUGIN_RESTARTABLE, commands, ARRAY_SIZE(commands), plugin_option("autocleaninvoice-cycle", "string", "Perform cleanup of expired invoices every" diff --git a/plugins/libplugin.c b/plugins/libplugin.c index e365e28b1862..5e2a7a6ecf5d 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -473,7 +473,8 @@ static struct command_result * handle_getmanifest(struct command *getmanifest_cmd, const struct plugin_command *commands, size_t num_commands, - const struct plugin_option *opts) + const struct plugin_option *opts, + const enum plugin_restartability restartability) { struct json_out *params = json_out_new(tmpctx); @@ -501,6 +502,7 @@ handle_getmanifest(struct command *getmanifest_cmd, json_out_end(params, '}'); } json_out_end(params, ']'); + json_out_addstr(params, "dynamic", restartability == PLUGIN_RESTARTABLE ? "true" : "false"); json_out_end(params, '}'); json_out_finished(params); @@ -511,21 +513,24 @@ static struct command_result *handle_init(struct command *init_cmd, const char *buf, const jsmntok_t *params, const struct plugin_option *opts, - void (*init)(struct plugin_conn *)) + void (*init)(struct plugin_conn *, + const char *buf, const jsmntok_t *)) { - const jsmntok_t *rpctok, *dirtok, *opttok, *t; + const jsmntok_t *configtok, *rpctok, *dirtok, *opttok, *t; struct sockaddr_un addr; size_t i; char *dir; struct json_out *param_obj; + configtok = json_delve(buf, params, ".configuration"); + /* Move into lightning directory: other files are relative */ - dirtok = json_delve(buf, params, ".configuration.lightning-dir"); + dirtok = json_delve(buf, configtok, ".lightning-dir"); dir = json_strdup(tmpctx, buf, dirtok); if (chdir(dir) != 0) plugin_err("chdir to %s: %s", dir, strerror(errno)); - rpctok = json_delve(buf, params, ".configuration.rpc-file"); + rpctok = json_delve(buf, configtok, ".rpc-file"); rpc_conn.fd = socket(AF_UNIX, SOCK_STREAM, 0); if (rpctok->end - rpctok->start + 1 > sizeof(addr.sun_path)) plugin_err("rpc filename '%.*s' too long", @@ -545,7 +550,7 @@ static struct command_result *handle_init(struct command *init_cmd, take(param_obj), &rpc_conn, ".allow-deprecated-apis"), - "true"); + "true"); opttok = json_get_member(buf, params, "options"); json_for_each_obj(i, t, opttok) { char *opt = json_strdup(NULL, buf, t); @@ -564,7 +569,7 @@ static struct command_result *handle_init(struct command *init_cmd, } if (init) - init(&rpc_conn); + init(&rpc_conn, buf, configtok); return command_success_str(init_cmd, NULL); } @@ -698,7 +703,9 @@ void plugin_log(enum log_level l, const char *fmt, ...) } void plugin_main(char *argv[], - void (*init)(struct plugin_conn *rpc), + void (*init)(struct plugin_conn *rpc, + const char *buf, const jsmntok_t *), + const enum plugin_restartability restartability, const struct plugin_command *commands, size_t num_commands, ...) { @@ -749,7 +756,7 @@ void plugin_main(char *argv[], plugin_err("Expected getmanifest not %s", cmd->methodname); membuf_consume(&request_conn.mb, reqlen); - handle_getmanifest(cmd, commands, num_commands, opts); + handle_getmanifest(cmd, commands, num_commands, opts, restartability); cmd = read_json_request(tmpctx, &request_conn, &rpc_conn, ¶ms, &reqlen); diff --git a/plugins/libplugin.h b/plugins/libplugin.h index 3be2ff3196c2..d56e91c5738d 100644 --- a/plugins/libplugin.h +++ b/plugins/libplugin.h @@ -16,6 +16,11 @@ struct plugin_conn; extern bool deprecated_apis; +enum plugin_restartability { + PLUGIN_STATIC, + PLUGIN_RESTARTABLE +}; + /* Create an array of these, one for each command you support. */ struct plugin_command { const char *name; @@ -147,7 +152,9 @@ char *charp_option(const char *arg, char **p); /* The main plugin runner: append with 0 or more plugin_option(), then NULL. */ void NORETURN LAST_ARG_NULL plugin_main(char *argv[], - void (*init)(struct plugin_conn *rpc), + void (*init)(struct plugin_conn *rpc, + const char *buf, const jsmntok_t *), + const enum plugin_restartability restartability, const struct plugin_command *commands, size_t num_commands, ...); #endif /* LIGHTNING_PLUGINS_LIBPLUGIN_H */ diff --git a/plugins/pay.c b/plugins/pay.c index 3b3bcf50d563..7baba1d5337b 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -1271,7 +1271,8 @@ static struct command_result *json_listpays(struct command *cmd, take(json_out_obj(NULL, "bolt11", b11str))); } -static void init(struct plugin_conn *rpc) +static void init(struct plugin_conn *rpc, + const char *buf UNUSED, const jsmntok_t *config UNUSED) { const char *field; @@ -1311,5 +1312,5 @@ static const struct plugin_command commands[] = { { int main(int argc, char *argv[]) { setup_locale(); - plugin_main(argv, init, commands, ARRAY_SIZE(commands), NULL); + plugin_main(argv, init, PLUGIN_RESTARTABLE, commands, ARRAY_SIZE(commands), NULL); }