summaryrefslogtreecommitdiff
path: root/toxcore/onion_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/onion_client.c')
-rw-r--r--toxcore/onion_client.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/toxcore/onion_client.c b/toxcore/onion_client.c
index 1c3b34da..9528a041 100644
--- a/toxcore/onion_client.c
+++ b/toxcore/onion_client.c
@@ -232,27 +232,35 @@ static int onion_add_path_node(Onion_Client *onion_c, IP_Port ip_port, const uin
232 */ 232 */
233uint16_t onion_backup_nodes(const Onion_Client *onion_c, Node_format *nodes, uint16_t max_num) 233uint16_t onion_backup_nodes(const Onion_Client *onion_c, Node_format *nodes, uint16_t max_num)
234{ 234{
235 unsigned int i;
236
237 if (!max_num) { 235 if (!max_num) {
238 return 0; 236 return 0;
239 } 237 }
240 238
241 unsigned int num_nodes = (onion_c->path_nodes_index < MAX_PATH_NODES) ? onion_c->path_nodes_index : MAX_PATH_NODES; 239 const uint16_t num_nodes = (onion_c->path_nodes_index < MAX_PATH_NODES) ? onion_c->path_nodes_index : MAX_PATH_NODES;
240 uint16_t i = 0;
242 241
243 if (num_nodes == 0) { 242 while (i < max_num && i < num_nodes) {
244 return 0; 243 nodes[i] = onion_c->path_nodes[(onion_c->path_nodes_index - (1 + i)) % num_nodes];
244 ++i;
245 } 245 }
246 246
247 if (num_nodes < max_num) { 247 for (uint16_t j = 0; i < max_num && j < MAX_PATH_NODES && j < onion_c->path_nodes_index_bs; ++j) {
248 max_num = num_nodes; 248 bool already_saved = false;
249 }
250 249
251 for (i = 0; i < max_num; ++i) { 250 for (uint16_t k = 0; k < num_nodes; ++k) {
252 nodes[i] = onion_c->path_nodes[(onion_c->path_nodes_index - (1 + i)) % num_nodes]; 251 if (public_key_cmp(nodes[k].public_key, onion_c->path_nodes_bs[j].public_key) == 0) {
252 already_saved = true;
253 break;
254 }
255 }
256
257 if (!already_saved) {
258 nodes[i] = onion_c->path_nodes_bs[j];
259 ++i;
260 }
253 } 261 }
254 262
255 return max_num; 263 return i;
256} 264}
257 265
258/* Put up to max_num random nodes in nodes. 266/* Put up to max_num random nodes in nodes.