diff --git a/plugins/libplugin.c b/plugins/libplugin.c index c1edd49df..50448e9f8 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -27,6 +27,7 @@ struct plugin_conn { struct command { u64 id; + const char *methodname; struct plugin_conn *rpc; }; @@ -110,11 +111,10 @@ static int read_json(struct plugin_conn *conn) static struct command *read_json_request(const tal_t *ctx, struct plugin_conn *conn, struct plugin_conn *rpc, - const jsmntok_t **method, const jsmntok_t **params, int *reqlen) { - const jsmntok_t *toks, *id; + const jsmntok_t *toks, *id, *method; bool valid; struct command *cmd = tal(ctx, struct command); @@ -128,7 +128,7 @@ static struct command *read_json_request(const tal_t *ctx, plugin_err("Malformed JSON command '%*.s' is not an object", *reqlen, membuf_elems(&conn->mb)); - *method = json_get_member(membuf_elems(&conn->mb), toks, "method"); + method = json_get_member(membuf_elems(&conn->mb), toks, "method"); *params = json_get_member(membuf_elems(&conn->mb), toks, "params"); /* FIXME: Notifications don't have id! */ id = json_get_member(membuf_elems(&conn->mb), toks, "id"); @@ -138,6 +138,7 @@ static struct command *read_json_request(const tal_t *ctx, membuf_elems(&conn->mb) + id->start); /* Putting this in cmd avoids a global, or direct exposure to users */ cmd->rpc = rpc; + cmd->methodname = json_strdup(cmd, membuf_elems(&conn->mb), method); return cmd; } @@ -474,14 +475,12 @@ static void handle_new_command(const tal_t *ctx, size_t num_commands) { struct command *cmd; - const jsmntok_t *method, *params; + const jsmntok_t *params; int reqlen; - cmd = read_json_request(ctx, request_conn, rpc_conn, - &method, ¶ms, &reqlen); + cmd = read_json_request(ctx, request_conn, rpc_conn, ¶ms, &reqlen); for (size_t i = 0; i < num_commands; i++) { - if (json_tok_streq(membuf_elems(&request_conn->mb), method, - commands[i].name)) { + if (streq(cmd->methodname, commands[i].name)) { commands[i].handle(cmd, membuf_elems(&request_conn->mb), params); membuf_consume(&request_conn->mb, reqlen); @@ -489,9 +488,7 @@ static void handle_new_command(const tal_t *ctx, } } - plugin_err("Unknown command '%.*s'", - method->end - method->start, - membuf_elems(&request_conn->mb) + method->start); + plugin_err("Unknown command '%s'", cmd->methodname); } void plugin_main(char *argv[], @@ -502,7 +499,7 @@ void plugin_main(char *argv[], struct plugin_conn request_conn, rpc_conn; const tal_t *ctx = tal(NULL, char); struct command *cmd; - const jsmntok_t *method, *params; + const jsmntok_t *params; int reqlen; struct pollfd fds[2]; @@ -523,23 +520,18 @@ void plugin_main(char *argv[], uintmap_init(&out_reqs); cmd = read_json_request(tmpctx, &request_conn, NULL, - &method, ¶ms, &reqlen); - if (!json_tok_streq(membuf_elems(&request_conn.mb), method, - "getmanifest")) { - plugin_err("Expected getmanifest not '%.*s'", - method->end - method->start, - membuf_elems(&request_conn.mb) + method->start); - } + ¶ms, &reqlen); + if (!streq(cmd->methodname, "getmanifest")) + plugin_err("Expected getmanifest not %s", cmd->methodname); + membuf_consume(&request_conn.mb, reqlen); handle_getmanifest(cmd, commands, num_commands); cmd = read_json_request(tmpctx, &request_conn, &rpc_conn, - &method, ¶ms, &reqlen); - if (!json_tok_streq(membuf_elems(&request_conn.mb), method, "init")) { - plugin_err("Expected init not '%.*s'", - method->end - method->start, - membuf_elems(&request_conn.mb) + method->start); - } + ¶ms, &reqlen); + if (!streq(cmd->methodname, "init")) + plugin_err("Expected init not %s", cmd->methodname); + handle_init(cmd, membuf_elems(&request_conn.mb), params, init); membuf_consume(&request_conn.mb, reqlen);