get_peer_list IPC

This commit is contained in:
Oran Juice 2015-06-10 20:47:33 +05:30
parent 44c3ad69b4
commit eec95a71d5
No known key found for this signature in database
GPG Key ID: 71C5AF46CCB28124
10 changed files with 525 additions and 36 deletions

View File

@ -28,6 +28,8 @@
//
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
//TODO: Recheck memory leaks
#include "daemon_ipc_handlers.h"
#include <iostream>
@ -362,5 +364,57 @@ namespace IPC
wap_proto_set_grey_peerlist_size(message, p2p->get_peerlist_manager().get_gray_peers_count());
wap_proto_set_status(message, STATUS_OK);
}
void get_peer_list(wap_proto_t *message) {
std::list<nodetool::peerlist_entry> white_list;
std::list<nodetool::peerlist_entry> gray_list;
p2p->get_peerlist_manager().get_peerlist_full(white_list, gray_list);
rapidjson::Document white_list_json;
white_list_json.SetObject();
rapidjson::Document::AllocatorType &white_list_allocator = white_list_json.GetAllocator();
rapidjson::Value white_peers(rapidjson::kArrayType);
for (auto & entry : white_list) {
rapidjson::Value output(rapidjson::kObjectType);
output.AddMember("id", entry.id, white_list_allocator);
output.AddMember("ip", entry.adr.ip, white_list_allocator);
output.AddMember("port", entry.adr.port, white_list_allocator);
output.AddMember("last_seen", entry.last_seen, white_list_allocator);
white_peers.PushBack(output, white_list_allocator);
}
white_list_json.AddMember("peers", white_peers, white_list_allocator);
rapidjson::Document gray_list_json;
gray_list_json.SetObject();
rapidjson::Document::AllocatorType &gray_list_allocator = gray_list_json.GetAllocator();
rapidjson::Value gray_peers(rapidjson::kArrayType);
for (auto & entry : gray_list) {
rapidjson::Value output(rapidjson::kObjectType);
output.AddMember("id", entry.id, gray_list_allocator);
output.AddMember("ip", entry.adr.ip, gray_list_allocator);
output.AddMember("port", entry.adr.port, gray_list_allocator);
output.AddMember("last_seen", entry.last_seen, gray_list_allocator);
gray_peers.PushBack(output, gray_list_allocator);
}
gray_list_json.AddMember("peers", gray_peers, gray_list_allocator);
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
white_list_json.Accept(writer);
std::string white_list_string = buffer.GetString();
zframe_t *white_list_frame = zframe_new(white_list_string.c_str(), white_list_string.length());
buffer.Clear();
gray_list_json.Accept(writer);
std::string gray_list_string = buffer.GetString();
zframe_t *gray_list_frame = zframe_new(gray_list_string.c_str(), gray_list_string.length());
wap_proto_set_white_list(message, &white_list_frame);
wap_proto_set_gray_list(message, &gray_list_frame);
wap_proto_set_status(message, STATUS_OK);
}
}
}

View File

@ -77,6 +77,7 @@ namespace IPC
void get_height(wap_proto_t *message);
void save_bc(wap_proto_t *message);
void get_info(wap_proto_t *message);
void get_peer_list(wap_proto_t *message);
void init(cryptonote::core &p_core,
nodetool::node_server<cryptonote::t_cryptonote_protocol_handler<cryptonote::core> > &p_p2p,
bool p_testnet);

View File

@ -117,6 +117,11 @@ WAP_EXPORT int
WAP_EXPORT int
wap_client_stop (wap_client_t *self);
// Get peer list
// Returns >= 0 if successful, -1 if interrupted.
WAP_EXPORT int
wap_client_get_peer_list (wap_client_t *self);
// Return last received status
WAP_EXPORT int
wap_client_status (wap_client_t *self);
@ -189,6 +194,14 @@ WAP_EXPORT uint64_t
WAP_EXPORT uint64_t
wap_client_grey_peerlist_size (wap_client_t *self);
// Return last received white_list
WAP_EXPORT zframe_t *
wap_client_white_list (wap_client_t *self);
// Return last received gray_list
WAP_EXPORT zframe_t *
wap_client_gray_list (wap_client_t *self);
// Self test of this class
WAP_EXPORT void
wap_client_test (bool verbose);

View File

@ -34,10 +34,11 @@ typedef enum {
expect_random_outs_ok_state = 11,
expect_get_height_ok_state = 12,
expect_get_info_ok_state = 13,
expect_close_ok_state = 14,
defaults_state = 15,
have_error_state = 16,
reexpect_open_ok_state = 17
expect_get_peer_list_ok_state = 14,
expect_close_ok_state = 15,
defaults_state = 16,
have_error_state = 17,
reexpect_open_ok_state = 18
} state_t;
typedef enum {
@ -56,23 +57,25 @@ typedef enum {
random_outs_event = 12,
get_height_event = 13,
get_info_event = 14,
destructor_event = 15,
blocks_ok_event = 16,
get_ok_event = 17,
put_ok_event = 18,
save_bc_ok_event = 19,
start_ok_event = 20,
stop_ok_event = 21,
output_indexes_ok_event = 22,
random_outs_ok_event = 23,
get_height_ok_event = 24,
get_info_ok_event = 25,
close_ok_event = 26,
ping_ok_event = 27,
error_event = 28,
exception_event = 29,
command_invalid_event = 30,
other_event = 31
get_peer_list_event = 15,
destructor_event = 16,
blocks_ok_event = 17,
get_ok_event = 18,
put_ok_event = 19,
save_bc_ok_event = 20,
start_ok_event = 21,
stop_ok_event = 22,
output_indexes_ok_event = 23,
random_outs_ok_event = 24,
get_height_ok_event = 25,
get_info_ok_event = 26,
get_peer_list_ok_event = 27,
close_ok_event = 28,
ping_ok_event = 29,
error_event = 30,
exception_event = 31,
command_invalid_event = 32,
other_event = 33
} event_t;
// Names for state machine logging and error reporting
@ -92,6 +95,7 @@ s_state_name [] = {
"expect random outs ok",
"expect get height ok",
"expect get info ok",
"expect get peer list ok",
"expect close ok",
"defaults",
"have error",
@ -115,6 +119,7 @@ s_event_name [] = {
"RANDOM_OUTS",
"GET_HEIGHT",
"GET_INFO",
"GET_PEER_LIST",
"destructor",
"BLOCKS_OK",
"GET_OK",
@ -126,6 +131,7 @@ s_event_name [] = {
"RANDOM_OUTS_OK",
"GET_HEIGHT_OK",
"GET_INFO_OK",
"GET_PEER_LIST_OK",
"CLOSE_OK",
"PING_OK",
"ERROR",
@ -238,6 +244,8 @@ static void
signal_have_get_height_ok (client_t *self);
static void
signal_have_get_info_ok (client_t *self);
static void
signal_have_get_peer_list_ok (client_t *self);
static void
signal_failure (client_t *self);
static void
@ -487,6 +495,12 @@ s_protocol_event (s_client_t *self, wap_proto_t *message)
case WAP_PROTO_GET_INFO_OK:
return get_info_ok_event;
break;
case WAP_PROTO_GET_PEER_LIST:
return get_peer_list_event;
break;
case WAP_PROTO_GET_PEER_LIST_OK:
return get_peer_list_ok_event;
break;
case WAP_PROTO_STOP:
return stop_event;
break;
@ -809,6 +823,18 @@ s_client_execute (s_client_t *self, event_t event)
self->state = expect_get_info_ok_state;
}
else
if (self->event == get_peer_list_event) {
if (!self->exception) {
// send GET_PEER_LIST
if (wap_client_verbose)
zsys_debug ("wap_client: $ send GET_PEER_LIST");
wap_proto_set_id (self->message, WAP_PROTO_GET_PEER_LIST);
wap_proto_send (self->message, self->dealer);
}
if (!self->exception)
self->state = expect_get_peer_list_ok_state;
}
else
if (self->event == destructor_event) {
if (!self->exception) {
// send CLOSE
@ -1320,6 +1346,51 @@ s_client_execute (s_client_t *self, event_t event)
}
break;
case expect_get_peer_list_ok_state:
if (self->event == get_peer_list_ok_event) {
if (!self->exception) {
// signal have get peer list ok
if (wap_client_verbose)
zsys_debug ("wap_client: $ signal have get peer list ok");
signal_have_get_peer_list_ok (&self->client);
}
if (!self->exception)
self->state = connected_state;
}
else
if (self->event == ping_ok_event) {
if (!self->exception) {
// client is connected
if (wap_client_verbose)
zsys_debug ("wap_client: $ client is connected");
client_is_connected (&self->client);
}
}
else
if (self->event == error_event) {
if (!self->exception) {
// check status code
if (wap_client_verbose)
zsys_debug ("wap_client: $ check status code");
check_status_code (&self->client);
}
if (!self->exception)
self->state = have_error_state;
}
else
if (self->event == exception_event) {
// No action - just logging
if (wap_client_verbose)
zsys_debug ("wap_client: $ exception");
}
else {
// Handle unexpected protocol events
// No action - just logging
if (wap_client_verbose)
zsys_debug ("wap_client: $ *");
}
break;
case expect_close_ok_state:
if (self->event == close_ok_event) {
if (!self->exception) {
@ -1623,6 +1694,10 @@ s_client_handle_cmdpipe (zloop_t *loop, zsock_t *reader, void *argument)
if (streq (method, "STOP")) {
s_client_execute (self, stop_event);
}
else
if (streq (method, "GET PEER LIST")) {
s_client_execute (self, get_peer_list_event);
}
// Cleanup pipe if any argument frames are still waiting to be eaten
if (zsock_rcvmore (self->cmdpipe)) {
zsys_error ("wap_client: trailing API command frames (%s)", method);
@ -1753,6 +1828,8 @@ struct _wap_client_t {
uint64_t incoming_connections_count; // Returned by actor reply
uint64_t white_peerlist_size; // Returned by actor reply
uint64_t grey_peerlist_size; // Returned by actor reply
zframe_t *white_list; // Returned by actor reply
zframe_t *gray_list; // Returned by actor reply
};
@ -1805,6 +1882,8 @@ wap_client_destroy (wap_client_t **self_p)
zchunk_destroy (&self->tx_data);
zframe_destroy (&self->o_indexes);
zframe_destroy (&self->random_outputs);
zframe_destroy (&self->white_list);
zframe_destroy (&self->gray_list);
free (self);
*self_p = NULL;
}
@ -1924,7 +2003,13 @@ s_accept_reply (wap_client_t *self, ...)
}
else
if (streq (reply, "STOP OK")) {
zsock_recv (self->actor, "i", &self->status);
zsock_recv (self->actor, "8", &self->status);
}
else
if (streq (reply, "GET PEER LIST OK")) {
zframe_destroy (&self->white_list);
zframe_destroy (&self->gray_list);
zsock_recv (self->actor, "8pp", &self->status, &self->white_list, &self->gray_list);
}
break;
}
@ -2143,6 +2228,22 @@ wap_client_stop (wap_client_t *self)
}
// ---------------------------------------------------------------------------
// Get peer list
// Returns >= 0 if successful, -1 if interrupted.
int
wap_client_get_peer_list (wap_client_t *self)
{
assert (self);
zsock_send (self->actor, "s", "GET PEER LIST");
if (s_accept_reply (self, "GET PEER LIST OK", "FAILURE", NULL))
return -1; // Interrupted or timed-out
return self->status;
}
// ---------------------------------------------------------------------------
// Return last received status
@ -2339,3 +2440,25 @@ wap_client_grey_peerlist_size (wap_client_t *self)
assert (self);
return self->grey_peerlist_size;
}
// ---------------------------------------------------------------------------
// Return last received white_list
zframe_t *
wap_client_white_list (wap_client_t *self)
{
assert (self);
return self->white_list;
}
// ---------------------------------------------------------------------------
// Return last received gray_list
zframe_t *
wap_client_gray_list (wap_client_t *self)
{
assert (self);
return self->gray_list;
}

View File

@ -104,6 +104,13 @@ ERROR.
white_peerlist_size number 8 White Peerlist Size
grey_peerlist_size number 8 Grey Peerlist Size
GET_PEER_LIST - get_peer_list IPC
GET_PEER_LIST_OK - This is a codec for a Bitcoin Wallet Access Protocol (RFC tbd)
status number 8 Status
white_list frame White list
gray_list frame Gray list
STOP - Wallet asks daemon to start mining. Daemon replies with STOP-OK, or
ERROR.
@ -155,13 +162,15 @@ Daemon will reply with CLOSE-OK or ERROR.
#define WAP_PROTO_START_OK 18
#define WAP_PROTO_GET_INFO 19
#define WAP_PROTO_GET_INFO_OK 20
#define WAP_PROTO_STOP 21
#define WAP_PROTO_STOP_OK 22
#define WAP_PROTO_CLOSE 23
#define WAP_PROTO_CLOSE_OK 24
#define WAP_PROTO_PING 25
#define WAP_PROTO_PING_OK 26
#define WAP_PROTO_ERROR 27
#define WAP_PROTO_GET_PEER_LIST 21
#define WAP_PROTO_GET_PEER_LIST_OK 22
#define WAP_PROTO_STOP 23
#define WAP_PROTO_STOP_OK 24
#define WAP_PROTO_CLOSE 25
#define WAP_PROTO_CLOSE_OK 26
#define WAP_PROTO_PING 27
#define WAP_PROTO_PING_OK 28
#define WAP_PROTO_ERROR 29
#include <czmq.h>
@ -397,6 +406,26 @@ uint64_t
void
wap_proto_set_grey_peerlist_size (wap_proto_t *self, uint64_t grey_peerlist_size);
// Get a copy of the white_list field
zframe_t *
wap_proto_white_list (wap_proto_t *self);
// Get the white_list field and transfer ownership to caller
zframe_t *
wap_proto_get_white_list (wap_proto_t *self);
// Set the white_list field, transferring ownership from caller
void
wap_proto_set_white_list (wap_proto_t *self, zframe_t **frame_p);
// Get a copy of the gray_list field
zframe_t *
wap_proto_gray_list (wap_proto_t *self);
// Get the gray_list field and transfer ownership to caller
zframe_t *
wap_proto_get_gray_list (wap_proto_t *self);
// Set the gray_list field, transferring ownership from caller
void
wap_proto_set_gray_list (wap_proto_t *self, zframe_t **frame_p);
// Get/set the reason field
const char *
wap_proto_reason (wap_proto_t *self);

View File

@ -41,11 +41,12 @@ typedef enum {
random_outs_event = 10,
get_height_event = 11,
get_info_event = 12,
close_event = 13,
ping_event = 14,
expired_event = 15,
exception_event = 16,
settled_event = 17
get_peer_list_event = 13,
close_event = 14,
ping_event = 15,
expired_event = 16,
exception_event = 17,
settled_event = 18
} event_t;
// Names for state machine logging and error reporting
@ -73,6 +74,7 @@ s_event_name [] = {
"RANDOM_OUTS",
"GET_HEIGHT",
"GET_INFO",
"GET_PEER_LIST",
"CLOSE",
"PING",
"expired",
@ -162,6 +164,8 @@ static void
height (client_t *self);
static void
getinfo (client_t *self);
static void
get_peer_list (client_t *self);
static void
deregister_wallet (client_t *self);
static void
@ -376,6 +380,9 @@ s_protocol_event (wap_proto_t *message)
case WAP_PROTO_GET_INFO:
return get_info_event;
break;
case WAP_PROTO_GET_PEER_LIST:
return get_peer_list_event;
break;
case WAP_PROTO_STOP:
return stop_event;
break;
@ -774,6 +781,24 @@ s_client_execute (s_client_t *self, event_t event)
}
}
else
if (self->event == get_peer_list_event) {
if (!self->exception) {
// get peer list
if (self->server->verbose)
zsys_debug ("%s: $ get peer list", self->log_prefix);
get_peer_list (&self->client);
}
if (!self->exception) {
// send GET_PEER_LIST_OK
if (self->server->verbose)
zsys_debug ("%s: $ send GET_PEER_LIST_OK",
self->log_prefix);
wap_proto_set_id (self->server->message, WAP_PROTO_GET_PEER_LIST_OK);
wap_proto_set_routing_id (self->server->message, self->routing_id);
wap_proto_send (self->server->message, self->server->router);
}
}
else
if (self->event == close_event) {
if (!self->exception) {
// send CLOSE_OK

View File

@ -396,3 +396,16 @@ signal_have_get_info_ok (client_t *self)
wap_proto_white_peerlist_size (self->message),
wap_proto_grey_peerlist_size (self->message));
}
// ---------------------------------------------------------------------------
// signal_have_get_get_peer_list_ok
//
static void
signal_have_get_peer_list_ok (client_t *self)
{
zsock_send (self->cmdpipe, "s8pp", "GET PEER LIST OK",
wap_proto_status (self->message),
wap_proto_get_white_list (self->message),
wap_proto_get_gray_list (self->message));
}

View File

@ -59,6 +59,8 @@ struct _wap_proto_t {
uint64_t incoming_connections_count; // Incoming Connections Count
uint64_t white_peerlist_size; // White Peerlist Size
uint64_t grey_peerlist_size; // Grey Peerlist Size
zframe_t *white_list; // White list
zframe_t *gray_list; // Gray list
char reason [256]; // Printable explanation
};
@ -245,6 +247,8 @@ wap_proto_destroy (wap_proto_t **self_p)
zframe_destroy (&self->random_outputs);
zchunk_destroy (&self->tx_data);
zchunk_destroy (&self->address);
zframe_destroy (&self->white_list);
zframe_destroy (&self->gray_list);
// Free object itself
free (self);
@ -488,6 +492,27 @@ wap_proto_recv (wap_proto_t *self, zsock_t *input)
GET_NUMBER8 (self->grey_peerlist_size);
break;
case WAP_PROTO_GET_PEER_LIST:
break;
case WAP_PROTO_GET_PEER_LIST_OK:
GET_NUMBER8 (self->status);
// Get next frame off socket
if (!zsock_rcvmore (input)) {
zsys_warning ("wap_proto: white_list is missing");
goto malformed;
}
zframe_destroy (&self->white_list);
self->white_list = zframe_recv (input);
// Get next frame off socket
if (!zsock_rcvmore (input)) {
zsys_warning ("wap_proto: gray_list is missing");
goto malformed;
}
zframe_destroy (&self->gray_list);
self->gray_list = zframe_recv (input);
break;
case WAP_PROTO_STOP:
break;
@ -624,6 +649,9 @@ wap_proto_send (wap_proto_t *self, zsock_t *output)
frame_size += 8; // white_peerlist_size
frame_size += 8; // grey_peerlist_size
break;
case WAP_PROTO_GET_PEER_LIST_OK:
frame_size += 8; // status
break;
case WAP_PROTO_ERROR:
frame_size += 2; // status
frame_size += 1 + strlen (self->reason);
@ -774,6 +802,12 @@ wap_proto_send (wap_proto_t *self, zsock_t *output)
PUT_NUMBER8 (self->grey_peerlist_size);
break;
case WAP_PROTO_GET_PEER_LIST_OK:
PUT_NUMBER8 (self->status);
nbr_frames++;
nbr_frames++;
break;
case WAP_PROTO_ERROR:
PUT_NUMBER2 (self->status);
PUT_STRING (self->reason);
@ -807,6 +841,19 @@ wap_proto_send (wap_proto_t *self, zsock_t *output)
else
zmq_send (zsock_resolve (output), NULL, 0, (--nbr_frames? ZMQ_SNDMORE: 0));
}
// Now send any frame fields, in order
if (self->id == WAP_PROTO_GET_PEER_LIST_OK) {
// If white_list isn't set, send an empty frame
if (self->white_list)
zframe_send (&self->white_list, output, ZFRAME_REUSE + (--nbr_frames? ZFRAME_MORE: 0));
else
zmq_send (zsock_resolve (output), NULL, 0, (--nbr_frames? ZMQ_SNDMORE: 0));
// If gray_list isn't set, send an empty frame
if (self->gray_list)
zframe_send (&self->gray_list, output, ZFRAME_REUSE + (--nbr_frames? ZFRAME_MORE: 0));
else
zmq_send (zsock_resolve (output), NULL, 0, (--nbr_frames? ZMQ_SNDMORE: 0));
}
// Now send the block_data if necessary
if (have_block_data) {
if (self->block_data) {
@ -971,6 +1018,25 @@ wap_proto_print (wap_proto_t *self)
zsys_debug (" grey_peerlist_size=%ld", (long) self->grey_peerlist_size);
break;
case WAP_PROTO_GET_PEER_LIST:
zsys_debug ("WAP_PROTO_GET_PEER_LIST:");
break;
case WAP_PROTO_GET_PEER_LIST_OK:
zsys_debug ("WAP_PROTO_GET_PEER_LIST_OK:");
zsys_debug (" status=%ld", (long) self->status);
zsys_debug (" white_list=");
if (self->white_list)
zframe_print (self->white_list, NULL);
else
zsys_debug ("(NULL)");
zsys_debug (" gray_list=");
if (self->gray_list)
zframe_print (self->gray_list, NULL);
else
zsys_debug ("(NULL)");
break;
case WAP_PROTO_STOP:
zsys_debug ("WAP_PROTO_STOP:");
break;
@ -1108,6 +1174,12 @@ wap_proto_command (wap_proto_t *self)
case WAP_PROTO_GET_INFO_OK:
return ("GET_INFO_OK");
break;
case WAP_PROTO_GET_PEER_LIST:
return ("GET_PEER_LIST");
break;
case WAP_PROTO_GET_PEER_LIST_OK:
return ("GET_PEER_LIST_OK");
break;
case WAP_PROTO_STOP:
return ("STOP");
break;
@ -1724,6 +1796,72 @@ wap_proto_set_grey_peerlist_size (wap_proto_t *self, uint64_t grey_peerlist_size
}
// --------------------------------------------------------------------------
// Get the white_list field without transferring ownership
zframe_t *
wap_proto_white_list (wap_proto_t *self)
{
assert (self);
return self->white_list;
}
// Get the white_list field and transfer ownership to caller
zframe_t *
wap_proto_get_white_list (wap_proto_t *self)
{
zframe_t *white_list = self->white_list;
self->white_list = NULL;
return white_list;
}
// Set the white_list field, transferring ownership from caller
void
wap_proto_set_white_list (wap_proto_t *self, zframe_t **frame_p)
{
assert (self);
assert (frame_p);
zframe_destroy (&self->white_list);
self->white_list = *frame_p;
*frame_p = NULL;
}
// --------------------------------------------------------------------------
// Get the gray_list field without transferring ownership
zframe_t *
wap_proto_gray_list (wap_proto_t *self)
{
assert (self);
return self->gray_list;
}
// Get the gray_list field and transfer ownership to caller
zframe_t *
wap_proto_get_gray_list (wap_proto_t *self)
{
zframe_t *gray_list = self->gray_list;
self->gray_list = NULL;
return gray_list;
}
// Set the gray_list field, transferring ownership from caller
void
wap_proto_set_gray_list (wap_proto_t *self, zframe_t **frame_p)
{
assert (self);
assert (frame_p);
zframe_destroy (&self->gray_list);
self->gray_list = *frame_p;
*frame_p = NULL;
}
// --------------------------------------------------------------------------
// Get/set the reason field
@ -2079,6 +2217,36 @@ wap_proto_test (bool verbose)
assert (wap_proto_white_peerlist_size (self) == 123);
assert (wap_proto_grey_peerlist_size (self) == 123);
}
wap_proto_set_id (self, WAP_PROTO_GET_PEER_LIST);
// Send twice
wap_proto_send (self, output);
wap_proto_send (self, output);
for (instance = 0; instance < 2; instance++) {
wap_proto_recv (self, input);
assert (wap_proto_routing_id (self));
}
wap_proto_set_id (self, WAP_PROTO_GET_PEER_LIST_OK);
wap_proto_set_status (self, 123);
zframe_t *get_peer_list_ok_white_list = zframe_new ("Captcha Diem", 12);
wap_proto_set_white_list (self, &get_peer_list_ok_white_list);
zframe_t *get_peer_list_ok_gray_list = zframe_new ("Captcha Diem", 12);
wap_proto_set_gray_list (self, &get_peer_list_ok_gray_list);
// Send twice
wap_proto_send (self, output);
wap_proto_send (self, output);
for (instance = 0; instance < 2; instance++) {
wap_proto_recv (self, input);
assert (wap_proto_routing_id (self));
assert (wap_proto_status (self) == 123);
assert (zframe_streq (wap_proto_white_list (self), "Captcha Diem"));
zframe_destroy (&get_peer_list_ok_white_list);
assert (zframe_streq (wap_proto_gray_list (self), "Captcha Diem"));
zframe_destroy (&get_peer_list_ok_gray_list);
}
wap_proto_set_id (self, WAP_PROTO_STOP);
// Send twice

View File

@ -300,3 +300,13 @@ getinfo (client_t *self)
{
IPC::Daemon::get_info(self->message);
}
// ---------------------------------------------------------------------------
// get_peer_list
//
static void
get_peer_list (client_t *self)
{
IPC::Daemon::get_peer_list(self->message);
}

View File

@ -18,7 +18,7 @@
#include "daemon_deprecated_rpc.h"
#include <stdexcept>
#define MAX_RESPONSE_SIZE 2000
#define MAX_RESPONSE_SIZE 100000
/*!
* \namespace
@ -56,7 +56,7 @@ namespace
* It also adds boilerplate properties like id, method.
* \param req net_skeleton request object
* \param result_json rapidjson result object
* \param response_json Root rapidjson document that will eventually have the whole response
* \param response_json "Root" rapidjson document that will eventually have the whole response
* \param response Response as a string gets written here.
*/
void construct_response_string(struct ns_rpc_request *req, rapidjson::Value &result_json,
@ -246,12 +246,64 @@ namespace
return response.length();
}
/*!
* \brief Implementation of 'getpeerlist' method.
* \param buf Buffer to fill in response.
* \param len Max length of response.
* \param req net_skeleton RPC request
* \return Actual response length.
*/
int getpeerlist(char *buf, int len, struct ns_rpc_request *req)
{
connect_to_daemon();
int rc = wap_client_get_peer_list(ipc_client);
if (rc < 0) {
return ns_rpc_create_error(buf, len, req, daemon_connection_error,
"Couldn't connect to daemon.", "{}");
}
rapidjson::Document response_json;
rapidjson::Document::AllocatorType &allocator = response_json.GetAllocator();
rapidjson::Value result_json;
result_json.SetObject();
zframe_t *white_list_frame = wap_client_white_list(ipc_client);
rapidjson::Document white_list_json;
char *data = reinterpret_cast<char*>(zframe_data(white_list_frame));
size_t size = zframe_size(white_list_frame);
if (white_list_json.Parse(data, size).HasParseError()) {
return ns_rpc_create_error(buf, len, req, internal_error,
"Couldn't parse JSON sent by daemon.", "{}");
}
result_json.AddMember("white_list", white_list_json["peers"], allocator);
zframe_t *gray_list_frame = wap_client_gray_list(ipc_client);
rapidjson::Document gray_list_json;
data = reinterpret_cast<char*>(zframe_data(gray_list_frame));
size = zframe_size(gray_list_frame);
if (gray_list_json.Parse(data, size).HasParseError()) {
return ns_rpc_create_error(buf, len, req, internal_error,
"Couldn't parse JSON sent by daemon.", "{}");
}
result_json.AddMember("gray_list", gray_list_json["peers"], allocator);
std::string response;
construct_response_string(req, result_json, response_json, response);
size_t copy_length = ((uint32_t)len > response.length()) ? response.length() + 1 : (uint32_t)len;
strncpy(buf, response.c_str(), copy_length);
return response.length();
}
// Contains a list of method names.
const char *method_names[] = {
"getheight",
"startmining",
"stopmining",
"getinfo",
"getpeerlist",
NULL
};
@ -261,6 +313,7 @@ namespace
startmining,
stopmining,
getinfo,
getpeerlist,
NULL
};