Added convenience method to peerstore, and fixed memory leak
This commit is contained in:
parent
5e1704aaba
commit
365e645d94
3 changed files with 28 additions and 8 deletions
|
@ -79,6 +79,13 @@ struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, c
|
||||||
*/
|
*/
|
||||||
struct Libp2pPeer* libp2p_peerstore_get_peer(struct Peerstore* peerstore, const unsigned char* peer_id, size_t peer_id_size);
|
struct Libp2pPeer* libp2p_peerstore_get_peer(struct Peerstore* peerstore, const unsigned char* peer_id, size_t peer_id_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the local peer, which is always the first in the collection
|
||||||
|
* @param peerstore the peerstore
|
||||||
|
* @returns the first Libp2pPeer in the collection
|
||||||
|
*/
|
||||||
|
struct Libp2pPeer* libp2p_peerstore_get_local_peer(struct Peerstore* peerstore);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look for this peer in the peerstore. If it is found, return a reference to that object.
|
* Look for this peer in the peerstore. If it is found, return a reference to that object.
|
||||||
* If it is not found, add it, and return a reference to the new copy
|
* If it is not found, add it, and return a reference to the new copy
|
||||||
|
|
|
@ -187,6 +187,20 @@ struct Libp2pPeer* libp2p_peerstore_get_peer(struct Peerstore* peerstore, const
|
||||||
return entry->peer;
|
return entry->peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the local peer, which is always the first in the collection
|
||||||
|
* @param peerstore the peerstore
|
||||||
|
* @returns the first Libp2pPeer in the collection
|
||||||
|
*/
|
||||||
|
struct Libp2pPeer* libp2p_peerstore_get_local_peer(struct Peerstore* peerstore) {
|
||||||
|
struct Libp2pPeer* retVal = NULL;
|
||||||
|
if (peerstore != NULL && peerstore->head_entry != NULL && peerstore->head_entry->item != NULL) {
|
||||||
|
struct PeerEntry* entry = peerstore->head_entry->item;
|
||||||
|
retVal = entry->peer;
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Look for a peer by id. If not found, add it to the peerstore
|
* Look for a peer by id. If not found, add it to the peerstore
|
||||||
* @param peerstore the Peerstore
|
* @param peerstore the Peerstore
|
||||||
|
|
|
@ -33,7 +33,7 @@ int libp2p_routing_dht_shutdown(void* context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int libp2p_routing_dht_handle_msg(const uint8_t* incoming, size_t incoming_size, struct SessionContext* session_context, void* context) {
|
int libp2p_routing_dht_handle_msg(const uint8_t* incoming, size_t incoming_size, struct SessionContext* session_context, void* context) {
|
||||||
libp2p_logger_debug("dht_routing", "Handling incoming dht routing request.\n");
|
libp2p_logger_debug("dht_protocol", "Handling incoming dht routing request.\n");
|
||||||
struct DhtContext* ctx = (struct DhtContext*)context;
|
struct DhtContext* ctx = (struct DhtContext*)context;
|
||||||
if (!libp2p_routing_dht_handshake(session_context))
|
if (!libp2p_routing_dht_handshake(session_context))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -147,15 +147,14 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru
|
||||||
|
|
||||||
// Can I provide it locally?
|
// Can I provide it locally?
|
||||||
unsigned char buf[65535];
|
unsigned char buf[65535];
|
||||||
size_t buf_size = 0;
|
size_t buf_size = 65535;
|
||||||
if (session->datastore->datastore_get(message->key, message->key_size, &buf[0], buf_size, &buf_size, session->datastore)) {
|
if (session->datastore->datastore_get(message->key, message->key_size, &buf[0], buf_size, &buf_size, session->datastore)) {
|
||||||
// we can provide this hash from our datastore
|
// we can provide this hash from our datastore
|
||||||
|
libp2p_logger_debug("dht_protocol", "I can provide myself as a provider for this key.\n");
|
||||||
message->provider_peer_head = libp2p_utils_linked_list_new();
|
message->provider_peer_head = libp2p_utils_linked_list_new();
|
||||||
struct Libp2pPeer* local_peer = (struct Libp2pPeer*)peerstore->head_entry->item;
|
message->provider_peer_head->item = libp2p_peer_copy(libp2p_peerstore_get_local_peer(peerstore));
|
||||||
message->provider_peer_head->item = local_peer;
|
} else if (libp2p_providerstore_get(providerstore, (unsigned char*)message->key, message->key_size, &peer_id, &peer_id_size)) {
|
||||||
}
|
// Can I provide it because someone announced it earlier?
|
||||||
// Can I provide it because someone announced it earlier?
|
|
||||||
if (libp2p_providerstore_get(providerstore, (unsigned char*)message->key, message->key_size, &peer_id, &peer_id_size)) {
|
|
||||||
libp2p_logger_debug("dht_protocol", "I can provide a provider for this key.\n");
|
libp2p_logger_debug("dht_protocol", "I can provide a provider for this key.\n");
|
||||||
// we have a peer id, convert it to a peer object
|
// we have a peer id, convert it to a peer object
|
||||||
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, peer_id, peer_id_size);
|
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, peer_id, peer_id_size);
|
||||||
|
@ -163,7 +162,7 @@ int libp2p_routing_dht_handle_get_providers(struct SessionContext* session, stru
|
||||||
// add it to the message
|
// add it to the message
|
||||||
if (message->provider_peer_head == NULL) {
|
if (message->provider_peer_head == NULL) {
|
||||||
message->provider_peer_head = libp2p_utils_linked_list_new();
|
message->provider_peer_head = libp2p_utils_linked_list_new();
|
||||||
message->provider_peer_head->item = peer;
|
message->provider_peer_head->item = libp2p_peer_copy(peer);
|
||||||
} else {
|
} else {
|
||||||
struct Libp2pLinkedList* current = message->provider_peer_head;
|
struct Libp2pLinkedList* current = message->provider_peer_head;
|
||||||
// find the last one in the list
|
// find the last one in the list
|
||||||
|
|
Loading…
Reference in a new issue