/* * 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 /** * @file nodes.h * @brief Management of nodes. * @details These functions are used to manage the global list of nodes. */ /** * @brief Simple address structure providing IP/DNS and port information. */ struct NeoComm_address { char *address; ///< IP/DNS string. unsigned short port; ///< Port of address. }; /** * @brief Structure used for NeoComm nodes. */ struct NeoComm_node { /// The address of the node. struct NeoComm_address address; /// Whether or not it is a directory node/server. int directory; /// Number of connections a directory has. unsigned int connections; /// Maximum number of connections the directory can have. unsigned int max_connections; }; /** * @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 NeoComm_init_nodes(unsigned int max_nodes); /** * @brief Deinitialize all the nodes. */ void NeoComm_shutdown_nodes(); /** * @brief Enlarge the list. * * @param new_max_nodes New number of maximum 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 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 NeoComm_get_node_max(); /** * @brief Get the number of nodes there currently are. * * @return The number of nodes remembered. */ unsigned int NeoComm_get_node_count(); /** * @brief Add a new node where only address is given (all other variables * are set to 0). * * @param addr Address of the new node. * * @return If the list is full then it will return NULL, else it will return * a pointer to the new (or old, if already existing) node. */ struct NeoComm_node *NeoComm_add_node(struct NeoComm_address addr); /** * @brief Remove a node from the list. * * @param addr The address of the node. * * @return If the node was not found it returns 0, else it returns 1. */ int NeoComm_remove_node(struct NeoComm_address addr); /** * @brief Get a pointer to the node with a given address. * * @param addr The address of the node. * * @return A modifiable pointer to the node or NULL if not found. */ struct NeoComm_node *NeoComm_get_node(struct NeoComm_address addr);