Skip to content

Commit 16809dc

Browse files
committed
feat: Add dht_get_nodes_response event to the events system.
Should probably rename it to something starting with `debug_` and make it opt-in. Right now, it absolutely spams the events object.
1 parent e2c01e4 commit 16809dc

File tree

11 files changed

+291
-1
lines changed

11 files changed

+291
-1
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ set(toxcore_SOURCES
231231
toxcore/events/conference_peer_list_changed.c
232232
toxcore/events/conference_peer_name.c
233233
toxcore/events/conference_title.c
234+
toxcore/events/dht_get_nodes_response.c
234235
toxcore/events/events_alloc.c
235236
toxcore/events/events_alloc.h
236237
toxcore/events/file_chunk_request.c
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0b904988d79b9576bb88c6c7316d107b5a61bd6119a0992ebd7c1fa43db70abf /usr/local/bin/tox-bootstrapd
1+
0b58b866f87d92267db4577d26eebe10dcf5a96ff53ac5a863dade83f471961c /usr/local/bin/tox-bootstrapd

toxcore/Makefile.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ libtoxcore_la_SOURCES = ../third_party/cmp/cmp.c \
2121
../toxcore/events/conference_peer_list_changed.c \
2222
../toxcore/events/conference_peer_name.c \
2323
../toxcore/events/conference_title.c \
24+
../toxcore/events/dht_get_nodes_response.c \
2425
../toxcore/events/events_alloc.c \
2526
../toxcore/events/events_alloc.h \
2627
../toxcore/events/file_chunk_request.c \
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
/* SPDX-License-Identifier: GPL-3.0-or-later
2+
* Copyright © 2022 The TokTok team.
3+
*/
4+
5+
#include "events_alloc.h"
6+
7+
#include <assert.h>
8+
#include <string.h>
9+
10+
#include "../bin_pack.h"
11+
#include "../bin_unpack.h"
12+
#include "../ccompat.h"
13+
#include "../mem.h"
14+
#include "../tox.h"
15+
#include "../tox_events.h"
16+
#include "../tox_private.h"
17+
18+
19+
/*****************************************************
20+
*
21+
* :: struct and accessors
22+
*
23+
*****************************************************/
24+
25+
26+
struct Tox_Event_Dht_Get_Nodes_Response {
27+
uint8_t public_key[TOX_PUBLIC_KEY_SIZE];
28+
uint8_t *ip;
29+
uint32_t ip_length;
30+
uint16_t port;
31+
};
32+
33+
non_null()
34+
static bool tox_event_dht_get_nodes_response_set_public_key(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE])
35+
{
36+
memcpy(dht_get_nodes_response->public_key, public_key, TOX_PUBLIC_KEY_SIZE);
37+
return true;
38+
}
39+
const uint8_t *tox_event_dht_get_nodes_response_get_public_key(const Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response)
40+
{
41+
return dht_get_nodes_response->public_key;
42+
}
43+
44+
non_null()
45+
static bool tox_event_dht_get_nodes_response_set_ip(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response,
46+
const char *ip, uint32_t ip_length, const Memory *mem)
47+
{
48+
if (dht_get_nodes_response->ip != nullptr) {
49+
mem_delete(mem, dht_get_nodes_response->ip);
50+
dht_get_nodes_response->ip = nullptr;
51+
dht_get_nodes_response->ip_length = 0;
52+
}
53+
54+
uint8_t *ip_tmp = (uint8_t *)mem_balloc(mem, ip_length);
55+
56+
if (ip_tmp == nullptr) {
57+
return false;
58+
}
59+
60+
memcpy(ip_tmp, ip, ip_length);
61+
dht_get_nodes_response->ip = ip_tmp;
62+
dht_get_nodes_response->ip_length = ip_length;
63+
return true;
64+
}
65+
uint32_t tox_event_dht_get_nodes_response_get_ip_length(const Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response)
66+
{
67+
return dht_get_nodes_response->ip_length;
68+
}
69+
const uint8_t *tox_event_dht_get_nodes_response_get_ip(const Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response)
70+
{
71+
return dht_get_nodes_response->ip;
72+
}
73+
74+
non_null()
75+
static bool tox_event_dht_get_nodes_response_set_port(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response, uint16_t port)
76+
{
77+
dht_get_nodes_response->port = port;
78+
return true;
79+
}
80+
uint16_t tox_event_dht_get_nodes_response_get_port(const Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response)
81+
{
82+
return dht_get_nodes_response->port;
83+
}
84+
85+
non_null()
86+
static void tox_event_dht_get_nodes_response_construct(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response)
87+
{
88+
*dht_get_nodes_response = (Tox_Event_Dht_Get_Nodes_Response) {
89+
0
90+
};
91+
}
92+
non_null()
93+
static void tox_event_dht_get_nodes_response_destruct(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response, const Memory *mem)
94+
{
95+
mem_delete(mem, dht_get_nodes_response->ip);
96+
}
97+
98+
bool tox_event_dht_get_nodes_response_pack(
99+
const Tox_Event_Dht_Get_Nodes_Response *event, Bin_Pack *bp)
100+
{
101+
return bin_pack_array(bp, 3)
102+
&& bin_pack_bin(bp, event->public_key, TOX_PUBLIC_KEY_SIZE)
103+
&& bin_pack_bin(bp, event->ip, event->ip_length)
104+
&& bin_pack_u16(bp, event->port);
105+
}
106+
107+
non_null()
108+
static bool tox_event_dht_get_nodes_response_unpack_into(
109+
Tox_Event_Dht_Get_Nodes_Response *event, Bin_Unpack *bu)
110+
{
111+
if (!bin_unpack_array_fixed(bu, 3, nullptr)) {
112+
return false;
113+
}
114+
115+
return bin_unpack_bin_fixed(bu, event->public_key, TOX_PUBLIC_KEY_SIZE)
116+
&& bin_unpack_bin(bu, &event->ip, &event->ip_length)
117+
&& bin_unpack_u16(bu, &event->port);
118+
}
119+
120+
const Tox_Event_Dht_Get_Nodes_Response *tox_event_get_dht_get_nodes_response(
121+
const Tox_Event *event)
122+
{
123+
return event->type == TOX_EVENT_DHT_GET_NODES_RESPONSE ? event->data.dht_get_nodes_response : nullptr;
124+
}
125+
126+
Tox_Event_Dht_Get_Nodes_Response *tox_event_dht_get_nodes_response_new(const Memory *mem)
127+
{
128+
Tox_Event_Dht_Get_Nodes_Response *const dht_get_nodes_response =
129+
(Tox_Event_Dht_Get_Nodes_Response *)mem_alloc(mem, sizeof(Tox_Event_Dht_Get_Nodes_Response));
130+
131+
if (dht_get_nodes_response == nullptr) {
132+
return nullptr;
133+
}
134+
135+
tox_event_dht_get_nodes_response_construct(dht_get_nodes_response);
136+
return dht_get_nodes_response;
137+
}
138+
139+
void tox_event_dht_get_nodes_response_free(Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response, const Memory *mem)
140+
{
141+
if (dht_get_nodes_response != nullptr) {
142+
tox_event_dht_get_nodes_response_destruct(dht_get_nodes_response, mem);
143+
}
144+
mem_delete(mem, dht_get_nodes_response);
145+
}
146+
147+
non_null()
148+
static Tox_Event_Dht_Get_Nodes_Response *tox_events_add_dht_get_nodes_response(Tox_Events *events, const Memory *mem)
149+
{
150+
Tox_Event_Dht_Get_Nodes_Response *const dht_get_nodes_response = tox_event_dht_get_nodes_response_new(mem);
151+
152+
if (dht_get_nodes_response == nullptr) {
153+
return nullptr;
154+
}
155+
156+
Tox_Event event;
157+
event.type = TOX_EVENT_DHT_GET_NODES_RESPONSE;
158+
event.data.dht_get_nodes_response = dht_get_nodes_response;
159+
160+
tox_events_add(events, &event);
161+
return dht_get_nodes_response;
162+
}
163+
164+
bool tox_event_dht_get_nodes_response_unpack(
165+
Tox_Event_Dht_Get_Nodes_Response **event, Bin_Unpack *bu, const Memory *mem)
166+
{
167+
*event = tox_event_dht_get_nodes_response_new(mem);
168+
169+
if (*event == nullptr) {
170+
return false;
171+
}
172+
173+
return tox_event_dht_get_nodes_response_unpack_into(*event, bu);
174+
}
175+
176+
non_null()
177+
static Tox_Event_Dht_Get_Nodes_Response *tox_event_dht_get_nodes_response_alloc(void *user_data)
178+
{
179+
Tox_Events_State *state = tox_events_alloc(user_data);
180+
assert(state != nullptr);
181+
182+
if (state->events == nullptr) {
183+
return nullptr;
184+
}
185+
186+
Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response = tox_events_add_dht_get_nodes_response(state->events, state->mem);
187+
188+
if (dht_get_nodes_response == nullptr) {
189+
state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
190+
return nullptr;
191+
}
192+
193+
return dht_get_nodes_response;
194+
}
195+
196+
197+
/*****************************************************
198+
*
199+
* :: event handler
200+
*
201+
*****************************************************/
202+
203+
204+
void tox_events_handle_dht_get_nodes_response(
205+
Tox *tox, const uint8_t public_key[TOX_PUBLIC_KEY_SIZE],
206+
const char *ip, uint16_t port, void *user_data)
207+
{
208+
Tox_Event_Dht_Get_Nodes_Response *dht_get_nodes_response = tox_event_dht_get_nodes_response_alloc(user_data);
209+
210+
if (dht_get_nodes_response == nullptr) {
211+
return;
212+
}
213+
214+
const size_t ip_length = strlen(ip);
215+
if (ip_length >= UINT32_MAX) {
216+
return;
217+
}
218+
219+
const Tox_System *sys = tox_get_system(tox);
220+
221+
tox_event_dht_get_nodes_response_set_public_key(dht_get_nodes_response, public_key);
222+
tox_event_dht_get_nodes_response_set_ip(dht_get_nodes_response, ip, ip_length + 1, sys->mem);
223+
tox_event_dht_get_nodes_response_set_port(dht_get_nodes_response, port);
224+
}

toxcore/events/events_alloc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ tox_conference_message_cb tox_events_handle_conference_message;
3434
tox_conference_peer_list_changed_cb tox_events_handle_conference_peer_list_changed;
3535
tox_conference_peer_name_cb tox_events_handle_conference_peer_name;
3636
tox_conference_title_cb tox_events_handle_conference_title;
37+
tox_dht_get_nodes_response_cb tox_events_handle_dht_get_nodes_response;
3738
tox_file_chunk_request_cb tox_events_handle_file_chunk_request;
3839
tox_file_recv_cb tox_events_handle_file_recv;
3940
tox_file_recv_chunk_cb tox_events_handle_file_recv_chunk;

toxcore/tox_dispatch.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ struct Tox_Dispatch {
5252
tox_events_group_self_join_cb *group_self_join_callback;
5353
tox_events_group_join_fail_cb *group_join_fail_callback;
5454
tox_events_group_moderation_cb *group_moderation_callback;
55+
tox_events_dht_get_nodes_response_cb *dht_get_nodes_response_callback;
5556
};
5657

5758
Tox_Dispatch *tox_dispatch_new(Tox_Err_Dispatch_New *error)
@@ -277,6 +278,11 @@ void tox_events_callback_group_moderation(
277278
{
278279
dispatch->group_moderation_callback = callback;
279280
}
281+
void tox_events_callback_dht_get_nodes_response(
282+
Tox_Dispatch *dispatch, tox_events_dht_get_nodes_response_cb *callback)
283+
{
284+
dispatch->dht_get_nodes_response_callback = callback;
285+
}
280286

281287
non_null(1, 2) nullable(3, 4)
282288
static void tox_dispatch_invoke_event(const Tox_Dispatch *dispatch, const Tox_Event *event, Tox *tox, void *user_data)
@@ -594,6 +600,14 @@ static void tox_dispatch_invoke_event(const Tox_Dispatch *dispatch, const Tox_Ev
594600
break;
595601
}
596602

603+
case TOX_EVENT_DHT_GET_NODES_RESPONSE: {
604+
if (dispatch->dht_get_nodes_response_callback != nullptr) {
605+
dispatch->dht_get_nodes_response_callback(tox, event->data.dht_get_nodes_response, user_data);
606+
}
607+
608+
break;
609+
}
610+
597611
case TOX_EVENT_INVALID: {
598612
break;
599613
}

toxcore/tox_dispatch.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ typedef void tox_events_group_join_fail_cb(
129129
Tox *tox, const Tox_Event_Group_Join_Fail *event, void *user_data);
130130
typedef void tox_events_group_moderation_cb(
131131
Tox *tox, const Tox_Event_Group_Moderation *event, void *user_data);
132+
typedef void tox_events_dht_get_nodes_response_cb(
133+
Tox *tox, const Tox_Event_Dht_Get_Nodes_Response *event, void *user_data);
132134

133135
void tox_events_callback_conference_connected(
134136
Tox_Dispatch *dispatch, tox_events_conference_connected_cb *callback);
@@ -208,6 +210,8 @@ void tox_events_callback_group_join_fail(
208210
Tox_Dispatch *dispatch, tox_events_group_join_fail_cb *callback);
209211
void tox_events_callback_group_moderation(
210212
Tox_Dispatch *dispatch, tox_events_group_moderation_cb *callback);
213+
void tox_events_callback_dht_get_nodes_response(
214+
Tox_Dispatch *dispatch, tox_events_dht_get_nodes_response_cb *callback);
211215

212216
#ifdef __cplusplus
213217
}

toxcore/tox_event.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ const char *tox_event_type_to_string(Tox_Event_Type type)
132132
case TOX_EVENT_GROUP_MODERATION:
133133
return "TOX_EVENT_GROUP_MODERATION";
134134

135+
case TOX_EVENT_DHT_GET_NODES_RESPONSE:
136+
return "TOX_EVENT_DHT_GET_NODES_RESPONSE";
137+
135138
case TOX_EVENT_INVALID:
136139
return "TOX_EVENT_INVALID";
137140
}
@@ -346,6 +349,11 @@ bool tox_event_construct(Tox_Event *event, Tox_Event_Type type, const Memory *me
346349
break;
347350
}
348351

352+
case TOX_EVENT_DHT_GET_NODES_RESPONSE: {
353+
event->data.dht_get_nodes_response = tox_event_dht_get_nodes_response_new(mem);
354+
break;
355+
}
356+
349357
case TOX_EVENT_INVALID: {
350358
return false;
351359
}
@@ -556,6 +564,11 @@ void tox_event_destruct(Tox_Event *event, const Memory *mem)
556564
break;
557565
}
558566

567+
case TOX_EVENT_DHT_GET_NODES_RESPONSE: {
568+
tox_event_dht_get_nodes_response_free(event->data.dht_get_nodes_response, mem);
569+
break;
570+
}
571+
559572
case TOX_EVENT_INVALID: {
560573
break;
561574
}
@@ -691,6 +704,9 @@ static bool tox_event_data_pack(Tox_Event_Type type, const Tox_Event_Data *data,
691704
case TOX_EVENT_GROUP_MODERATION:
692705
return tox_event_group_moderation_pack(data->group_moderation, bp);
693706

707+
case TOX_EVENT_DHT_GET_NODES_RESPONSE:
708+
return tox_event_dht_get_nodes_response_pack(data->dht_get_nodes_response, bp);
709+
694710
case TOX_EVENT_INVALID:
695711
return false;
696712
}
@@ -906,6 +922,11 @@ static bool tox_event_type_from_int(uint32_t value, Tox_Event_Type *out)
906922
return true;
907923
}
908924

925+
case TOX_EVENT_DHT_GET_NODES_RESPONSE: {
926+
*out = TOX_EVENT_DHT_GET_NODES_RESPONSE;
927+
return true;
928+
}
929+
909930
case TOX_EVENT_INVALID: {
910931
*out = TOX_EVENT_INVALID;
911932
return true;
@@ -1062,6 +1083,9 @@ bool tox_event_unpack_into(Tox_Event *event, Bin_Unpack *bu, const Memory *mem)
10621083
case TOX_EVENT_GROUP_MODERATION:
10631084
return tox_event_group_moderation_unpack(&event->data.group_moderation, bu, mem);
10641085

1086+
case TOX_EVENT_DHT_GET_NODES_RESPONSE:
1087+
return tox_event_dht_get_nodes_response_unpack(&event->data.dht_get_nodes_response, bu, mem);
1088+
10651089
case TOX_EVENT_INVALID:
10661090
return false;
10671091
}

0 commit comments

Comments
 (0)