#ifndef LIGHTNING_LIGHTNINGD_JSONRPC_H #define LIGHTNING_LIGHTNINGD_JSONRPC_H #include "config.h" #include #include #include #include struct bitcoin_txid; struct wireaddr; struct wallet_tx; /* Context for a command (from JSON, but might outlive the connection!) * You can allocate off this for temporary objects. */ struct command { /* Off jcon->commands */ struct list_node list; /* The global state */ struct lightningd *ld; /* The 'id' which we need to include in the response. */ const char *id; /* The connection, or NULL if it closed. */ struct json_connection *jcon; /* Have we been marked by command_still_pending? For debugging... */ bool pending; }; struct json_connection { /* The global state */ struct lightningd *ld; /* Logging for this json connection. */ struct log *log; /* The buffer (required to interpret tokens). */ char *buffer; /* Internal state: */ /* How much is already filled. */ size_t used; /* How much has just been filled. */ size_t len_read; /* We've been told to stop. */ bool stop; /* Current commands. */ struct list_head commands; struct list_head output; const char *outbuf; }; struct json_command { const char *name; void (*dispatch)(struct command *, const char *buffer, const jsmntok_t *params); const char *description; bool deprecated; const char *verbose; }; /* Get the parameters (by position or name). Followed by triples of * of const char *name, const jsmntok_t **ret_ptr, then NULL. * * If name starts with '?' it is optional (and will be set to NULL * if it's a literal 'null' or not present). * Otherwise false is returned, and command_fail already called. */ bool json_get_params(struct command *cmd, const char *buffer, const jsmntok_t param[], ...); struct json_result *null_response(const tal_t *ctx); void command_success(struct command *cmd, struct json_result *response); void PRINTF_FMT(2, 3) command_fail(struct command *cmd, const char *fmt, ...); void PRINTF_FMT(4, 5) command_fail_detailed(struct command *cmd, int code, const struct json_result *data, const char *fmt, ...); /* Mainly for documentation, that we plan to close this later. */ void command_still_pending(struct command *cmd); /* For initialization */ void setup_jsonrpc(struct lightningd *ld, const char *rpc_filename); enum address_parse_result { /* Not recognized as an onchain address */ ADDRESS_PARSE_UNRECOGNIZED, /* Recognized as an onchain address, but targets wrong network */ ADDRESS_PARSE_WRONG_NETWORK, /* Recognized and succeeds */ ADDRESS_PARSE_SUCCESS, }; /* Return result of address parsing and fills in *scriptpubkey * allocated off ctx if ADDRESS_PARSE_SUCCESS */ enum address_parse_result json_tok_address_scriptpubkey(const tal_t *ctx, const struct chainparams *chainparams, const char *buffer, const jsmntok_t *tok, const u8 **scriptpubkey); /* Parse the satoshi token in wallet_tx. */ bool json_tok_wtx(struct wallet_tx * tx, const char * buffer, const jsmntok_t * sattok); AUTODATA_TYPE(json_command, struct json_command); #endif /* LIGHTNING_LIGHTNINGD_JSONRPC_H */