/* Delete accepted connection from list. * * return 0 on success * return -1 on failure */ static int del_accepted(TCP_Server *TCP_server, int index) { if ((uint32_t)index >= TCP_server->size_accepted_connections) return -1; if (TCP_server->accepted_connection_array[index].status == TCP_STATUS_NO_STATUS) return -1; if (!bs_list_remove(&TCP_server->accepted_key_list, TCP_server->accepted_connection_array[index].public_key, index)) return -1; memset(&TCP_server->accepted_connection_array[index], 0, sizeof(TCP_Secure_Connection)); --TCP_server->num_accepted_connections; if (TCP_server->num_accepted_connections == 0) realloc_connection(TCP_server, 0); return 0; }
/* Add accepted TCP connection to the list. * * return index on success * return -1 on failure */ static int add_accepted(TCP_Server *TCP_server, const TCP_Secure_Connection *con) { int index = get_TCP_connection_index(TCP_server, con->public_key); if (index != -1) { /* If an old connection to the same public key exists, kill it. */ kill_accepted(TCP_server, index); index = -1; } if (TCP_server->size_accepted_connections == TCP_server->num_accepted_connections) { if (realloc_connection(TCP_server, TCP_server->size_accepted_connections + 4) == -1) return -1; index = TCP_server->num_accepted_connections; } else { uint32_t i; for (i = TCP_server->size_accepted_connections; i != 0; --i) { if (TCP_server->accepted_connection_array[i - 1].status == TCP_STATUS_NO_STATUS) { index = i - 1; break; } } } if (index == -1) { fprintf(stderr, "FAIL index is -1\n"); return -1; } if (!bs_list_add(&TCP_server->accepted_key_list, con->public_key, index)) return -1; memcpy(&TCP_server->accepted_connection_array[index], con, sizeof(TCP_Secure_Connection)); TCP_server->accepted_connection_array[index].status = TCP_STATUS_CONFIRMED; ++TCP_server->num_accepted_connections; TCP_server->accepted_connection_array[index].identifier = ++TCP_server->counter; TCP_server->accepted_connection_array[index].last_pinged = unix_time(); TCP_server->accepted_connection_array[index].ping_id = 0; return index; }