static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_Port dest, uint8_t *dest_pubkey, uint8_t *ping_id) { if (num > onion_c->num_friends) return -1; uint8_t sendback[ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; if (new_sendback(onion_c, 0, dest_pubkey, dest, sendback) == -1) return -1; uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0}; if (ping_id == NULL) ping_id = zero_ping_id; Node_format nodes[4]; if (random_path(onion_c, nodes) == -1) return -1; nodes[3].ip_port = dest; memcpy(nodes[3].client_id, dest_pubkey, crypto_box_PUBLICKEYBYTES); if (num == 0) { return send_announce_request(onion_c->dht, nodes, onion_c->dht->c->self_public_key, onion_c->dht->c->self_secret_key, ping_id, onion_c->dht->c->self_public_key, sendback); } else { return send_announce_request(onion_c->dht, nodes, onion_c->friends_list[num - 1].temp_public_key, onion_c->friends_list[num - 1].temp_secret_key, ping_id, onion_c->friends_list[num - 1].real_client_id, sendback); } }
void p2p_cron_announce(ITEM * ti) { ITEM *item = NULL; ITEM *t_new = NULL; int j = 0; TID *tid = list_value(ti); LOOKUP *l = tid->lookup; NODE_L *n = NULL; info(_log, NULL, "Start announcing after querying %lu nodes", list_size(l->list)); item = list_start(l->list); while (item != NULL && j < 8) { n = list_value(item); if (n->token_size != 0) { t_new = tdb_put(P2P_ANNOUNCE_ENGAGE); send_announce_request(&n->c_addr, tdb_tid(t_new), l->target, n->token, n->token_size); j++; } item = list_next(item); } }
static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_Port dest, uint8_t *dest_pubkey, uint8_t *ping_id, uint32_t pathnum) { if (num > onion_c->num_friends) return -1; uint64_t sendback; if (new_sendback(onion_c, num, dest_pubkey, dest, &sendback) == -1) return -1; uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0}; if (ping_id == NULL) ping_id = zero_ping_id; Onion_Path path; Node_format dest_node; dest_node.ip_port = dest; memcpy(dest_node.client_id, dest_pubkey, crypto_box_PUBLICKEYBYTES); if (num == 0) { if (random_path(onion_c->dht, &onion_c->onion_paths, pathnum, &path) == -1) return -1; return send_announce_request(onion_c->net, &path, dest_node, onion_c->c->self_public_key, onion_c->c->self_secret_key, ping_id, onion_c->c->self_public_key, onion_c->temp_public_key, sendback); } else { if (random_path(onion_c->dht, &onion_c->friends_list[num - 1].onion_paths, pathnum, &path) == -1) return -1; return send_announce_request(onion_c->net, &path, dest_node, onion_c->friends_list[num - 1].temp_public_key, onion_c->friends_list[num - 1].temp_secret_key, ping_id, onion_c->friends_list[num - 1].real_client_id, zero_ping_id, sendback); } }