c-libp2p/peer/peerstore.c

110 lines
2.8 KiB
C
Raw Normal View History

2017-02-20 23:53:20 +00:00
#include <stdlib.h>
#include <string.h>
#include "libp2p/peer/peerstore.h"
struct PeerEntry* libp2p_peer_entry_new() {
struct PeerEntry* out = (struct PeerEntry*)malloc(sizeof(struct PeerEntry));
if (out != NULL) {
out->peer = NULL;
}
return out;
}
void libp2p_peer_entry_free(struct PeerEntry* in) {
if (in != NULL) {
libp2p_peer_free(in->peer);
free(in);
}
}
struct PeerEntry* libp2p_peer_entry_copy(struct PeerEntry* in) {
struct PeerEntry* out = libp2p_peer_entry_new();
if (out != NULL) {
out->peer = libp2p_peer_copy(in->peer);
if (out->peer == NULL) {
free(out);
return NULL;
}
}
return out;
}
/**
* Creates a new empty peerstore
* @returns an empty peerstore or NULL on error
*/
struct Peerstore* libp2p_peerstore_new() {
struct Peerstore* out = (struct Peerstore*)malloc(sizeof(struct Peerstore));
if (out != NULL) {
out->head_entry = NULL;
}
return out;
}
/**
* Deallocate resources used by the peerstore
* @param in the struct to deallocate
* @returns true(1) on success, otherwise false(0)
*/
int libp2p_peerstore_free(struct Peerstore* in) {
if (in != NULL) {
struct Libp2pLinkedList* current = in->head_entry;
struct Libp2pLinkedList* next = NULL;
while (current != NULL) {
next = current->next;
libp2p_peer_entry_free((struct PeerEntry*)current->item);
current->item = NULL;
libp2p_utils_linked_list_free(current);
current = next;
}
free(in);
}
return 1;
}
/**
* Add a Peer to the Peerstore
* @param peerstore the peerstore to add the entry to
* @param peer_entry the entry to add
* @returns true(1) on success, otherwise false
*/
int libp2p_peerstore_add_peer_entry(struct Peerstore* peerstore, struct PeerEntry* peer_entry) {
struct Libp2pLinkedList* new_item = libp2p_utils_linked_list_new();
if (new_item == NULL)
return 0;
new_item->item = libp2p_peer_entry_copy(peer_entry);
if (new_item->item == NULL) {
libp2p_utils_linked_list_free(new_item);
return 0;
}
if (peerstore->head_entry == NULL) {
peerstore->head_entry = new_item;
peerstore->last_entry = new_item;
} else {
peerstore->last_entry->next = new_item;
peerstore->last_entry = new_item;
}
return 1;
}
/**
* Retrieve a peer from the peerstore based on the peer id
* @param peerstore the peerstore to search
* @param peer_id the id to search for as a binary array
* @param peer_id_size the size of the binary array
* @returns the PeerEntry struct if found, otherwise NULL
*/
struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, unsigned char* peer_id, size_t peer_id_size) {
struct Libp2pLinkedList* current = peerstore->head_entry;
while(current != NULL) {
struct Libp2pPeer* peer = ((struct PeerEntry*)current->item)->peer;
if (peer->id_size != peer_id_size)
continue;
if (memcmp(peer_id, peer->id, peer->id_size) == 0) {
return (struct PeerEntry*)current->item;
}
}
return NULL;
}