static int add_to_closest(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) return -1; unsigned int i; unsigned int index = DESIRED_CLOSE_CONNECTIONS; for (i = 0; i < DESIRED_CLOSE_CONNECTIONS; ++i) { if (g->closest_peers[i].entry == 0) { index = i; break; } } if (index == DESIRED_CLOSE_CONNECTIONS) { uint16_t comp_val = calculate_comp_value(g->real_pk, real_pk); uint16_t comp_d = 0; for (i = 0; i < DESIRED_CLOSE_CONNECTIONS; ++i) { uint16_t comp = calculate_comp_value(g->real_pk, g->closest_peers[i].real_pk); if (comp > comp_val && comp > comp_d) { index = i; comp_d = comp; } } } if (index == DESIRED_CLOSE_CONNECTIONS) { return -1; } g->closest_peers[index].entry = 1; memcpy(g->closest_peers[index].real_pk, real_pk, crypto_box_PUBLICKEYBYTES); memcpy(g->closest_peers[index].temp_pk, temp_pk, crypto_box_PUBLICKEYBYTES); g->changed = 1; return 0; }
static int add_to_closest(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) return -1; if (memcmp(g->real_pk, real_pk, crypto_box_PUBLICKEYBYTES) == 0) return -1; unsigned int i; unsigned int index = DESIRED_CLOSE_CONNECTIONS; for (i = 0; i < DESIRED_CLOSE_CONNECTIONS; ++i) { if (g->closest_peers[i].entry && memcmp(real_pk, g->closest_peers[i].real_pk, crypto_box_PUBLICKEYBYTES) == 0) { return 0; } } for (i = 0; i < DESIRED_CLOSE_CONNECTIONS; ++i) { if (g->closest_peers[i].entry == 0) { index = i; break; } } if (index == DESIRED_CLOSE_CONNECTIONS) { uint16_t comp_val = calculate_comp_value(g->real_pk, real_pk); uint16_t comp_d = 0; for (i = 0; i < (DESIRED_CLOSE_CONNECTIONS / 2); ++i) { uint16_t comp; comp = calculate_comp_value(g->real_pk, g->closest_peers[i].real_pk); if (comp > comp_val && comp > comp_d) { index = i; comp_d = comp; } } comp_val = calculate_comp_value(real_pk, g->real_pk); for (i = (DESIRED_CLOSE_CONNECTIONS / 2); i < DESIRED_CLOSE_CONNECTIONS; ++i) { uint16_t comp = calculate_comp_value(g->closest_peers[i].real_pk, g->real_pk); if (comp > comp_val && comp > comp_d) { index = i; comp_d = comp; } } } if (index == DESIRED_CLOSE_CONNECTIONS) { return -1; } uint8_t old_real_pk[crypto_box_PUBLICKEYBYTES]; uint8_t old_temp_pk[crypto_box_PUBLICKEYBYTES]; uint8_t old = 0; if (g->closest_peers[index].entry) { memcpy(old_real_pk, g->closest_peers[index].real_pk, crypto_box_PUBLICKEYBYTES); memcpy(old_temp_pk, g->closest_peers[index].temp_pk, crypto_box_PUBLICKEYBYTES); old = 1; } g->closest_peers[index].entry = 1; memcpy(g->closest_peers[index].real_pk, real_pk, crypto_box_PUBLICKEYBYTES); memcpy(g->closest_peers[index].temp_pk, temp_pk, crypto_box_PUBLICKEYBYTES); if (old) { add_to_closest(g_c, groupnumber, old_real_pk, old_temp_pk); } if (!g->changed) g->changed = GROUPCHAT_CLOSEST_ADDED; return 0; }