ZmnSCPxj
7 years ago
committed by
Rusty Russell
14 changed files with 204 additions and 168 deletions
@ -0,0 +1,134 @@ |
|||
#include "json.h" |
|||
#include <arpa/inet.h> |
|||
#include <ccan/str/hex/hex.h> |
|||
#include <common/json.h> |
|||
#include <common/type_to_string.h> |
|||
#include <common/wireaddr.h> |
|||
#include <gossipd/routing.h> |
|||
#include <lightningd/options.h> |
|||
#include <sys/socket.h> |
|||
#include <wallet/wallet.h> |
|||
|
|||
/* Output a route hop */ |
|||
static void |
|||
json_add_route_hop(struct json_result *r, char const *n, |
|||
const struct route_hop *h) |
|||
{ |
|||
/* Imitate what getroute/sendpay use */ |
|||
json_object_start(r, n); |
|||
json_add_pubkey(r, "id", &h->nodeid); |
|||
json_add_short_channel_id(r, "channel", |
|||
&h->channel_id); |
|||
json_add_u64(r, "msatoshi", h->amount); |
|||
json_add_num(r, "delay", h->delay); |
|||
json_object_end(r); |
|||
} |
|||
|
|||
/* Output a route */ |
|||
void |
|||
json_add_route(struct json_result *r, char const *n, |
|||
const struct route_hop *hops, size_t hops_len) |
|||
{ |
|||
size_t i; |
|||
json_array_start(r, n); |
|||
for (i = 0; i < hops_len; ++i) { |
|||
json_add_route_hop(r, NULL, &hops[i]); |
|||
} |
|||
json_array_end(r); |
|||
} |
|||
|
|||
/* Outputs fields, not a separate object*/ |
|||
void |
|||
json_add_payment_fields(struct json_result *response, |
|||
const struct wallet_payment *t) |
|||
{ |
|||
json_add_u64(response, "id", t->id); |
|||
json_add_hex(response, "payment_hash", &t->payment_hash, sizeof(t->payment_hash)); |
|||
json_add_pubkey(response, "destination", &t->destination); |
|||
json_add_u64(response, "msatoshi", t->msatoshi); |
|||
if (deprecated_apis) |
|||
json_add_u64(response, "timestamp", t->timestamp); |
|||
json_add_u64(response, "created_at", t->timestamp); |
|||
|
|||
switch (t->status) { |
|||
case PAYMENT_PENDING: |
|||
json_add_string(response, "status", "pending"); |
|||
break; |
|||
case PAYMENT_COMPLETE: |
|||
json_add_string(response, "status", "complete"); |
|||
break; |
|||
case PAYMENT_FAILED: |
|||
json_add_string(response, "status", "failed"); |
|||
break; |
|||
} |
|||
if (t->payment_preimage) |
|||
json_add_hex(response, "payment_preimage", |
|||
t->payment_preimage, |
|||
sizeof(*t->payment_preimage)); |
|||
} |
|||
|
|||
void json_add_pubkey(struct json_result *response, |
|||
const char *fieldname, |
|||
const struct pubkey *key) |
|||
{ |
|||
u8 der[PUBKEY_DER_LEN]; |
|||
|
|||
pubkey_to_der(der, key); |
|||
json_add_hex(response, fieldname, der, sizeof(der)); |
|||
} |
|||
|
|||
void json_add_txid(struct json_result *result, const char *fieldname, |
|||
const struct bitcoin_txid *txid) |
|||
{ |
|||
char hex[hex_str_size(sizeof(*txid))]; |
|||
|
|||
bitcoin_txid_to_hex(txid, hex, sizeof(hex)); |
|||
json_add_string(result, fieldname, hex); |
|||
} |
|||
|
|||
bool json_tok_pubkey(const char *buffer, const jsmntok_t *tok, |
|||
struct pubkey *pubkey) |
|||
{ |
|||
return pubkey_from_hexstr(buffer + tok->start, |
|||
tok->end - tok->start, pubkey); |
|||
} |
|||
|
|||
void json_add_short_channel_id(struct json_result *response, |
|||
const char *fieldname, |
|||
const struct short_channel_id *id) |
|||
{ |
|||
json_add_string(response, fieldname, |
|||
type_to_string(response, struct short_channel_id, id)); |
|||
} |
|||
|
|||
bool json_tok_short_channel_id(const char *buffer, const jsmntok_t *tok, |
|||
struct short_channel_id *scid) |
|||
{ |
|||
return short_channel_id_from_str(buffer + tok->start, |
|||
tok->end - tok->start, |
|||
scid); |
|||
} |
|||
|
|||
void json_add_address(struct json_result *response, const char *fieldname, |
|||
const struct wireaddr *addr) |
|||
{ |
|||
/* No need to print padding */ |
|||
if (addr->type == ADDR_TYPE_PADDING) |
|||
return; |
|||
|
|||
json_object_start(response, fieldname); |
|||
char *addrstr = tal_arr(response, char, INET6_ADDRSTRLEN); |
|||
if (addr->type == ADDR_TYPE_IPV4) { |
|||
inet_ntop(AF_INET, addr->addr, addrstr, INET_ADDRSTRLEN); |
|||
json_add_string(response, "type", "ipv4"); |
|||
json_add_string(response, "address", addrstr); |
|||
json_add_num(response, "port", addr->port); |
|||
} else if (addr->type == ADDR_TYPE_IPV6) { |
|||
inet_ntop(AF_INET6, addr->addr, addrstr, INET6_ADDRSTRLEN); |
|||
json_add_string(response, "type", "ipv6"); |
|||
json_add_string(response, "address", addrstr); |
|||
json_add_num(response, "port", addr->port); |
|||
} |
|||
json_object_end(response); |
|||
} |
|||
|
@ -0,0 +1,58 @@ |
|||
/* lightningd/json.h
|
|||
* Helpers for outputting JSON results that are specific only for |
|||
* lightningd. |
|||
*/ |
|||
#ifndef LIGHTNING_LIGHTNINGD_JSON_H |
|||
#define LIGHTNING_LIGHTNINGD_JSON_H |
|||
#include "config.h" |
|||
#include <stdbool.h> |
|||
#include <stddef.h> |
|||
|
|||
#define JSMN_STRICT 1 |
|||
# include <external/jsmn/jsmn.h> |
|||
|
|||
struct bitcoin_txid; |
|||
struct json_result; |
|||
struct pubkey; |
|||
struct route_hop; |
|||
struct short_channel_id; |
|||
struct wallet_payment; |
|||
struct wireaddr; |
|||
|
|||
/* Output a route array. */ |
|||
void json_add_route(struct json_result *r, char const *n, |
|||
const struct route_hop *hops, size_t hops_len); |
|||
|
|||
/* Output the fields of a wallet payment.
|
|||
* Should be used within an object context. */ |
|||
void json_add_payment_fields(struct json_result *response, |
|||
const struct wallet_payment *t); |
|||
|
|||
/* '"fieldname" : "0289abcdef..."' or "0289abcdef..." if fieldname is NULL */ |
|||
void json_add_pubkey(struct json_result *response, |
|||
const char *fieldname, |
|||
const struct pubkey *key); |
|||
|
|||
/* '"fieldname" : <hexrev>' or "<hexrev>" if fieldname is NULL */ |
|||
void json_add_txid(struct json_result *result, const char *fieldname, |
|||
const struct bitcoin_txid *txid); |
|||
|
|||
/* Extract a pubkey from this */ |
|||
bool json_tok_pubkey(const char *buffer, const jsmntok_t *tok, |
|||
struct pubkey *pubkey); |
|||
|
|||
/* Extract a short_channel_id from this */ |
|||
bool json_tok_short_channel_id(const char *buffer, const jsmntok_t *tok, |
|||
struct short_channel_id *scid); |
|||
|
|||
/* '"fieldname" : "1234:5:6"' */ |
|||
void json_add_short_channel_id(struct json_result *response, |
|||
const char *fieldname, |
|||
const struct short_channel_id *id); |
|||
|
|||
/* JSON serialize a network address for a node */ |
|||
void json_add_address(struct json_result *response, const char *fieldname, |
|||
const struct wireaddr *addr); |
|||
|
|||
|
|||
#endif /* !defined (LIGHTNING_LIGHTNINGD_JSON_H) */ |
Loading…
Reference in new issue