From da483c5ba4c17ffff88547b8e27907d6ec15701c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20A=2E=20Ortega?= Date: Sun, 2 Jul 2017 12:09:49 +0200 Subject: [PATCH] Added new interfaces. I also optimized the node list a bit so as not to use more processing power than necessary. --- include/neocomm.h | 22 +++++++++++++++++++++ include/nodes.h | 22 +++++++++++++++------ src/nodes.c | 49 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 include/neocomm.h diff --git a/include/neocomm.h b/include/neocomm.h new file mode 100644 index 0000000..2989a86 --- /dev/null +++ b/include/neocomm.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2017 Ortega Froysa, Nicolás + * Author: Ortega Froysa, Nicolás + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program. If not, see + * . + */ + +#pragma once + +#include "nodes.h" diff --git a/include/nodes.h b/include/nodes.h index cc1f67d..6c7f8ad 100644 --- a/include/nodes.h +++ b/include/nodes.h @@ -21,13 +21,15 @@ /** * @brief Initialize the node list. + * @details This function allocates memory and prepares the nodes list, you + * must run this before using any other node related functions. * * @param max_nodes Maximum number of nodes available. * * @return If the operation failed then it will return 0, else it will * return 1. */ -int init_nodes(unsigned int max_nodes); +int NeoComm_init_nodes(unsigned int max_nodes); /** * @brief Enlarge the list. @@ -37,21 +39,21 @@ int init_nodes(unsigned int max_nodes); * @return If the new size is less than or equal to the current size, or * the list failed to be reallocated, then it returns 0, else it returns 1. */ -int resize_node_list(unsigned int new_max_nodes); +int NeoComm_resize_node_list(unsigned int new_max_nodes); /** * @brief Get the maximum number of nodes that can be used. * * @return The maximum number of nodes that can be used.. */ -unsigned int get_node_max(); +unsigned int NeoComm_get_node_max(); /** * @brief Get the number of nodes there currently are. * * @return The number of nodes remembered. */ -unsigned int get_node_count(); +unsigned int NeoComm_get_node_count(); /** * @brief Add a new node to the list with an address (normally IP) and port. @@ -61,6 +63,14 @@ unsigned int get_node_count(); * * @return If the node list is full it will return 0, else 1. */ -int add_node(char *addr, unsigned short port); +int NeoComm_add_node(char *addr, unsigned short port); -int remove_node(char *addr, unsigned short port); +/** + * @brief Remove a node from the list. + * + * @param addr The address of the node. + * @param port The public port of the node. + * + * @return If the node was not found it returns 0, else it returns 1. + */ +int NeoComm_remove_node(char *addr, unsigned short port); diff --git a/src/nodes.c b/src/nodes.c index 3c92b30..7fde7e0 100644 --- a/src/nodes.c +++ b/src/nodes.c @@ -40,18 +40,21 @@ static unsigned int node_max; // Number of nodes in the list static unsigned int node_count; -int init_nodes(unsigned int max_nodes) { +int NeoComm_init_nodes(unsigned int max_nodes) { node_list = calloc(max_nodes, sizeof(struct node)); if(!node_list) return 0; + for(unsigned int i = 0; i < max_nodes; ++i) + node_list[i].address = NULL; + node_max = max_nodes; node_count = 0; return 1; } -int resize_node_list(unsigned int new_max_nodes) { +int NeoComm_resize_node_list(unsigned int new_max_nodes) { if(new_max_nodes <= node_max) return 0; @@ -64,15 +67,15 @@ int resize_node_list(unsigned int new_max_nodes) { return 1; } -unsigned int get_node_max() { +unsigned int NeoComm_get_node_max() { return node_max; } -unsigned int get_node_count() { +unsigned int NeoComm_get_node_count() { return node_count; } -int add_node(char *addr, unsigned short port) { +int NeoComm_add_node(char *addr, unsigned short port) { if(node_count >= node_max) return 0; for(unsigned int i = 0; i < node_count; ++i) @@ -81,13 +84,39 @@ int add_node(char *addr, unsigned short port) { node_list[i].port == port) return 1; } - node_list[node_count].address = addr; - node_list[node_count].port = port; - node_list[node_count].directory = 0; - node_list[node_count].connections = 0; - node_list[node_count].max_connections = 0; + + for(unsigned int i = 0; i < node_max; ++i) + { + if(!node_list[i].address) + { + node_list[i].address = addr; + node_list[i].port = port; + node_list[i].directory = 0; + node_list[i].connections = 0; + node_list[i].max_connections = 0; + break; + } + } node_count++; return 1; } + +int NeoComm_remove_node(char *addr, unsigned short port) { + int removed = 0; + for(unsigned int i = 0; i < node_count; ++i) + { + if(!removed && strcmp(node_list[i].address, addr) == 0 && + node_list[i].port == port) + { + node_list[i].address = NULL; + node_count--; + removed = 1; + break; + } + } + if(!removed) + return 0; + return 1; +}