static void json_start_member(struct json_result *result, const char *fieldname) { /* Prepend comma if required. */ if (result->s[0] && !result_ends_with(result, "{ ") && !result_ends_with(result, "[ ")) result_append(result, ", "); if (fieldname) result_append_fmt(result, "\"%s\" : ", fieldname); }
void json_add_string(struct json_result *result, const char *fieldname, const char *value) { json_start_member(result, fieldname); result_append_fmt(result, "\"%s\"", value); }
void json_add_literal(struct json_result *result, const char *fieldname, const char *literal, int len) { json_start_member(result, fieldname); result_append_fmt(result, "%.*s", len, literal); }
void json_add_u64(struct json_result *result, const char *fieldname, uint64_t value) { json_start_member(result, fieldname); result_append_fmt(result, "%"PRIu64, value); }
void json_add_num(struct json_result *result, const char *fieldname, unsigned int value) { json_start_member(result, fieldname); result_append_fmt(result, "%u", value); }
static char *ask_process(const tal_t *ctx, const char *name, const char *arg1, const char *arg2, const char *arg3, const char *arg4, const char *arg5) { struct json_result *response = new_json_result(ctx); if (streq(name, "bitcoind")) { assert(streq(arg1, "-testnet")); if (streq(arg2, "listtransactions")) { unsigned int i, num, skip; assert(streq(arg3, "gateway")); num = atoi(arg4 ? arg4 : "10"); assert(num); skip = atoi(arg5 ? arg5 : "0"); json_array_start(response, NULL); /* Like bitcoind, list oldest first. */ for (i = skip; i < skip+num; i++) { unsigned int confs; if (i >= ARRAY_SIZE(listtxs_response)) break; /* We only show one the first time. */ if (i > sleeps) break; /* First one is 16 confs, then 4, 1, then 0, * plus one each time you ask. */ confs = (1 << ((ARRAY_SIZE(listtxs_response) - i) * 2)) + sleeps; result_append_fmt(response, listtxs_response[i], confs); } json_array_end(response); assert(!response->indent); return response->s; } else if (streq(arg2, "getrawtransaction")) { unsigned int i; /* We only do verbose mode */ assert(streq(arg4, "1")); assert(arg5 == NULL); /* Search through responses for this txid */ for (i = 0; i < ARRAY_SIZE(getrawtxs_response); i++) { const char *p; p = strstr(getrawtxs_response[i], " \"txid\" : \""); if (strstarts(p + strlen(" \"txid\" : \""), arg3)) return tal_strdup(ctx, getrawtxs_response[i]); } } else if (streq(arg2, "getinfo")) { return tal_strdup(ctx, getinfo_response); } else if (streq(arg2, "sendtoaddress")) { if (mark_off_payment(arg3, amount_in_satoshis(arg4, strlen(arg4)))) return tal_strdup(ctx, "some-new-bitcoin-txid"); } } else if (streq(name, "pettycoin-tx")) { assert(streq(arg1, "--no-fee")); assert(streq(arg2, "from-gateway")); assert(streq(arg3, "FAKE-gateway-privkey")); if (mark_off_payment(arg4, atol(arg5))) return tal_fmt(ctx, "raw-transaction-%s", arg4); } else if (streq(name, "pettycoin-query")) { assert(streq(arg1, "sendrawtransaction")); assert(strstarts(arg2, "raw-transaction-")); assert(arg3 == NULL); assert(arg4 == NULL); assert(arg5 == NULL); return tal_fmt(ctx, "txid for %s", arg2); } printf("ask_process: name=%s arg1=%s arg2=%s arg3=%s arg4=%s arg5=%s", name, arg1, arg2, arg3, arg4, arg5); return NULL; }