/* * 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 * . */ #include "nodes.h" #include "globals.h" #include #include int NeoComm_init_nodes(unsigned int max_nodes) { if(max_nodes == 0) return 1; 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.address = NULL; node_max = max_nodes; node_count = 0; return 1; } void NeoComm_shutdown_nodes() { if(!node_list) return; free(node_list); node_max = 0; node_count = 0; } int NeoComm_resize_node_list(unsigned int new_max_nodes) { if(new_max_nodes <= node_max) return 0; void* tmp_list = realloc(node_list, new_max_nodes * sizeof(struct node)); if(!tmp_list) return 0; node_list = tmp_list; return 1; } unsigned int NeoComm_get_node_max() { return node_max; } unsigned int NeoComm_get_node_count() { return node_count; } struct node *NeoComm_add_node(struct address addr) { if(node_count >= node_max) return NULL; for(unsigned int i = 0; i < node_max; ++i) { if(strcmp(node_list[i].address.address, addr.address) == 0 && node_list[i].address.port == addr.port) return &node_list[i]; } for(unsigned int i = 0; i < node_max; ++i) { if(!node_list[i].address.address) { node_list[i].address.address = addr.address; node_list[i].address.port = addr.port; node_list[i].directory = 0; node_list[i].connections = 0; node_list[i].max_connections = 0; node_count++; return &node_list[i]; } } return NULL; } int NeoComm_remove_node(struct address addr) { int removed = 0; for(unsigned int i = 0; i < node_max; ++i) { if(!removed && strcmp(node_list[i].address.address, addr.address) == 0 && node_list[i].address.port == addr.port) { node_list[i].address.address = NULL; node_count--; removed = 1; break; } } if(!removed) return 0; return 1; } struct node *NeoComm_get_node(struct address addr) { for(unsigned int i = 0; i < node_max; ++i) { if(strcmp(node_list[i].address.address, addr.address) == 0 && node_list[i].address.port == addr.port) { return &node_list[i]; } } return NULL; }